diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..faf7d9089 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,26 @@ +--- +name: "☢️ Bug" +about: Create a report to help us improve +title: "☢️ bug: [Short description of the bug]" +labels: ["☢️ bug"] +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '...' +3. Scroll down to '...' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/chore.md b/.github/ISSUE_TEMPLATE/chore.md new file mode 100644 index 000000000..d498e5cb8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/chore.md @@ -0,0 +1,18 @@ +--- +name: "🧹 Chore" +about: Something you'd like to see done but not urgently +title: "🧹 chore: [Short description of the chore]" +labels: ["🧹 chore"] +--- + +**Please describe.** +A clear and concise description of what you'd like to see. Ex. We should [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..c460abd38 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,18 @@ +--- +name: "📝 Feature Request" +about: Suggest an idea for this project +title: "📝 feat: [Short description of the feature]" +labels: ["📝 feature"] +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index 2329a3cac..aacb559fd 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -8,12 +8,6 @@ on: - backend/** - config/** - .github/workflows/backend.yml - pull_request: - types: [opened] - paths: - - backend/** - - config/** - - .github/workflows/backend.yml concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/backend_codeql.yml b/.github/workflows/backend_codeql.yml index 65d6ff4d1..a40539efb 100644 --- a/.github/workflows/backend_codeql.yml +++ b/.github/workflows/backend_codeql.yml @@ -5,11 +5,6 @@ on: paths: - "backend/**" - ".github/workflows/backend_codeql.yml" - pull_request: - types: [opened] - paths: - - "backend/**" - - ".github/workflows/backend_codeql.yml" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index c7021a398..fa584ba5d 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -8,12 +8,6 @@ on: - cli/** - config/** - .github/workflows/cli.yml - pull_request: - types: [opened] - paths: - - cli/** - - config/** - - .github/workflows/cli.yml concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/cli_codeql.yml b/.github/workflows/cli_codeql.yml index a8c9851a8..cb09497e5 100644 --- a/.github/workflows/cli_codeql.yml +++ b/.github/workflows/cli_codeql.yml @@ -5,11 +5,6 @@ on: paths: - "cli/**" - ".github/workflows/cli_codeql.yml" - pull_request: - types: [opened] - paths: - - "cli/**" - - ".github/workflows/cli_codeql.yml" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/dashboard.yml b/.github/workflows/dashboard.yml index 3ffda6e45..2c13b7a0d 100644 --- a/.github/workflows/dashboard.yml +++ b/.github/workflows/dashboard.yml @@ -7,11 +7,6 @@ on: paths: - frontend/dashboard/** - .github/workflows/dashboard.yml - pull_request: - types: opened - paths: - - frontend/dashboard/** - - .github/workflows/dashboard.yml jobs: format: diff --git a/.github/workflows/dashboard_codeql.yml b/.github/workflows/dashboard_codeql.yml index 5ecfeaa0b..a5b966dbd 100644 --- a/.github/workflows/dashboard_codeql.yml +++ b/.github/workflows/dashboard_codeql.yml @@ -5,11 +5,6 @@ on: paths: - "frontend/dashboard/**" - ".github/workflows/dashboard_codeql.yml" - pull_request: - types: [opened] - paths: - - "frontend/dashboard/**" - - ".github/workflows/dashboard_codeql.yml" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/frontend_lib.yml b/.github/workflows/frontend_lib.yml index 75b35ba61..029ea34ae 100644 --- a/.github/workflows/frontend_lib.yml +++ b/.github/workflows/frontend_lib.yml @@ -7,11 +7,6 @@ on: paths: - frontend/lib/** - .github/workflows/frontend_lib.yml - pull_request: - types: opened - paths: - - frontend/lib/** - - .github/workflows/frontend_lib.yml jobs: format: @@ -74,3 +69,33 @@ jobs: run: | cd frontend/lib yarn test + release-check: + name: Release Check + runs-on: ubuntu-latest + steps: + - name: Checkout current branch + uses: actions/checkout@v3 + + - name: Get new version of package.json + id: get_new_version + run: | + echo "new_version=$(jq -r '.version' frontend/lib/package.json)" >> $GITHUB_OUTPUT + + - name: Checkout main + uses: actions/checkout@v3 + with: + ref: main + + - name: Get old version of package.json + id: get_old_version + run: | + echo "old_version=$(jq -r '.version' frontend/lib/package.json)" >> $GITHUB_OUTPUT + + - name: Compare versions + run: | + if [ "${{ steps.get_old_version.outputs.old_version }}" = "${{ steps.get_new_version.outputs.new_version }}" ]; then + echo "Old and new versions of package.json are identical, please bump the version number" + exit 1 + else + echo "New package version idenitied!" + fi diff --git a/.github/workflows/frontend_lib_codeql.yml b/.github/workflows/frontend_lib_codeql.yml index 1f2fc2395..b7b3cbdc9 100644 --- a/.github/workflows/frontend_lib_codeql.yml +++ b/.github/workflows/frontend_lib_codeql.yml @@ -5,11 +5,6 @@ on: paths: - "frontend/lib/**" - ".github/workflows/frontend_lib_codeql.yml" - pull_request: - types: [opened] - paths: - - "frontend/lib/**" - - ".github/workflows/frontend_lib_codeql.yml" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/frontend_lib_release.yml b/.github/workflows/frontend_lib_release.yml new file mode 100644 index 000000000..d79243cb9 --- /dev/null +++ b/.github/workflows/frontend_lib_release.yml @@ -0,0 +1,25 @@ +name: Frontend Lib Release + +on: + push: + branches: + - main + paths: + - "frontend/lib/**" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20.x' + registry-url: 'https://registry.npmjs.org' + scope: '@octocat' + - run: | + cd frontend/lib + yarn + yarn build + NODE_AUTH_TOKEN=${{ secrets.NPM_AUTH_TOKEN }} + yarn publish --access public \ No newline at end of file diff --git a/.github/workflows/mobile.yml b/.github/workflows/mobile.yml index e2a0822bd..39304c8e7 100644 --- a/.github/workflows/mobile.yml +++ b/.github/workflows/mobile.yml @@ -7,11 +7,6 @@ on: paths: - frontend/mobile/** - .github/workflows/mobile.yml - pull_request: - types: opened - paths: - - frontend/mobile/** - - .github/workflows/mobile.yml jobs: format: diff --git a/.github/workflows/mobile_codeql.yml b/.github/workflows/mobile_codeql.yml index a2c7c043b..eb437fdc7 100644 --- a/.github/workflows/mobile_codeql.yml +++ b/.github/workflows/mobile_codeql.yml @@ -5,11 +5,6 @@ on: paths: - "frontend/mobile/**" - ".github/workflows/mobile_codeql.yml" - pull_request: - types: [opened] - paths: - - "frontend/mobile/**" - - ".github/workflows/mobile_codeql.yml" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/mock_data.yml b/.github/workflows/mock_data.yml deleted file mode 100644 index 0f1732add..000000000 --- a/.github/workflows/mock_data.yml +++ /dev/null @@ -1,105 +0,0 @@ -name: Mock Data - -permissions: read-all - -on: - push: - paths: - - mock_data/** - - .github/workflows/mock_data.yml - pull_request: - types: [opened] - paths: - - mock_data/** - - .github/workflows/mock_data.yml - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - CARGO_TERM_COLOR: always - MANIFEST_PATH: ./mock_data/Cargo.toml - -jobs: - test: - name: Test - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - uses: actions-rs/cargo@v1 - with: - command: test - args: --manifest-path ${{ env.MANIFEST_PATH }} - fmt: - name: Format - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - run: rustup component add rustfmt - - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --manifest-path ${{ env.MANIFEST_PATH }} --all -- --check - - clippy: - name: Clippy - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - run: rustup component add clippy - - uses: actions-rs/cargo@v1 - with: - command: clippy - args: --manifest-path ${{ env.MANIFEST_PATH }} --all-targets --all-features -- -D warnings - - check: - name: Check - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - uses: Swatinem/rust-cache@v1 - with: - key: ${{ runner.os }}-check - - uses: actions-rs/cargo@v1 - with: - command: check - args: --manifest-path ${{ env.MANIFEST_PATH }} - env: - RUSTFLAGS: -D warnings - - coverage: - name: Code Coverage - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - - run: cargo install cargo-tarpaulin - - uses: actions-rs/cargo@v1 - with: - command: tarpaulin - args: --manifest-path ${{ env.MANIFEST_PATH }} --verbose --workspace diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 90f5a49d0..81b216117 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -7,11 +7,6 @@ on: paths: - frontend/web/** - .github/workflows/web.yml - pull_request: - types: opened - paths: - - frontend/web/** - - .github/workflows/web.yml jobs: format: diff --git a/.github/workflows/web_codeql.yml b/.github/workflows/web_codeql.yml index 24e3dc933..54e5f298a 100644 --- a/.github/workflows/web_codeql.yml +++ b/.github/workflows/web_codeql.yml @@ -5,11 +5,6 @@ on: paths: - "frontend/web/**" - ".github/workflows/web_codeql.yml" - pull_request: - types: [opened] - paths: - - "frontend/web/**" - - ".github/workflows/web_codeql.yml" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/README.md b/README.md index bbb531416..d8ca72bba 100644 --- a/README.md +++ b/README.md @@ -1,75 +1,5 @@

sac

-
- -
- - Backend Go Report - - - Backend Workflow Status - - - - Backend CodeQL Workflow Status - - -
- - - CLI Go Report - - - CLI Workflow Status - - - - CLI CodeQL Workflow Status - - -
- - - Mobile Workflow Status - - - - Mobile CodeQL Workflow Status - - -
- - - Web Workflow Status - - - - Web CodeQL Workflow Status - - -
- - - Dashboard Workflow Status - - - - Dashboard CodeQL Workflow Status - -
- ## Repo Activity ![Repo Activity](https://repobeats.axiom.co/api/embed/0c57b86b156d377fcc75a6e482bf921acc8c550b.svg "Repobeats Analytics Image") diff --git a/backend/auth/jwt.go b/backend/auth/jwt.go index ffb415034..c0c52a7c7 100644 --- a/backend/auth/jwt.go +++ b/backend/auth/jwt.go @@ -6,7 +6,8 @@ import ( "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/errors" + + "github.com/GenerateNU/sac/backend/utilities" m "github.com/garrettladley/mattress" "github.com/gofiber/fiber/v2" "github.com/golang-jwt/jwt" @@ -19,15 +20,15 @@ type CustomClaims struct { // From extracts the CustomClaims from the fiber context // Returns nil if the claims are not present -func From(c *fiber.Ctx) (*CustomClaims, *errors.Error) { +func From(c *fiber.Ctx) (*CustomClaims, error) { rawClaims := c.Locals("claims") if rawClaims == nil { - return nil, &errors.Forbidden + return nil, utilities.Forbidden() } claims, ok := rawClaims.(*CustomClaims) if !ok { - return nil, &errors.FailedToCastToCustomClaims + return nil, fmt.Errorf("claims are not of type CustomClaims. got: %T", rawClaims) } return claims, nil @@ -51,12 +52,12 @@ type Claims struct { } type JWTClientInterface interface { - GenerateTokenPair(accessClaims, refreshClaims Claims) (*Token, *errors.Error) - GenerateToken(claims Claims, tokenType JWTType) ([]byte, *errors.Error) - RefreshToken(token, refreshToken string, tokenType JWTType, newClaims jwt.MapClaims) ([]byte, *errors.Error) - ExtractClaims(tokenString string, tokenType JWTType) (jwt.MapClaims, *errors.Error) - ParseToken(tokenString string, tokenType JWTType) (*jwt.Token, *errors.Error) - IsTokenValid(tokenString string, tokenType JWTType) (bool, *errors.Error) + GenerateTokenPair(accessClaims, refreshClaims Claims) (*Token, error) + GenerateToken(claims Claims, tokenType JWTType) ([]byte, error) + RefreshToken(token, refreshToken string, tokenType JWTType, newClaims jwt.MapClaims) ([]byte, error) + ExtractClaims(tokenString string, tokenType JWTType) (jwt.MapClaims, error) + ParseToken(tokenString string, tokenType JWTType) (*jwt.Token, error) + IsTokenValid(tokenString string, tokenType JWTType) (bool, error) } type JWTClient struct { @@ -77,7 +78,7 @@ func NewJWTClient(authSettings config.AuthSettings, signingMethod jwt.SigningMet } } -func (j *JWTClient) GenerateTokenPair(accessClaims, refreshClaims Claims) (*Token, *errors.Error) { +func (j *JWTClient) GenerateTokenPair(accessClaims, refreshClaims Claims) (*Token, error) { accessToken, err := j.GenerateToken(accessClaims, AccessToken) if err != nil { return nil, err @@ -96,7 +97,7 @@ func (j *JWTClient) GenerateTokenPair(accessClaims, refreshClaims Claims) (*Toke // GenerateToken generates a token with the claims passed in. // It returns the token if successful, otherwise it returns an error. -func (j *JWTClient) GenerateToken(claims Claims, tokenType JWTType) ([]byte, *errors.Error) { +func (j *JWTClient) GenerateToken(claims Claims, tokenType JWTType) ([]byte, error) { // create a new map to store the combined claims combinedClaims := make(jwt.MapClaims) @@ -126,9 +127,9 @@ func (j *JWTClient) GenerateToken(claims Claims, tokenType JWTType) ([]byte, *er // create a new token with the combined claims token := jwt.NewWithClaims(j.SigningMethod, combinedClaims) - signedToken, signErr := token.SignedString([]byte(secretKey)) - if signErr != nil { - return nil, &errors.FailedToSignToken + signedToken, err := token.SignedString([]byte(secretKey)) + if err != nil { + return nil, fmt.Errorf("failed to sign token: %w", err) } return []byte(signedToken), nil @@ -136,7 +137,7 @@ func (j *JWTClient) GenerateToken(claims Claims, tokenType JWTType) ([]byte, *er // ParseToken parses the token string and returns the token if successful, otherwise it returns an error. // It uses the secret key for the token type to parse the token. -func (j *JWTClient) ParseToken(tokenString string, tokenType JWTType) (*jwt.Token, *errors.Error) { +func (j *JWTClient) ParseToken(tokenString string, tokenType JWTType) (*jwt.Token, error) { secretKey, err := j.getSecretKey(tokenType) if err != nil { return nil, err @@ -146,7 +147,7 @@ func (j *JWTClient) ParseToken(tokenString string, tokenType JWTType) (*jwt.Toke return []byte(secretKey), nil }) if parseErr != nil { - return nil, &errors.FailedToParseToken + return nil, fmt.Errorf("failed to parse token: %w", parseErr) } return token, nil @@ -154,7 +155,7 @@ func (j *JWTClient) ParseToken(tokenString string, tokenType JWTType) (*jwt.Toke // ExtractClaims extracts the claims from the token. // It returns the claims if successful, otherwise it returns an error. -func (j *JWTClient) ExtractClaims(tokenString string, tokenType JWTType) (jwt.MapClaims, *errors.Error) { +func (j *JWTClient) ExtractClaims(tokenString string, tokenType JWTType) (jwt.MapClaims, error) { token, err := j.ParseToken(tokenString, tokenType) if err != nil { return nil, err @@ -162,7 +163,7 @@ func (j *JWTClient) ExtractClaims(tokenString string, tokenType JWTType) (jwt.Ma claims, ok := token.Claims.(jwt.MapClaims) if !ok { - return nil, err + return nil, fmt.Errorf("failed to extract claims from token. got: %T", token.Claims) } return claims, nil @@ -170,7 +171,7 @@ func (j *JWTClient) ExtractClaims(tokenString string, tokenType JWTType) (jwt.Ma // IsTokenValid checks if the token is valid. // It returns true if the token is valid, otherwise it returns false. -func (j *JWTClient) IsTokenValid(tokenString string, tokenType JWTType) (bool, *errors.Error) { +func (j *JWTClient) IsTokenValid(tokenString string, tokenType JWTType) (bool, error) { token, err := j.ParseToken(tokenString, tokenType) if err != nil { return false, err @@ -183,7 +184,7 @@ func (j *JWTClient) IsTokenValid(tokenString string, tokenType JWTType) (bool, * // It checks if the refresh token is valid and extracts the claims from the access token. // It then updates the issued at and expires at claims and gives the new claims priority over the old claims. // It returns the new access token if successful, otherwise it returns an error. -func (j *JWTClient) RefreshToken(token, refreshToken string, tokenType JWTType, newClaims jwt.MapClaims) ([]byte, *errors.Error) { +func (j *JWTClient) RefreshToken(token, refreshToken string, tokenType JWTType, newClaims jwt.MapClaims) ([]byte, error) { ok, err := j.IsTokenValid(refreshToken, RefreshToken) if err != nil || !ok { return nil, err @@ -208,7 +209,7 @@ func (j *JWTClient) RefreshToken(token, refreshToken string, tokenType JWTType, // getSecretKey returns the secret key for the token type. // If the token type is not present in the client, it returns an error. -func (j *JWTClient) getSecretKey(tokenType JWTType) (string, *errors.Error) { +func (j *JWTClient) getSecretKey(tokenType JWTType) (string, error) { switch tokenType { case AccessToken: return j.AccessKey.Expose(), nil @@ -216,7 +217,7 @@ func (j *JWTClient) getSecretKey(tokenType JWTType) (string, *errors.Error) { return j.RefreshKey.Expose(), nil } - return "", &errors.InvalidTokenType + return "", utilities.BadRequest(fmt.Errorf("invalid token type: %s", tokenType)) } // getExpiry returns the expiry time for the token type. @@ -300,7 +301,7 @@ func GenerateRefreshCookie(value string) *fiber.Cookie { } } -func SetResponseTokens(c *fiber.Ctx, tokens *Token) *errors.Error { +func SetResponseTokens(c *fiber.Ctx, tokens *Token) error { // Set the tokens in the response // should also blacklist the old refresh and access tokens diff --git a/backend/auth/password.go b/backend/auth/password.go index d2c90ca04..724e63563 100644 --- a/backend/auth/password.go +++ b/backend/auth/password.go @@ -1,24 +1,31 @@ package auth import ( + "errors" + "fmt" "regexp" "strings" "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/errors" ) -func ValidatePassword(password string) *errors.Error { +func ValidatePassword(password string) error { + var errs []string + if len(password) < 8 { - return &errors.InvalidPasswordNotLongEnough + errs = append(errs, "must be at least 8 characters long") } if !hasDigit(password) { - return &errors.InvalidPasswordNoDigit + errs = append(errs, "must contain at least one digit") } if !hasSpecialChar(password) { - return &errors.InvalidPasswordNoSpecialCharacter + errs = append(errs, fmt.Sprintf("must contain at least one special character from: [%v]", string(constants.SPECIAL_CHARACTERS))) + } + + if len(errs) > 0 { + return errors.New(strings.Join(errs, ", ")) } return nil diff --git a/backend/config/calendar.go b/backend/config/calendar.go new file mode 100644 index 000000000..f131b056c --- /dev/null +++ b/backend/config/calendar.go @@ -0,0 +1,24 @@ +package config + +import ( + "time" +) + +type CalendarSettings struct { + MaxTerminationDate time.Time +} + +type intermediateCalendarSettings struct { + MaxTerminationDate string `yaml:"maxterminationdate"` +} + +func (int *intermediateCalendarSettings) into() (*CalendarSettings, error) { + t, err := time.Parse("01-02-2006", int.MaxTerminationDate) + if err != nil { + return nil, err + } + + return &CalendarSettings{ + MaxTerminationDate: t, + }, nil +} diff --git a/backend/config/config.go b/backend/config/config.go index d8814e787..ff19ecb23 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -8,14 +8,15 @@ import ( ) type Settings struct { - Application ApplicationSettings - Database DatabaseSettings - SuperUser SuperUserSettings - Auth AuthSettings - AWS AWSSettings - PineconeSettings PineconeSettings - OpenAISettings OpenAISettings - ResendSettings ResendSettings + Application ApplicationSettings + Database DatabaseSettings + SuperUser SuperUserSettings + Auth AuthSettings + AWS AWSSettings + Pinecone PineconeSettings + OpenAI OpenAISettings + Resend ResendSettings + Calendar CalendarSettings } type intermediateSettings struct { @@ -23,6 +24,7 @@ type intermediateSettings struct { Database intermediateDatabaseSettings `yaml:"database"` SuperUser intermediateSuperUserSettings `yaml:"superuser"` Auth intermediateAuthSettings `yaml:"authsecret"` + Calendar intermediateCalendarSettings `yaml:"calendar"` } func (int *intermediateSettings) into() (*Settings, error) { @@ -41,11 +43,17 @@ func (int *intermediateSettings) into() (*Settings, error) { return nil, err } + calendarSettings, err := int.Calendar.into() + if err != nil { + return nil, err + } + return &Settings{ Application: int.Application, Database: *databaseSettings, SuperUser: *superUserSettings, Auth: *authSettings, + Calendar: *calendarSettings, }, nil } diff --git a/backend/config/local.go b/backend/config/local.go index 301c4306a..864140f4f 100644 --- a/backend/config/local.go +++ b/backend/config/local.go @@ -42,14 +42,14 @@ func readLocal(v *viper.Viper, path string, useDevDotEnv bool) (*Settings, error return nil, fmt.Errorf("failed to read Pinecone settings: %w", err) } - settings.PineconeSettings = *pineconeSettings + settings.Pinecone = *pineconeSettings openAISettings, err := readOpenAISettings() if err != nil { return nil, fmt.Errorf("failed to read OpenAI settings: %w", err) } - settings.OpenAISettings = *openAISettings + settings.OpenAI = *openAISettings awsSettings, err := readAWSSettings() if err != nil { @@ -63,7 +63,7 @@ func readLocal(v *viper.Viper, path string, useDevDotEnv bool) (*Settings, error return nil, fmt.Errorf("failed to read Resend settings: %w", err) } - settings.ResendSettings = *resendSettings + settings.Resend = *resendSettings return settings, nil } diff --git a/backend/config/production.go b/backend/config/production.go index 9e441ce69..43e10f0f4 100644 --- a/backend/config/production.go +++ b/backend/config/production.go @@ -14,6 +14,7 @@ import ( type ProductionSettings struct { Database ProductionDatabaseSettings `yaml:"database"` Application ProductionApplicationSettings `yaml:"application"` + Calendar CalendarSettings `yaml:"calendar"` } type ProductionDatabaseSettings struct { @@ -118,9 +119,10 @@ func readProd(v *viper.Viper) (*Settings, error) { AccessKey: authAccessKey, RefreshKey: authRefreshKey, }, - PineconeSettings: *pineconeSettings, - OpenAISettings: *openAISettings, - AWS: *awsSettings, - ResendSettings: *resendSettings, + Pinecone: *pineconeSettings, + OpenAI: *openAISettings, + AWS: *awsSettings, + Resend: *resendSettings, + Calendar: prodSettings.Calendar, }, nil } diff --git a/backend/constants/email.go b/backend/constants/email.go index b3958861c..7b999344a 100644 --- a/backend/constants/email.go +++ b/backend/constants/email.go @@ -1,3 +1,7 @@ package constants -const DOMAIN string = "@generatesac.davidoduneye.com" +const ( + DOMAIN string = "@generatesac.davidoduneye.com" + ONBOARDING_EMAIL string = "onboarding" + DOMAIN + DEFAULT_FROM_EMAIL string = "no-reply" + DOMAIN +) diff --git a/backend/constants/pagination.go b/backend/constants/pagination.go deleted file mode 100644 index 1601b5908..000000000 --- a/backend/constants/pagination.go +++ /dev/null @@ -1,13 +0,0 @@ -package constants - -import "strconv" - -const ( - DEFAULT_LIMIT int = 10 - DEFAULT_PAGE int = 1 -) - -var ( - DEFAULT_LIMIT_STRING string = strconv.Itoa(DEFAULT_LIMIT) - DEFAULT_PAGE_STRING string = strconv.Itoa(DEFAULT_PAGE) -) diff --git a/backend/database/db.go b/backend/database/db.go index 7038ee44f..c2652aefa 100644 --- a/backend/database/db.go +++ b/backend/database/db.go @@ -1,7 +1,7 @@ package database import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/constants" @@ -37,6 +37,7 @@ func EstablishConn(dsn string, opts ...OptionalFunc) (*gorm.DB, error) { rootConfig := gorm.Config{ SkipDefaultTransaction: true, TranslateError: true, + PrepareStmt: true, } for _, opt := range opts { @@ -67,7 +68,7 @@ func CreateSuperUserIfNotExists(settings config.Settings, db *gorm.DB) error { var superUser models.User if err := db.Where("role = ?", models.Super).First(&superUser).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { + if errors.Is(err, gorm.ErrRecordNotFound) { if err := createSuperUser(settings, db); err != nil { return err } @@ -81,6 +82,11 @@ func CreateSuperUserIfNotExists(settings config.Settings, db *gorm.DB) error { func createSuperUser(settings config.Settings, db *gorm.DB) error { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() if err := tx.Error; err != nil { return err @@ -143,5 +149,5 @@ func createSuperUser(settings config.Settings, db *gorm.DB) error { return tx.Commit().Error } - return nil + return tx.Commit().Error } diff --git a/backend/database/super.go b/backend/database/super.go index 938f31b2e..403f79ff6 100644 --- a/backend/database/super.go +++ b/backend/database/super.go @@ -1,19 +1,20 @@ package database import ( + "fmt" + "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/google/uuid" ) var SuperUserUUID uuid.UUID -func SuperUser(superUserSettings config.SuperUserSettings) (*models.User, *errors.Error) { +func SuperUser(superUserSettings config.SuperUserSettings) (*models.User, error) { passwordHash, err := auth.ComputeHash(superUserSettings.Password.Expose()) if err != nil { - return nil, &errors.FailedToComputePasswordHash + return nil, fmt.Errorf("failed to hash super user password: %w", err) } return &models.User{ diff --git a/backend/docs/docs.go b/backend/docs/docs.go index f893581fd..38a673141 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -49,21 +49,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -89,7 +83,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.LoginUserResponseBody" + "$ref": "#/definitions/auth.LoginResponseBody" } } ], @@ -102,21 +96,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -173,27 +161,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -221,21 +201,62 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/register": { + "post": { + "description": "Registers a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Registers a user", + "operationId": "register-user", + "parameters": [ + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateUserRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.User" } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} } } } @@ -274,21 +295,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -314,7 +329,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.VerifyEmailRequestBody" + "$ref": "#/definitions/base.VerifyEmailRequestBody" } } ], @@ -327,21 +342,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -372,7 +381,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.VerifyPasswordResetTokenRequestBody" + "$ref": "#/definitions/base.VerifyPasswordResetTokenRequestBody" } } ], @@ -385,21 +394,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -479,7 +482,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" + "$ref": "#/definitions/categories.CategoryRequestBody" } } ], @@ -649,7 +652,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" + "$ref": "#/definitions/categories.CategoryRequestBody" } } ], @@ -731,21 +734,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -786,21 +783,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -842,15 +833,11 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -874,7 +861,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateClubRequestBody" + "$ref": "#/definitions/base.CreateClubRequestBody" } } ], @@ -887,27 +874,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -941,21 +920,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -987,27 +960,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1038,7 +1003,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateClubRequestBody" + "$ref": "#/definitions/base.UpdateClubRequestBody" } } ], @@ -1051,27 +1016,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1108,21 +1065,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1153,7 +1104,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.PutContactRequestBody" + "$ref": "#/definitions/contacts.PutContactRequestBody" } } ], @@ -1166,27 +1117,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1235,21 +1178,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1298,21 +1235,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1361,27 +1292,124 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a new member associated with a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-member" + ], + "summary": "Create a new member for a club", + "operationId": "create-member-for-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.User" } }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, "500": { "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a member associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-member" + ], + "summary": "Delete a member from a club", + "operationId": "delete-member-from-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.User" } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} } } } @@ -1418,27 +1446,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1482,27 +1502,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1538,21 +1550,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1594,27 +1600,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1651,21 +1649,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1706,21 +1698,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1757,21 +1743,15 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1802,7 +1782,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateClubTagsRequestBody" + "$ref": "#/definitions/tags.CreateClubTagsRequestBody" } } ], @@ -1818,27 +1798,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1879,27 +1851,19 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -2097,45 +2061,135 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/": { + "get": { + "description": "Retrieves an event", + "produces": [ + "application/json" + ], + "tags": [ + "event" + ], + "summary": "Retrieve an event", + "operationId": "get-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.Event" } }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, "500": { "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/files/": { + "get": { + "description": "Retrieves all files", + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "Retrieve all files", + "operationId": "get-files", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "array", + "items": { + "$ref": "#/definitions/models.File" + } } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} } } }, "post": { - "description": "Creates an event", + "description": "Creates a file", "consumes": [ - "application/json" + "multipart/form-data" ], "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Create an event", - "operationId": "create-event", + "summary": "Create a file", + "operationId": "create-file", "parameters": [ { - "description": "Event Body", - "name": "event", + "description": "File", + "name": "file", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateEventRequestBody" + "$ref": "#/definitions/base.CreateFileRequestBody" } } ], @@ -2143,52 +2197,44 @@ const docTemplate = `{ "201": { "description": "Created", "schema": { - "$ref": "#/definitions/models.Event" + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/": { + "/files/:fileID": { "get": { - "description": "Retrieves an event", + "description": "Retrieves a file", "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Retrieve an event", - "operationId": "get-event", + "summary": "Retrieve a file", + "operationId": "get-file", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "File ID", + "name": "fileID", "in": "path", "required": true } @@ -2197,100 +2243,95 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Event" + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, "delete": { - "description": "Deletes an event", + "description": "Deletes a file", "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Delete an event", - "operationId": "delete-event", + "summary": "Delete a file", + "operationId": "delete-file", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "File ID", + "name": "fileID", "in": "path", "required": true } ], "responses": { - "204": { - "description": "No Content", + "201": { + "description": "Created", "schema": { - "type": "string" + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/hosts": { + "/pocs/": { "get": { - "description": "Retrieves all hosts associated with an event", + "description": "Retrieves all point of contacts", "produces": [ "application/json" ], "tags": [ - "event" + "point of contact" ], - "summary": "Retrieve all hosts by event", - "operationId": "get-hosts-by-event", + "summary": "Retrieve all point of contacts", + "operationId": "get-point-of-contacts", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { @@ -2299,47 +2340,47 @@ const docTemplate = `{ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.Club" + "$ref": "#/definitions/models.PointOfContact" } } }, "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "404": { "description": "Not Found", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } } } } }, - "/events/{eventID}/series/": { + "/pocs/{pocID}/": { "get": { - "description": "Retrieves all series associated with an event", + "description": "Retrieves a point of contact by id", "produces": [ "application/json" ], "tags": [ - "event" + "point of contact" ], - "summary": "Retrieve all series by event", - "operationId": "get-series-by-event", + "summary": "Retrieves a point of contact", + "operationId": "get-point-of-contact", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "Point of Contact ID", + "name": "pocID", "in": "path", "required": true } @@ -2348,86 +2389,83 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Series" - } + "$ref": "#/definitions/models.PointOfContact" } }, "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "404": { "description": "Not Found", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } } } - }, - "delete": { - "description": "Deletes all series associated with an event", + } + }, + "/tags": { + "get": { + "description": "Retrieves all tags", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Delete all series by event", - "operationId": "delete-series-by-event", + "summary": "Retrieve all tags", + "operationId": "get-all-tags", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { - "204": { - "description": "No Content", + "200": { + "description": "OK", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - }, - "patch": { - "description": "Creates a series", + } + }, + "/tags/": { + "post": { + "description": "Creates a tag", "consumes": [ "application/json" ], @@ -2435,25 +2473,18 @@ const docTemplate = `{ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Create a series", - "operationId": "create-series", + "summary": "Create a tag", + "operationId": "create-tag", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "description": "Series Body", - "name": "seriesBody", + "description": "Tag Body", + "name": "tagBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateEventRequestBody" + "$ref": "#/definitions/base.CreateTagRequestBody" } } ], @@ -2461,59 +2492,44 @@ const docTemplate = `{ "201": { "description": "Created", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.Tag" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/series/{seriesID}/": { + "/tags/{tagID}/": { "get": { - "description": "Retrieves a series by ID", + "description": "Retrieves a tag", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Retrieve a series by ID", - "operationId": "get-series-by-id", + "summary": "Retrieve a tag", + "operationId": "get-tag", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", + "description": "Tag ID", + "name": "tagID", "in": "path", "required": true } @@ -2522,51 +2538,38 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.Tag" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, "delete": { - "description": "Deletes a series by ID", + "description": "Deletes a tag", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Delete a series by ID", - "operationId": "delete-series-by-id", + "summary": "Delete a tag", + "operationId": "delete-tag", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", + "description": "Tag ID", + "name": "tagID", "in": "path", "required": true } @@ -2580,32 +2583,24 @@ const docTemplate = `{ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, "patch": { - "description": "Updates a series by event ID", + "description": "Updates a tag", "consumes": [ "application/json" ], @@ -2613,25 +2608,25 @@ const docTemplate = `{ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Update a series by event ID", - "operationId": "update-series-by-event-id", + "summary": "Update a tag", + "operationId": "update-tag", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "Tag ID", + "name": "tagID", "in": "path", "required": true }, { - "description": "Series Body", - "name": "seriesBody", + "description": "Tag", + "name": "tag", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateSeriesRequestBody" + "$ref": "#/definitions/base.UpdateTagRequestBody" } } ], @@ -2639,54 +2634,51 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.Tag" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/tags": { + "/users/": { "get": { - "description": "Retrieves all tags associated with an event", + "description": "Retrieves all users", "produces": [ "application/json" ], "tags": [ - "event" + "user" ], - "summary": "Retrieve all tags by event", - "operationId": "get-tags-by-event", + "summary": "Retrieve all users", + "operationId": "get-users", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { @@ -2695,383 +2687,340 @@ const docTemplate = `{ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.Tag" + "$ref": "#/definitions/models.User" } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "401": { + "description": "Unauthorized", + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/files/": { + "/users/{userID}/": { "get": { - "description": "Retrieves all files", + "description": "Retrieves a user", "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Retrieve all files", - "operationId": "get-files", + "summary": "Retrieve a user", + "operationId": "get-user", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { "200": { "description": "OK", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.File" - } + "$ref": "#/definitions/models.User" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, - "post": { - "description": "Creates a file", - "consumes": [ - "multipart/form-data" - ], + "delete": { + "description": "Deletes a user", "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Create a file", - "operationId": "create-file", + "summary": "Delete a user", + "operationId": "delete-user", "parameters": [ { - "description": "File", - "name": "file", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateFileRequestBody" - } + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content", "schema": { - "$ref": "#/definitions/models.File" + "type": "string" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - } - }, - "/files/:fileID": { - "get": { - "description": "Retrieves a file", + }, + "patch": { + "description": "Updates a user", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Retrieve a file", - "operationId": "get-file", + "summary": "Update a user", + "operationId": "update-user", "parameters": [ { "type": "string", - "description": "File ID", - "name": "fileID", + "description": "User ID", + "name": "userID", "in": "path", "required": true + }, + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.UpdateUserRequestBody" + } } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.File" + "$ref": "#/definitions/models.User" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - }, - "delete": { - "description": "Deletes a file", + } + }, + "/users/{userID}/follower/": { + "get": { + "description": "Retrieves all clubs a user is following", "produces": [ "application/json" ], "tags": [ - "file" + "user-follower" ], - "summary": "Delete a file", - "operationId": "delete-file", + "summary": "Retrieve all clubs a user is following", + "operationId": "get-following", "parameters": [ { "type": "string", - "description": "File ID", - "name": "fileID", + "description": "User ID", + "name": "userID", "in": "path", "required": true } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/models.File" + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/pocs/": { - "get": { - "description": "Retrieves all point of contacts", + "/users/{userID}/follower/{clubID}/": { + "post": { + "description": "Follow a club", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "point of contact" + "user-follower" ], - "summary": "Retrieve all point of contacts", - "operationId": "get-point-of-contacts", + "summary": "Follow a club", + "operationId": "create-following", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true }, { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true } ], "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.PointOfContact" - } + "$ref": "#/definitions/utilities.SuccessResponse" } }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "type": "string" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "type": "string" - } + "schema": {} } } - } - }, - "/pocs/{pocID}/": { - "get": { - "description": "Retrieves a point of contact by id", + }, + "delete": { + "description": "Unfollow a club", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "point of contact" + "user-follower" ], - "summary": "Retrieves a point of contact", - "operationId": "get-point-of-contact", + "summary": "Unfollow a club", + "operationId": "delete-following", "parameters": [ { "type": "string", - "description": "Point of Contact ID", - "name": "pocID", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Club ID", + "name": "clubID", "in": "path", "required": true } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content", "schema": { - "$ref": "#/definitions/models.PointOfContact" + "$ref": "#/definitions/utilities.SuccessResponse" } }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "type": "string" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "type": "string" - } + "schema": {} } } } }, - "/tags": { + "/users/{userID}/member/": { "get": { - "description": "Retrieves all tags", + "description": "Retrieves all clubs a user is a member of", "produces": [ "application/json" ], "tags": [ - "tag" + "user-member" ], - "summary": "Retrieve all tags", - "operationId": "get-all-tags", + "summary": "Retrieve all clubs a user is a member of", + "operationId": "get-membership", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { @@ -3080,34 +3029,32 @@ const docTemplate = `{ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.Tag" + "$ref": "#/definitions/models.Club" } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/tags/": { - "post": { - "description": "Creates a tag", + "/users/{userID}/password": { + "patch": { + "description": "Updates a user's password", "consumes": [ "application/json" ], @@ -3115,71 +3062,70 @@ const docTemplate = `{ "application/json" ], "tags": [ - "tag" + "user" ], - "summary": "Create a tag", - "operationId": "create-tag", + "summary": "Update a user's password", + "operationId": "update-password", "parameters": [ { - "description": "Tag Body", - "name": "tagBody", + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "Password Body", + "name": "passwordBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateTagRequestBody" + "$ref": "#/definitions/auth.UpdatePasswordRequestBody" } } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/models.Tag" + "type": "string" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/tags/{tagID}/": { + "/users/{userID}/tags/": { "get": { - "description": "Retrieves a tag", + "description": "Retrieves all tags associated with a user", "produces": [ "application/json" ], "tags": [ - "tag" + "user-tag" ], - "summary": "Retrieve a tag", - "operationId": "get-tag", + "summary": "Retrieve all tags for a user", + "operationId": "get-tags-by-user", "parameters": [ { "type": "string", - "description": "Tag ID", - "name": "tagID", + "description": "User ID", + "name": "userID", "in": "path", "required": true } @@ -3188,83 +3134,32 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Tag" + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "delete": { - "description": "Deletes a tag", - "produces": [ - "application/json" - ], - "tags": [ - "tag" - ], - "summary": "Delete a tag", - "operationId": "delete-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, - "patch": { - "description": "Updates a tag", + "post": { + "description": "Creates tags for a user", "consumes": [ "application/json" ], @@ -3272,119 +3167,58 @@ const docTemplate = `{ "application/json" ], "tags": [ - "tag" + "user-tag" ], - "summary": "Update a tag", - "operationId": "update-tag", + "summary": "Create user tags", + "operationId": "create-user-tags", "parameters": [ { "type": "string", - "description": "Tag ID", - "name": "tagID", + "description": "User ID", + "name": "userID", "in": "path", "required": true }, { - "description": "Tag", - "name": "tag", + "description": "User Tags Body", + "name": "userTagsBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateTagRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/tags.CreateUserTagsBody" } } - } - } - }, - "/users/": { - "get": { - "description": "Retrieves all users", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Retrieve all users", - "operationId": "get-users", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } ], "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.User" + "$ref": "#/definitions/models.Tag" } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, - "post": { - "description": "Creates a user", + "delete": { + "description": "Creates tags for a user", "consumes": [ "application/json" ], @@ -3392,72 +3226,10 @@ const docTemplate = `{ "application/json" ], "tags": [ - "user" - ], - "summary": "Create a user", - "operationId": "create-user", - "parameters": [ - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateUserRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "409": { - "description": "Conflict", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - } - }, - "/users/{userID}/": { - "get": { - "description": "Retrieves a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" + "user-tag" ], - "summary": "Retrieve a user", - "operationId": "get-user", + "summary": "Create user tags", + "operationId": "create-user-tags", "parameters": [ { "type": "string", @@ -3468,1254 +3240,801 @@ const docTemplate = `{ } ], "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } + "201": { + "description": "Created" }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - }, - "delete": { - "description": "Deletes a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Delete a user", - "operationId": "delete-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + } + } + }, + "definitions": { + "auth.LoginResponseBody": { + "type": "object", + "required": [ + "email", + "password" + ], + "properties": { + "email": { + "type": "string" + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 } - }, - "patch": { - "description": "Updates a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Update a user", - "operationId": "update-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateUserRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + } + }, + "auth.UpdatePasswordRequestBody": { + "type": "object", + "required": [ + "new_password", + "old_password" + ], + "properties": { + "new_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + }, + "old_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/follower/": { - "get": { - "description": "Retrieves all clubs a user is following", - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Retrieve all clubs a user is following", - "operationId": "get-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" + "base.CreateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "description", + "is_recruiting", + "name", + "preview", + "recruitment_cycle", + "recruitment_type", + "user_id" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" } - } + ] + }, + "user_id": { + "type": "string" + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 } } }, - "/users/{userID}/follower/{clubID}/": { - "post": { - "description": "Follow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Follow a club", - "operationId": "create-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "delete": { - "description": "Unfollow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Unfollow a club", - "operationId": "delete-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + "base.CreateFileRequestBody": { + "type": "object", + "required": [ + "owner_id", + "owner_type" + ], + "properties": { + "owner_id": { + "type": "string" + }, + "owner_type": { + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/member/": { - "get": { - "description": "Retrieves all clubs a user is a member of", - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Retrieve all clubs a user is a member of", - "operationId": "get-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + "base.CreateTagRequestBody": { + "type": "object", + "required": [ + "category_id", + "name" + ], + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/member/{clubID}/": { - "post": { - "description": "Join a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Join a club", - "operationId": "create-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" + "base.CreateUserRequestBody": { + "type": "object", + "required": [ + "email", + "first_name", + "last_name", + "password" + ], + "properties": { + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "email": { + "type": "string", + "maxLength": 255 + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": [ + "december", + "may" + ], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" } - } - } - }, - "delete": { - "description": "Leave a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Leave a club", - "operationId": "delete-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "graduation_year": { + "type": "integer" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "description": "Optional fields", + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "major1": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" } - } - } - } - }, - "/users/{userID}/password": { - "patch": { - "description": "Updates a user's password", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Update a user's password", - "operationId": "update-password", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "Password Body", - "name": "passwordBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdatePasswordRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" } - } + ] + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a user", - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Retrieve all tags for a user", - "operationId": "get-tags-by-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } + "base.UpdateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "recruitment_cycle", + "recruitment_type" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "post": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Tags Body", - "name": "userTagsBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/tag.CreateUserTagsBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "delete": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - } - } - }, - "definitions": { - "errors.Error": { - "type": "object", - "properties": { - "message": { - "type": "string" + ] }, - "statusCode": { - "type": "integer" + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 } } }, - "models.Category": { + "base.UpdateTagRequestBody": { "type": "object", - "required": [ - "name" - ], "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 + "category_id": { + "type": "string" }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.CategoryRequestBody": { - "type": "object", - "required": [ - "name" - ], - "properties": { "name": { "type": "string", "maxLength": 255 } } }, - "models.Club": { + "base.UpdateUserRequestBody": { "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "num_members", - "preview", - "recruitment_cycle", - "recruitment_type" - ], "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "num_members": { - "type": "integer", - "minimum": 1 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, + "college": { "enum": [ - "fall", - "spring", - "fallSpring", - "always" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ], "allOf": [ { - "$ref": "#/definitions/models.RecruitmentCycle" + "$ref": "#/definitions/models.College" } ] }, - "recruitment_type": { + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { "maxLength": 255, "enum": [ - "unrestricted", - "tryout", - "application" + "december", + "may" ], "allOf": [ { - "$ref": "#/definitions/models.RecruitmentType" + "$ref": "#/definitions/models.GraduationCycle" } ] }, - "updated_at": { + "graduation_year": { + "type": "integer" + }, + "last_name": { "type": "string", - "example": "2023-09-20T16:34:50Z" + "maxLength": 255 }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.College": { - "type": "string", - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "x-enum-comments": { - "BCHS": "Bouvé College of Health Sciences", - "CAMD": "College of Arts, Media and Design", - "CE": "College of Engineering", - "CPS": "College of Professional Studies", - "CS": "College of Science", - "CSSH": "College of Social Sciences and Humanities", - "DMSB": "D'Amore-McKim School of Business", - "KCCS": "Khoury College of Computer Sciences", - "SL": "School of Law" - }, - "x-enum-varnames": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ] - }, - "models.Contact": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "type": { + "major0": { "maxLength": 255, "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" ], "allOf": [ { - "$ref": "#/definitions/models.ContactType" + "$ref": "#/definitions/models.Major" } ] }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.ContactType": { - "type": "string", - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "x-enum-varnames": [ - "Facebook", - "Instagram", - "X", - "LinkedIn", - "YouTube", - "GitHub", - "Slack", - "Discord", - "Email", - "CustomSite" - ] - }, - "models.CreateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "preview", - "recruitment_cycle", - "recruitment_type", - "user_id" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "user_id": { - "type": "string" - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.CreateClubTagsRequestBody": { - "type": "object", - "required": [ - "tags" - ], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "models.CreateEventRequestBody": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "host", - "is_recurring", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "description": "TODO club/tag/notification logic", - "type": "string" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "series": { - "description": "TODO validate if isRecurring, then series is required", - "allOf": [ - { - "$ref": "#/definitions/models.CreateSeriesRequestBody" - } - ] - }, - "start_time": { - "type": "string" - } - } - }, - "models.CreateFileRequestBody": { - "type": "object", - "required": [ - "owner_id", - "owner_type" - ], - "properties": { - "owner_id": { - "type": "string" - }, - "owner_type": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateSeriesRequestBody": { - "type": "object", - "required": [ - "max_occurrences", - "recurring_type" - ], - "properties": { - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "models.CreateTagRequestBody": { - "type": "object", - "required": [ - "category_id", - "name" - ], - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateUserRequestBody": { - "type": "object", - "required": [ - "email", - "first_name", - "last_name", - "password" - ], - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "description": "Optional fields", + "major1": { "maxLength": 255, "enum": [ "africanaStudies", @@ -4825,7 +4144,7 @@ const docTemplate = `{ } ] }, - "major1": { + "major2": { "maxLength": 255, "enum": [ "africanaStudies", @@ -4934,241 +4253,212 @@ const docTemplate = `{ "$ref": "#/definitions/models.Major" } ] + } + } + }, + "base.VerifyEmailRequestBody": { + "type": "object", + "required": [ + "email", + "token" + ], + "properties": { + "email": { + "type": "string" }, - "major2": { + "token": { + "type": "string" + } + } + }, + "base.VerifyPasswordResetTokenRequestBody": { + "type": "object", + "required": [ + "new_password", + "token", + "verify_new_password" + ], + "properties": { + "new_password": { + "type": "string", + "minLength": 8 + }, + "token": { + "type": "string" + }, + "verify_new_password": { + "type": "string", + "minLength": 8 + } + } + }, + "categories.CategoryRequestBody": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "contacts.PutContactRequestBody": { + "type": "object", + "required": [ + "content", + "type" + ], + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "type": { "maxLength": 255, "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" ], "allOf": [ { - "$ref": "#/definitions/models.Major" + "$ref": "#/definitions/models.ContactType" } ] - }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 } } }, - "models.Event": { + "models.Category": { "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "location", - "name", - "preview", - "start_time" - ], "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, "created_at": { "type": "string", "example": "2023-09-20T16:34:50Z" }, - "end_time": { + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { "type": "string" }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.Club": { + "type": "object", + "properties": { + "application_link": { + "type": "string" }, - "host": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "description": { "type": "string" }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, - "is_recurring": { + "is_recruiting": { "type": "boolean" }, - "location": { - "type": "string", - "maxLength": 255 - }, - "meeting_link": { + "logo": { "type": "string" }, "name": { - "type": "string", - "maxLength": 255 + "type": "string" }, - "preview": { - "type": "string", - "maxLength": 255 + "num_members": { + "type": "integer" }, - "start_time": { + "one_word_to_describe_us": { + "type": "string" + }, + "preview": { "type": "string" }, + "recruitment_cycle": { + "$ref": "#/definitions/models.RecruitmentCycle" + }, + "recruitment_type": { + "$ref": "#/definitions/models.RecruitmentType" + }, "updated_at": { "type": "string", "example": "2023-09-20T16:34:50Z" + }, + "weekly_time_commitment": { + "type": "integer" } } }, - "models.EventType": { + "models.College": { "type": "string", "enum": [ - "open", - "membersOnly" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ], + "x-enum-comments": { + "BCHS": "Bouvé College of Health Sciences", + "CAMD": "College of Arts, Media and Design", + "CE": "College of Engineering", + "CPS": "College of Professional Studies", + "CS": "College of Science", + "CSSH": "College of Social Sciences and Humanities", + "DMSB": "D'Amore-McKim School of Business", + "KCCS": "Khoury College of Computer Sciences", + "SL": "School of Law" + }, "x-enum-varnames": [ - "Open", - "MembersOnly" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ] }, - "models.File": { + "models.Contact": { "type": "object", - "required": [ - "file_name", - "file_size", - "file_type", - "file_url", - "object_key" - ], "properties": { + "content": { + "type": "string" + }, "created_at": { "type": "string", "example": "2023-09-20T16:34:50Z" }, - "file_name": { - "type": "string", - "maxLength": 255 - }, - "file_size": { - "type": "integer", - "minimum": 1 - }, - "file_type": { - "type": "string", - "maxLength": 255 - }, - "file_url": { - "type": "string", - "maxLength": 255 - }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, - "object_key": { - "type": "string", - "maxLength": 255 + "type": { + "$ref": "#/definitions/models.ContactType" }, "updated_at": { "type": "string", @@ -5176,34 +4466,150 @@ const docTemplate = `{ } } }, - "models.GraduationCycle": { + "models.ContactType": { "type": "string", "enum": [ - "december", - "may" + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" ], "x-enum-varnames": [ - "December", - "May" + "Facebook", + "Instagram", + "X", + "LinkedIn", + "YouTube", + "GitHub", + "Slack", + "Discord", + "Email", + "CustomSite" ] }, - "models.LoginUserResponseBody": { + "models.Event": { "type": "object", - "required": [ - "email", - "password" + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "description": { + "type": "string" + }, + "end_time": { + "type": "string" + }, + "event_type": { + "description": "geoshi", + "allOf": [ + { + "$ref": "#/definitions/models.EventType" + } + ] + }, + "host": { + "type": "string" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_archived": { + "type": "boolean" + }, + "is_draft": { + "type": "boolean" + }, + "is_public": { + "description": "internal housekeeping states", + "type": "boolean" + }, + "link": { + "type": "string" + }, + "location": { + "type": "string" + }, + "name": { + "description": "details", + "type": "string" + }, + "preview": { + "type": "string" + }, + "start_time": { + "description": "timing", + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.EventType": { + "type": "string", + "enum": [ + "hybrid", + "in_person", + "virtual" ], + "x-enum-varnames": [ + "Hybrid", + "InPerson", + "Virtual" + ] + }, + "models.File": { + "type": "object", "properties": { - "email": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "file_name": { "type": "string" }, - "password": { - "description": "MARK: must be validated manually", + "file_size": { + "type": "integer" + }, + "file_type": { + "type": "string" + }, + "file_url": { + "type": "string" + }, + "id": { "type": "string", - "maxLength": 255 + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "object_key": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" } } }, + "models.GraduationCycle": { + "type": "string", + "enum": [ + "december", + "may" + ], + "x-enum-varnames": [ + "December", + "May" + ] + }, "models.Major": { "type": "string", "enum": [ @@ -5393,1135 +4799,46 @@ const docTemplate = `{ "MediaAndScreenStudies", "MediaArts", "Music", - "MusicTechnology", - "Nursing", - "PharmaceuticalSciences", - "PharmacyPharmD", - "Philosophy", - "Physics", - "PoliticalScience", - "PoliticsPhilosophyEconomics", - "Psychology", - "PublicHealth", - "PublicRelations", - "ReligiousStudies", - "Sociology", - "Spanish", - "SpeechLanguagePathologyAndAudiology", - "Theatre" - ] - }, - "models.PointOfContact": { - "type": "object", - "required": [ - "email", - "name", - "position" - ], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "photo_file": { - "$ref": "#/definitions/models.File" - }, - "position": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.PutContactRequestBody": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "type": { - "maxLength": 255, - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "allOf": [ - { - "$ref": "#/definitions/models.ContactType" - } - ] - } - } - }, - "models.RecruitmentCycle": { - "type": "string", - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "x-enum-varnames": [ - "Fall", - "Spring", - "FallSpring", - "Always" - ] - }, - "models.RecruitmentType": { - "type": "string", - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "x-enum-varnames": [ - "Unrestricted", - "Tryout", - "Application" - ] - }, - "models.RecurringType": { - "type": "string", - "enum": [ - "daily", - "weekly", - "monthly" - ], - "x-enum-varnames": [ - "Daily", - "Weekly", - "Monthly" - ] - }, - "models.Series": { - "type": "object", - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "events": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "max_occurrences": { - "type": "integer", - "minimum": 1 - }, - "recurring_type": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.Tag": { - "type": "object", - "required": [ - "category_id", - "name" - ], - "properties": { - "category_id": { - "type": "string" - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.UpdateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "recruitment_cycle", - "recruitment_type" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.UpdateEventRequestBody": { - "type": "object", - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "type": "string" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "start_time": { - "type": "string" - } - } - }, - "models.UpdatePasswordRequestBody": { - "type": "object", - "required": [ - "new_password", - "old_password" - ], - "properties": { - "new_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - }, - "old_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateSeriesRequestBody": { - "type": "object", - "properties": { - "event_details": { - "$ref": "#/definitions/models.UpdateEventRequestBody" - }, - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "models.UpdateTagRequestBody": { - "type": "object", - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateUserRequestBody": { - "type": "object", - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - } - } - }, - "models.User": { - "type": "object", - "required": [ - "college", - "email", - "first_name", - "graduation_cycle", - "graduation_year", - "last_name", - "major0", - "role" - ], - "properties": { - "college": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_verified": { - "type": "boolean" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] + "MusicTechnology", + "Nursing", + "PharmaceuticalSciences", + "PharmacyPharmD", + "Philosophy", + "Physics", + "PoliticalScience", + "PoliticsPhilosophyEconomics", + "Psychology", + "PublicHealth", + "PublicRelations", + "ReligiousStudies", + "Sociology", + "Spanish", + "SpeechLanguagePathologyAndAudiology", + "Theatre" + ] + }, + "models.PointOfContact": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] + "email": { + "type": "string" }, - "role": { + "id": { "type": "string", - "enum": [ - "super", - "student" - ] + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string" + }, + "photo_file": { + "$ref": "#/definitions/models.File" + }, + "position": { + "type": "string" }, "updated_at": { "type": "string", @@ -6529,43 +4846,122 @@ const docTemplate = `{ } } }, - "models.VerifyEmailRequestBody": { - "type": "object", - "required": [ - "email", - "token" + "models.RecruitmentCycle": { + "type": "string", + "enum": [ + "fall", + "spring", + "fallSpring", + "always" ], + "x-enum-varnames": [ + "Fall", + "Spring", + "FallSpring", + "Always" + ] + }, + "models.RecruitmentType": { + "type": "string", + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "x-enum-varnames": [ + "Unrestricted", + "Tryout", + "Application" + ] + }, + "models.Tag": { + "type": "object", "properties": { - "email": { + "category_id": { "type": "string" }, - "token": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" } } }, - "models.VerifyPasswordResetTokenRequestBody": { + "models.User": { "type": "object", - "required": [ - "new_password", - "token", - "verify_new_password" - ], "properties": { - "new_password": { + "college": { + "$ref": "#/definitions/models.College" + }, + "created_at": { "type": "string", - "minLength": 8 + "example": "2023-09-20T16:34:50Z" }, - "token": { + "email": { "type": "string" }, - "verify_new_password": { + "first_name": { + "type": "string" + }, + "graduation_cycle": { + "$ref": "#/definitions/models.GraduationCycle" + }, + "graduation_year": { + "type": "integer" + }, + "id": { "type": "string", - "minLength": 8 + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_verified": { + "type": "boolean" + }, + "last_name": { + "type": "string" + }, + "major0": { + "$ref": "#/definitions/models.Major" + }, + "major1": { + "$ref": "#/definitions/models.Major" + }, + "major2": { + "$ref": "#/definitions/models.Major" + }, + "role": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "tags.CreateClubTagsRequestBody": { + "type": "object", + "required": [ + "tags" + ], + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } } } }, - "tag.CreateUserTagsBody": { + "tags.CreateUserTagsBody": { "type": "object", "required": [ "tags" diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index 2e2633237..bbfe208db 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -38,21 +38,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -78,7 +72,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.LoginUserResponseBody" + "$ref": "#/definitions/auth.LoginResponseBody" } } ], @@ -91,21 +85,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -162,27 +150,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -210,21 +190,62 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/register": { + "post": { + "description": "Registers a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Registers a user", + "operationId": "register-user", + "parameters": [ + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateUserRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.User" } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} } } } @@ -263,21 +284,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -303,7 +318,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.VerifyEmailRequestBody" + "$ref": "#/definitions/base.VerifyEmailRequestBody" } } ], @@ -316,21 +331,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -361,7 +370,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.VerifyPasswordResetTokenRequestBody" + "$ref": "#/definitions/base.VerifyPasswordResetTokenRequestBody" } } ], @@ -374,21 +383,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "429": { "description": "Too Many Requests", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -468,7 +471,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" + "$ref": "#/definitions/categories.CategoryRequestBody" } } ], @@ -638,7 +641,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" + "$ref": "#/definitions/categories.CategoryRequestBody" } } ], @@ -720,21 +723,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -775,21 +772,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -831,15 +822,11 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -863,7 +850,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateClubRequestBody" + "$ref": "#/definitions/base.CreateClubRequestBody" } } ], @@ -876,27 +863,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -930,21 +909,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -976,27 +949,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1027,7 +992,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateClubRequestBody" + "$ref": "#/definitions/base.UpdateClubRequestBody" } } ], @@ -1040,27 +1005,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1097,21 +1054,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1142,7 +1093,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.PutContactRequestBody" + "$ref": "#/definitions/contacts.PutContactRequestBody" } } ], @@ -1155,27 +1106,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1224,21 +1167,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1287,21 +1224,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1350,27 +1281,124 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a new member associated with a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-member" + ], + "summary": "Create a new member for a club", + "operationId": "create-member-for-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.User" } }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, "500": { "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a member associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-member" + ], + "summary": "Delete a member from a club", + "operationId": "delete-member-from-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.User" } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} } } } @@ -1407,27 +1435,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1471,27 +1491,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1527,21 +1539,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1583,27 +1589,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1640,21 +1638,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1695,21 +1687,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1746,21 +1732,15 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, @@ -1791,7 +1771,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateClubTagsRequestBody" + "$ref": "#/definitions/tags.CreateClubTagsRequestBody" } } ], @@ -1807,27 +1787,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -1868,27 +1840,19 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } @@ -2086,45 +2050,135 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/": { + "get": { + "description": "Retrieves an event", + "produces": [ + "application/json" + ], + "tags": [ + "event" + ], + "summary": "Retrieve an event", + "operationId": "get-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/models.Event" } }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, "500": { "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/files/": { + "get": { + "description": "Retrieves all files", + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "Retrieve all files", + "operationId": "get-files", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "array", + "items": { + "$ref": "#/definitions/models.File" + } } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} } } }, "post": { - "description": "Creates an event", + "description": "Creates a file", "consumes": [ - "application/json" + "multipart/form-data" ], "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Create an event", - "operationId": "create-event", + "summary": "Create a file", + "operationId": "create-file", "parameters": [ { - "description": "Event Body", - "name": "event", + "description": "File", + "name": "file", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateEventRequestBody" + "$ref": "#/definitions/base.CreateFileRequestBody" } } ], @@ -2132,52 +2186,44 @@ "201": { "description": "Created", "schema": { - "$ref": "#/definitions/models.Event" + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/": { + "/files/:fileID": { "get": { - "description": "Retrieves an event", + "description": "Retrieves a file", "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Retrieve an event", - "operationId": "get-event", + "summary": "Retrieve a file", + "operationId": "get-file", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "File ID", + "name": "fileID", "in": "path", "required": true } @@ -2186,100 +2232,95 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Event" + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, "delete": { - "description": "Deletes an event", + "description": "Deletes a file", "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Delete an event", - "operationId": "delete-event", + "summary": "Delete a file", + "operationId": "delete-file", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "File ID", + "name": "fileID", "in": "path", "required": true } ], "responses": { - "204": { - "description": "No Content", + "201": { + "description": "Created", "schema": { - "type": "string" + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/hosts": { + "/pocs/": { "get": { - "description": "Retrieves all hosts associated with an event", + "description": "Retrieves all point of contacts", "produces": [ "application/json" ], "tags": [ - "event" + "point of contact" ], - "summary": "Retrieve all hosts by event", - "operationId": "get-hosts-by-event", + "summary": "Retrieve all point of contacts", + "operationId": "get-point-of-contacts", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { @@ -2288,47 +2329,47 @@ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.Club" + "$ref": "#/definitions/models.PointOfContact" } } }, "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "404": { "description": "Not Found", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } } } } }, - "/events/{eventID}/series/": { + "/pocs/{pocID}/": { "get": { - "description": "Retrieves all series associated with an event", + "description": "Retrieves a point of contact by id", "produces": [ "application/json" ], "tags": [ - "event" + "point of contact" ], - "summary": "Retrieve all series by event", - "operationId": "get-series-by-event", + "summary": "Retrieves a point of contact", + "operationId": "get-point-of-contact", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "Point of Contact ID", + "name": "pocID", "in": "path", "required": true } @@ -2337,86 +2378,83 @@ "200": { "description": "OK", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Series" - } + "$ref": "#/definitions/models.PointOfContact" } }, "400": { "description": "Bad Request", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "404": { "description": "Not Found", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } }, "500": { "description": "Internal Server Error", "schema": { - "$ref": "#/definitions/errors.Error" + "type": "string" } } } - }, - "delete": { - "description": "Deletes all series associated with an event", + } + }, + "/tags": { + "get": { + "description": "Retrieves all tags", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Delete all series by event", - "operationId": "delete-series-by-event", + "summary": "Retrieve all tags", + "operationId": "get-all-tags", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { - "204": { - "description": "No Content", + "200": { + "description": "OK", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - }, - "patch": { - "description": "Creates a series", + } + }, + "/tags/": { + "post": { + "description": "Creates a tag", "consumes": [ "application/json" ], @@ -2424,25 +2462,18 @@ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Create a series", - "operationId": "create-series", + "summary": "Create a tag", + "operationId": "create-tag", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "description": "Series Body", - "name": "seriesBody", + "description": "Tag Body", + "name": "tagBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateEventRequestBody" + "$ref": "#/definitions/base.CreateTagRequestBody" } } ], @@ -2450,59 +2481,44 @@ "201": { "description": "Created", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.Tag" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/series/{seriesID}/": { + "/tags/{tagID}/": { "get": { - "description": "Retrieves a series by ID", + "description": "Retrieves a tag", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Retrieve a series by ID", - "operationId": "get-series-by-id", + "summary": "Retrieve a tag", + "operationId": "get-tag", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", + "description": "Tag ID", + "name": "tagID", "in": "path", "required": true } @@ -2511,51 +2527,38 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.Tag" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, "delete": { - "description": "Deletes a series by ID", + "description": "Deletes a tag", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Delete a series by ID", - "operationId": "delete-series-by-id", + "summary": "Delete a tag", + "operationId": "delete-tag", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", + "description": "Tag ID", + "name": "tagID", "in": "path", "required": true } @@ -2569,32 +2572,24 @@ }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, "patch": { - "description": "Updates a series by event ID", + "description": "Updates a tag", "consumes": [ "application/json" ], @@ -2602,25 +2597,25 @@ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Update a series by event ID", - "operationId": "update-series-by-event-id", + "summary": "Update a tag", + "operationId": "update-tag", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "Tag ID", + "name": "tagID", "in": "path", "required": true }, { - "description": "Series Body", - "name": "seriesBody", + "description": "Tag", + "name": "tag", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateSeriesRequestBody" + "$ref": "#/definitions/base.UpdateTagRequestBody" } } ], @@ -2628,54 +2623,51 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.Tag" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/events/{eventID}/tags": { + "/users/": { "get": { - "description": "Retrieves all tags associated with an event", + "description": "Retrieves all users", "produces": [ "application/json" ], "tags": [ - "event" + "user" ], - "summary": "Retrieve all tags by event", - "operationId": "get-tags-by-event", + "summary": "Retrieve all users", + "operationId": "get-users", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { @@ -2684,383 +2676,340 @@ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.Tag" + "$ref": "#/definitions/models.User" } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "401": { + "description": "Unauthorized", + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/files/": { + "/users/{userID}/": { "get": { - "description": "Retrieves all files", + "description": "Retrieves a user", "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Retrieve all files", - "operationId": "get-files", + "summary": "Retrieve a user", + "operationId": "get-user", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { "200": { "description": "OK", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.File" - } + "$ref": "#/definitions/models.User" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, - "post": { - "description": "Creates a file", - "consumes": [ - "multipart/form-data" - ], + "delete": { + "description": "Deletes a user", "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Create a file", - "operationId": "create-file", + "summary": "Delete a user", + "operationId": "delete-user", "parameters": [ { - "description": "File", - "name": "file", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateFileRequestBody" - } + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { - "201": { - "description": "Created", + "204": { + "description": "No Content", "schema": { - "$ref": "#/definitions/models.File" + "type": "string" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - } - }, - "/files/:fileID": { - "get": { - "description": "Retrieves a file", + }, + "patch": { + "description": "Updates a user", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Retrieve a file", - "operationId": "get-file", + "summary": "Update a user", + "operationId": "update-user", "parameters": [ { "type": "string", - "description": "File ID", - "name": "fileID", + "description": "User ID", + "name": "userID", "in": "path", "required": true + }, + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.UpdateUserRequestBody" + } } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.File" + "$ref": "#/definitions/models.User" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - }, - "delete": { - "description": "Deletes a file", + } + }, + "/users/{userID}/follower/": { + "get": { + "description": "Retrieves all clubs a user is following", "produces": [ "application/json" ], "tags": [ - "file" + "user-follower" ], - "summary": "Delete a file", - "operationId": "delete-file", + "summary": "Retrieve all clubs a user is following", + "operationId": "get-following", "parameters": [ { "type": "string", - "description": "File ID", - "name": "fileID", + "description": "User ID", + "name": "userID", "in": "path", "required": true } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/models.File" + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/pocs/": { - "get": { - "description": "Retrieves all point of contacts", + "/users/{userID}/follower/{clubID}/": { + "post": { + "description": "Follow a club", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "point of contact" + "user-follower" ], - "summary": "Retrieve all point of contacts", - "operationId": "get-point-of-contacts", + "summary": "Follow a club", + "operationId": "create-following", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true }, { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true } ], "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.PointOfContact" - } + "$ref": "#/definitions/utilities.SuccessResponse" } }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "type": "string" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "type": "string" - } + "schema": {} } } - } - }, - "/pocs/{pocID}/": { - "get": { - "description": "Retrieves a point of contact by id", + }, + "delete": { + "description": "Unfollow a club", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "point of contact" + "user-follower" ], - "summary": "Retrieves a point of contact", - "operationId": "get-point-of-contact", + "summary": "Unfollow a club", + "operationId": "delete-following", "parameters": [ { "type": "string", - "description": "Point of Contact ID", - "name": "pocID", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Club ID", + "name": "clubID", "in": "path", "required": true } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content", "schema": { - "$ref": "#/definitions/models.PointOfContact" + "$ref": "#/definitions/utilities.SuccessResponse" } }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "type": "string" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "type": "string" - } + "schema": {} } } } }, - "/tags": { + "/users/{userID}/member/": { "get": { - "description": "Retrieves all tags", + "description": "Retrieves all clubs a user is a member of", "produces": [ "application/json" ], "tags": [ - "tag" + "user-member" ], - "summary": "Retrieve all tags", - "operationId": "get-all-tags", + "summary": "Retrieve all clubs a user is a member of", + "operationId": "get-membership", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { @@ -3069,34 +3018,32 @@ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.Tag" + "$ref": "#/definitions/models.Club" } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/tags/": { - "post": { - "description": "Creates a tag", + "/users/{userID}/password": { + "patch": { + "description": "Updates a user's password", "consumes": [ "application/json" ], @@ -3104,71 +3051,70 @@ "application/json" ], "tags": [ - "tag" + "user" ], - "summary": "Create a tag", - "operationId": "create-tag", + "summary": "Update a user's password", + "operationId": "update-password", "parameters": [ { - "description": "Tag Body", - "name": "tagBody", + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "Password Body", + "name": "passwordBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateTagRequestBody" + "$ref": "#/definitions/auth.UpdatePasswordRequestBody" } } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/models.Tag" + "type": "string" } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } } }, - "/tags/{tagID}/": { + "/users/{userID}/tags/": { "get": { - "description": "Retrieves a tag", + "description": "Retrieves all tags associated with a user", "produces": [ "application/json" ], "tags": [ - "tag" + "user-tag" ], - "summary": "Retrieve a tag", - "operationId": "get-tag", + "summary": "Retrieve all tags for a user", + "operationId": "get-tags-by-user", "parameters": [ { "type": "string", - "description": "Tag ID", - "name": "tagID", + "description": "User ID", + "name": "userID", "in": "path", "required": true } @@ -3177,83 +3123,32 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Tag" + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "delete": { - "description": "Deletes a tag", - "produces": [ - "application/json" - ], - "tags": [ - "tag" - ], - "summary": "Delete a tag", - "operationId": "delete-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, - "patch": { - "description": "Updates a tag", + "post": { + "description": "Creates tags for a user", "consumes": [ "application/json" ], @@ -3261,119 +3156,58 @@ "application/json" ], "tags": [ - "tag" + "user-tag" ], - "summary": "Update a tag", - "operationId": "update-tag", + "summary": "Create user tags", + "operationId": "create-user-tags", "parameters": [ { "type": "string", - "description": "Tag ID", - "name": "tagID", + "description": "User ID", + "name": "userID", "in": "path", "required": true }, { - "description": "Tag", - "name": "tag", + "description": "User Tags Body", + "name": "userTagsBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateTagRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + "$ref": "#/definitions/tags.CreateUserTagsBody" } } - } - } - }, - "/users/": { - "get": { - "description": "Retrieves all users", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Retrieve all users", - "operationId": "get-users", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } ], "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.User" + "$ref": "#/definitions/models.Tag" } } }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } }, - "post": { - "description": "Creates a user", + "delete": { + "description": "Creates tags for a user", "consumes": [ "application/json" ], @@ -3381,72 +3215,10 @@ "application/json" ], "tags": [ - "user" - ], - "summary": "Create a user", - "operationId": "create-user", - "parameters": [ - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateUserRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "409": { - "description": "Conflict", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - } - }, - "/users/{userID}/": { - "get": { - "description": "Retrieves a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" + "user-tag" ], - "summary": "Retrieve a user", - "operationId": "get-user", + "summary": "Create user tags", + "operationId": "create-user-tags", "parameters": [ { "type": "string", @@ -3457,1254 +3229,801 @@ } ], "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } + "201": { + "description": "Created" }, "400": { "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "401": { "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } + "schema": {} } } - }, - "delete": { - "description": "Deletes a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Delete a user", - "operationId": "delete-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + } + } + }, + "definitions": { + "auth.LoginResponseBody": { + "type": "object", + "required": [ + "email", + "password" + ], + "properties": { + "email": { + "type": "string" + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 } - }, - "patch": { - "description": "Updates a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Update a user", - "operationId": "update-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateUserRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + } + }, + "auth.UpdatePasswordRequestBody": { + "type": "object", + "required": [ + "new_password", + "old_password" + ], + "properties": { + "new_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + }, + "old_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/follower/": { - "get": { - "description": "Retrieves all clubs a user is following", - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Retrieve all clubs a user is following", - "operationId": "get-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" + "base.CreateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "description", + "is_recruiting", + "name", + "preview", + "recruitment_cycle", + "recruitment_type", + "user_id" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" } - } + ] + }, + "user_id": { + "type": "string" + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 } } }, - "/users/{userID}/follower/{clubID}/": { - "post": { - "description": "Follow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Follow a club", - "operationId": "create-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "delete": { - "description": "Unfollow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Unfollow a club", - "operationId": "delete-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + "base.CreateFileRequestBody": { + "type": "object", + "required": [ + "owner_id", + "owner_type" + ], + "properties": { + "owner_id": { + "type": "string" + }, + "owner_type": { + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/member/": { - "get": { - "description": "Retrieves all clubs a user is a member of", - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Retrieve all clubs a user is a member of", - "operationId": "get-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } + "base.CreateTagRequestBody": { + "type": "object", + "required": [ + "category_id", + "name" + ], + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/member/{clubID}/": { - "post": { - "description": "Join a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Join a club", - "operationId": "create-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" + "base.CreateUserRequestBody": { + "type": "object", + "required": [ + "email", + "first_name", + "last_name", + "password" + ], + "properties": { + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "email": { + "type": "string", + "maxLength": 255 + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": [ + "december", + "may" + ], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" } - } - } - }, - "delete": { - "description": "Leave a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Leave a club", - "operationId": "delete-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "graduation_year": { + "type": "integer" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "description": "Optional fields", + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "major1": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" } - } - } - } - }, - "/users/{userID}/password": { - "patch": { - "description": "Updates a user's password", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Update a user's password", - "operationId": "update-password", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "Password Body", - "name": "passwordBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdatePasswordRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" } - } + ] + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a user", - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Retrieve all tags for a user", - "operationId": "get-tags-by-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } + "base.UpdateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "recruitment_cycle", + "recruitment_type" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "post": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Tags Body", - "name": "userTagsBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/tag.CreateUserTagsBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - }, - "delete": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "404": { - "description": "Not Found", - "schema": { - "$ref": "#/definitions/errors.Error" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/errors.Error" - } - } - } - } - } - }, - "definitions": { - "errors.Error": { - "type": "object", - "properties": { - "message": { - "type": "string" + ] }, - "statusCode": { - "type": "integer" + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 } } }, - "models.Category": { + "base.UpdateTagRequestBody": { "type": "object", - "required": [ - "name" - ], "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 + "category_id": { + "type": "string" }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.CategoryRequestBody": { - "type": "object", - "required": [ - "name" - ], - "properties": { "name": { "type": "string", "maxLength": 255 } } }, - "models.Club": { + "base.UpdateUserRequestBody": { "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "num_members", - "preview", - "recruitment_cycle", - "recruitment_type" - ], "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "num_members": { - "type": "integer", - "minimum": 1 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, + "college": { "enum": [ - "fall", - "spring", - "fallSpring", - "always" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ], "allOf": [ { - "$ref": "#/definitions/models.RecruitmentCycle" + "$ref": "#/definitions/models.College" } ] }, - "recruitment_type": { + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { "maxLength": 255, "enum": [ - "unrestricted", - "tryout", - "application" + "december", + "may" ], "allOf": [ { - "$ref": "#/definitions/models.RecruitmentType" + "$ref": "#/definitions/models.GraduationCycle" } ] }, - "updated_at": { + "graduation_year": { + "type": "integer" + }, + "last_name": { "type": "string", - "example": "2023-09-20T16:34:50Z" + "maxLength": 255 }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.College": { - "type": "string", - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "x-enum-comments": { - "BCHS": "Bouvé College of Health Sciences", - "CAMD": "College of Arts, Media and Design", - "CE": "College of Engineering", - "CPS": "College of Professional Studies", - "CS": "College of Science", - "CSSH": "College of Social Sciences and Humanities", - "DMSB": "D'Amore-McKim School of Business", - "KCCS": "Khoury College of Computer Sciences", - "SL": "School of Law" - }, - "x-enum-varnames": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ] - }, - "models.Contact": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "type": { + "major0": { "maxLength": 255, "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" ], "allOf": [ { - "$ref": "#/definitions/models.ContactType" + "$ref": "#/definitions/models.Major" } ] }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.ContactType": { - "type": "string", - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "x-enum-varnames": [ - "Facebook", - "Instagram", - "X", - "LinkedIn", - "YouTube", - "GitHub", - "Slack", - "Discord", - "Email", - "CustomSite" - ] - }, - "models.CreateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "preview", - "recruitment_cycle", - "recruitment_type", - "user_id" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "user_id": { - "type": "string" - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.CreateClubTagsRequestBody": { - "type": "object", - "required": [ - "tags" - ], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "models.CreateEventRequestBody": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "host", - "is_recurring", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "description": "TODO club/tag/notification logic", - "type": "string" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "series": { - "description": "TODO validate if isRecurring, then series is required", - "allOf": [ - { - "$ref": "#/definitions/models.CreateSeriesRequestBody" - } - ] - }, - "start_time": { - "type": "string" - } - } - }, - "models.CreateFileRequestBody": { - "type": "object", - "required": [ - "owner_id", - "owner_type" - ], - "properties": { - "owner_id": { - "type": "string" - }, - "owner_type": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateSeriesRequestBody": { - "type": "object", - "required": [ - "max_occurrences", - "recurring_type" - ], - "properties": { - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "models.CreateTagRequestBody": { - "type": "object", - "required": [ - "category_id", - "name" - ], - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateUserRequestBody": { - "type": "object", - "required": [ - "email", - "first_name", - "last_name", - "password" - ], - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "description": "Optional fields", + "major1": { "maxLength": 255, "enum": [ "africanaStudies", @@ -4814,7 +4133,7 @@ } ] }, - "major1": { + "major2": { "maxLength": 255, "enum": [ "africanaStudies", @@ -4923,241 +4242,212 @@ "$ref": "#/definitions/models.Major" } ] + } + } + }, + "base.VerifyEmailRequestBody": { + "type": "object", + "required": [ + "email", + "token" + ], + "properties": { + "email": { + "type": "string" }, - "major2": { + "token": { + "type": "string" + } + } + }, + "base.VerifyPasswordResetTokenRequestBody": { + "type": "object", + "required": [ + "new_password", + "token", + "verify_new_password" + ], + "properties": { + "new_password": { + "type": "string", + "minLength": 8 + }, + "token": { + "type": "string" + }, + "verify_new_password": { + "type": "string", + "minLength": 8 + } + } + }, + "categories.CategoryRequestBody": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "contacts.PutContactRequestBody": { + "type": "object", + "required": [ + "content", + "type" + ], + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "type": { "maxLength": 255, "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" ], "allOf": [ { - "$ref": "#/definitions/models.Major" + "$ref": "#/definitions/models.ContactType" } ] - }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 } } }, - "models.Event": { + "models.Category": { "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "location", - "name", - "preview", - "start_time" - ], "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, "created_at": { "type": "string", "example": "2023-09-20T16:34:50Z" }, - "end_time": { + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { "type": "string" }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.Club": { + "type": "object", + "properties": { + "application_link": { + "type": "string" }, - "host": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "description": { "type": "string" }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, - "is_recurring": { + "is_recruiting": { "type": "boolean" }, - "location": { - "type": "string", - "maxLength": 255 - }, - "meeting_link": { + "logo": { "type": "string" }, "name": { - "type": "string", - "maxLength": 255 + "type": "string" }, - "preview": { - "type": "string", - "maxLength": 255 + "num_members": { + "type": "integer" }, - "start_time": { + "one_word_to_describe_us": { + "type": "string" + }, + "preview": { "type": "string" }, + "recruitment_cycle": { + "$ref": "#/definitions/models.RecruitmentCycle" + }, + "recruitment_type": { + "$ref": "#/definitions/models.RecruitmentType" + }, "updated_at": { "type": "string", "example": "2023-09-20T16:34:50Z" + }, + "weekly_time_commitment": { + "type": "integer" } } }, - "models.EventType": { + "models.College": { "type": "string", "enum": [ - "open", - "membersOnly" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ], + "x-enum-comments": { + "BCHS": "Bouvé College of Health Sciences", + "CAMD": "College of Arts, Media and Design", + "CE": "College of Engineering", + "CPS": "College of Professional Studies", + "CS": "College of Science", + "CSSH": "College of Social Sciences and Humanities", + "DMSB": "D'Amore-McKim School of Business", + "KCCS": "Khoury College of Computer Sciences", + "SL": "School of Law" + }, "x-enum-varnames": [ - "Open", - "MembersOnly" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ] }, - "models.File": { + "models.Contact": { "type": "object", - "required": [ - "file_name", - "file_size", - "file_type", - "file_url", - "object_key" - ], "properties": { + "content": { + "type": "string" + }, "created_at": { "type": "string", "example": "2023-09-20T16:34:50Z" }, - "file_name": { - "type": "string", - "maxLength": 255 - }, - "file_size": { - "type": "integer", - "minimum": 1 - }, - "file_type": { - "type": "string", - "maxLength": 255 - }, - "file_url": { - "type": "string", - "maxLength": 255 - }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, - "object_key": { - "type": "string", - "maxLength": 255 + "type": { + "$ref": "#/definitions/models.ContactType" }, "updated_at": { "type": "string", @@ -5165,34 +4455,150 @@ } } }, - "models.GraduationCycle": { + "models.ContactType": { "type": "string", "enum": [ - "december", - "may" + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" ], "x-enum-varnames": [ - "December", - "May" + "Facebook", + "Instagram", + "X", + "LinkedIn", + "YouTube", + "GitHub", + "Slack", + "Discord", + "Email", + "CustomSite" ] }, - "models.LoginUserResponseBody": { + "models.Event": { "type": "object", - "required": [ - "email", - "password" + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "description": { + "type": "string" + }, + "end_time": { + "type": "string" + }, + "event_type": { + "description": "geoshi", + "allOf": [ + { + "$ref": "#/definitions/models.EventType" + } + ] + }, + "host": { + "type": "string" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_archived": { + "type": "boolean" + }, + "is_draft": { + "type": "boolean" + }, + "is_public": { + "description": "internal housekeeping states", + "type": "boolean" + }, + "link": { + "type": "string" + }, + "location": { + "type": "string" + }, + "name": { + "description": "details", + "type": "string" + }, + "preview": { + "type": "string" + }, + "start_time": { + "description": "timing", + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.EventType": { + "type": "string", + "enum": [ + "hybrid", + "in_person", + "virtual" ], + "x-enum-varnames": [ + "Hybrid", + "InPerson", + "Virtual" + ] + }, + "models.File": { + "type": "object", "properties": { - "email": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "file_name": { "type": "string" }, - "password": { - "description": "MARK: must be validated manually", + "file_size": { + "type": "integer" + }, + "file_type": { + "type": "string" + }, + "file_url": { + "type": "string" + }, + "id": { "type": "string", - "maxLength": 255 + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "object_key": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" } } }, + "models.GraduationCycle": { + "type": "string", + "enum": [ + "december", + "may" + ], + "x-enum-varnames": [ + "December", + "May" + ] + }, "models.Major": { "type": "string", "enum": [ @@ -5382,1135 +4788,46 @@ "MediaAndScreenStudies", "MediaArts", "Music", - "MusicTechnology", - "Nursing", - "PharmaceuticalSciences", - "PharmacyPharmD", - "Philosophy", - "Physics", - "PoliticalScience", - "PoliticsPhilosophyEconomics", - "Psychology", - "PublicHealth", - "PublicRelations", - "ReligiousStudies", - "Sociology", - "Spanish", - "SpeechLanguagePathologyAndAudiology", - "Theatre" - ] - }, - "models.PointOfContact": { - "type": "object", - "required": [ - "email", - "name", - "position" - ], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "photo_file": { - "$ref": "#/definitions/models.File" - }, - "position": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.PutContactRequestBody": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "type": { - "maxLength": 255, - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "allOf": [ - { - "$ref": "#/definitions/models.ContactType" - } - ] - } - } - }, - "models.RecruitmentCycle": { - "type": "string", - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "x-enum-varnames": [ - "Fall", - "Spring", - "FallSpring", - "Always" - ] - }, - "models.RecruitmentType": { - "type": "string", - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "x-enum-varnames": [ - "Unrestricted", - "Tryout", - "Application" - ] - }, - "models.RecurringType": { - "type": "string", - "enum": [ - "daily", - "weekly", - "monthly" - ], - "x-enum-varnames": [ - "Daily", - "Weekly", - "Monthly" - ] - }, - "models.Series": { - "type": "object", - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "events": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "max_occurrences": { - "type": "integer", - "minimum": 1 - }, - "recurring_type": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.Tag": { - "type": "object", - "required": [ - "category_id", - "name" - ], - "properties": { - "category_id": { - "type": "string" - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.UpdateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "recruitment_cycle", - "recruitment_type" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.UpdateEventRequestBody": { - "type": "object", - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "type": "string" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "start_time": { - "type": "string" - } - } - }, - "models.UpdatePasswordRequestBody": { - "type": "object", - "required": [ - "new_password", - "old_password" - ], - "properties": { - "new_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - }, - "old_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateSeriesRequestBody": { - "type": "object", - "properties": { - "event_details": { - "$ref": "#/definitions/models.UpdateEventRequestBody" - }, - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "models.UpdateTagRequestBody": { - "type": "object", - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateUserRequestBody": { - "type": "object", - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - } - } - }, - "models.User": { - "type": "object", - "required": [ - "college", - "email", - "first_name", - "graduation_cycle", - "graduation_year", - "last_name", - "major0", - "role" - ], - "properties": { - "college": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_verified": { - "type": "boolean" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] + "MusicTechnology", + "Nursing", + "PharmaceuticalSciences", + "PharmacyPharmD", + "Philosophy", + "Physics", + "PoliticalScience", + "PoliticsPhilosophyEconomics", + "Psychology", + "PublicHealth", + "PublicRelations", + "ReligiousStudies", + "Sociology", + "Spanish", + "SpeechLanguagePathologyAndAudiology", + "Theatre" + ] + }, + "models.PointOfContact": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] + "email": { + "type": "string" }, - "role": { + "id": { "type": "string", - "enum": [ - "super", - "student" - ] + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string" + }, + "photo_file": { + "$ref": "#/definitions/models.File" + }, + "position": { + "type": "string" }, "updated_at": { "type": "string", @@ -6518,43 +4835,122 @@ } } }, - "models.VerifyEmailRequestBody": { - "type": "object", - "required": [ - "email", - "token" + "models.RecruitmentCycle": { + "type": "string", + "enum": [ + "fall", + "spring", + "fallSpring", + "always" ], + "x-enum-varnames": [ + "Fall", + "Spring", + "FallSpring", + "Always" + ] + }, + "models.RecruitmentType": { + "type": "string", + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "x-enum-varnames": [ + "Unrestricted", + "Tryout", + "Application" + ] + }, + "models.Tag": { + "type": "object", "properties": { - "email": { + "category_id": { "type": "string" }, - "token": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" } } }, - "models.VerifyPasswordResetTokenRequestBody": { + "models.User": { "type": "object", - "required": [ - "new_password", - "token", - "verify_new_password" - ], "properties": { - "new_password": { + "college": { + "$ref": "#/definitions/models.College" + }, + "created_at": { "type": "string", - "minLength": 8 + "example": "2023-09-20T16:34:50Z" }, - "token": { + "email": { "type": "string" }, - "verify_new_password": { + "first_name": { + "type": "string" + }, + "graduation_cycle": { + "$ref": "#/definitions/models.GraduationCycle" + }, + "graduation_year": { + "type": "integer" + }, + "id": { "type": "string", - "minLength": 8 + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_verified": { + "type": "boolean" + }, + "last_name": { + "type": "string" + }, + "major0": { + "$ref": "#/definitions/models.Major" + }, + "major1": { + "$ref": "#/definitions/models.Major" + }, + "major2": { + "$ref": "#/definitions/models.Major" + }, + "role": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "tags.CreateClubTagsRequestBody": { + "type": "object", + "required": [ + "tags" + ], + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } } } }, - "tag.CreateUserTagsBody": { + "tags.CreateUserTagsBody": { "type": "object", "required": [ "tags" diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index 24d2b66dd..93f68a29c 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -1,190 +1,31 @@ definitions: - errors.Error: + auth.LoginResponseBody: properties: - message: - type: string - statusCode: - type: integer - type: object - models.Category: - properties: - created_at: - example: "2023-09-20T16:34:50Z" - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 - type: string - name: - maxLength: 255 - type: string - updated_at: - example: "2023-09-20T16:34:50Z" - type: string - required: - - name - type: object - models.CategoryRequestBody: - properties: - name: - maxLength: 255 - type: string - required: - - name - type: object - models.Club: - properties: - application_link: - maxLength: 255 - type: string - created_at: - example: "2023-09-20T16:34:50Z" - type: string - description: - maxLength: 255 - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 - type: string - is_recruiting: - type: boolean - logo: - maxLength: 255 - type: string - name: - maxLength: 255 - type: string - num_members: - minimum: 1 - type: integer - one_word_to_describe_us: - maxLength: 255 - type: string - preview: - maxLength: 255 + email: type: string - recruitment_cycle: - allOf: - - $ref: '#/definitions/models.RecruitmentCycle' - enum: - - fall - - spring - - fallSpring - - always - maxLength: 255 - recruitment_type: - allOf: - - $ref: '#/definitions/models.RecruitmentType' - enum: - - unrestricted - - tryout - - application + password: + description: 'MARK: must be validated manually' maxLength: 255 - updated_at: - example: "2023-09-20T16:34:50Z" type: string - weekly_time_commitment: - minimum: 1 - type: integer required: - - application_link - - description - - is_recruiting - - name - - num_members - - preview - - recruitment_cycle - - recruitment_type + - email + - password type: object - models.College: - enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH - type: string - x-enum-comments: - BCHS: Bouvé College of Health Sciences - CAMD: College of Arts, Media and Design - CE: College of Engineering - CPS: College of Professional Studies - CS: College of Science - CSSH: College of Social Sciences and Humanities - DMSB: D'Amore-McKim School of Business - KCCS: Khoury College of Computer Sciences - SL: School of Law - x-enum-varnames: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH - models.Contact: + auth.UpdatePasswordRequestBody: properties: - content: + new_password: + description: 'MARK: must be validated manually' maxLength: 255 type: string - created_at: - example: "2023-09-20T16:34:50Z" - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 - type: string - type: - allOf: - - $ref: '#/definitions/models.ContactType' - enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite + old_password: + description: 'MARK: must be validated manually' maxLength: 255 - updated_at: - example: "2023-09-20T16:34:50Z" type: string required: - - content - - type + - new_password + - old_password type: object - models.ContactType: - enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite - type: string - x-enum-varnames: - - Facebook - - Instagram - - X - - LinkedIn - - YouTube - - GitHub - - Slack - - Discord - - Email - - CustomSite - models.CreateClubRequestBody: + base.CreateClubRequestBody: properties: application_link: maxLength: 255 @@ -238,61 +79,7 @@ definitions: - recruitment_type - user_id type: object - models.CreateClubTagsRequestBody: - properties: - tags: - items: - type: string - type: array - required: - - tags - type: object - models.CreateEventRequestBody: - properties: - content: - maxLength: 255 - type: string - end_time: - type: string - event_type: - allOf: - - $ref: '#/definitions/models.EventType' - enum: - - open - - membersOnly - maxLength: 255 - host: - description: TODO club/tag/notification logic - type: string - is_recurring: - type: boolean - location: - maxLength: 255 - type: string - name: - maxLength: 255 - type: string - preview: - maxLength: 255 - type: string - series: - allOf: - - $ref: '#/definitions/models.CreateSeriesRequestBody' - description: TODO validate if isRecurring, then series is required - start_time: - type: string - required: - - content - - end_time - - event_type - - host - - is_recurring - - location - - name - - preview - - start_time - type: object - models.CreateFileRequestBody: + base.CreateFileRequestBody: properties: owner_id: type: string @@ -303,24 +90,7 @@ definitions: - owner_id - owner_type type: object - models.CreateSeriesRequestBody: - properties: - max_occurrences: - minimum: 2 - type: integer - recurring_type: - allOf: - - $ref: '#/definitions/models.RecurringType' - enum: - - daily - - weekly - - monthly - maxLength: 255 - required: - - max_occurrences - - recurring_type - type: object - models.CreateTagRequestBody: + base.CreateTagRequestBody: properties: category_id: type: string @@ -331,7 +101,7 @@ definitions: - category_id - name type: object - models.CreateUserRequestBody: + base.CreateUserRequestBody: properties: college: allOf: @@ -690,695 +460,197 @@ definitions: - last_name - password type: object - models.Event: + base.UpdateClubRequestBody: properties: - content: + application_link: maxLength: 255 type: string - created_at: - example: "2023-09-20T16:34:50Z" - type: string - end_time: - type: string - event_type: - allOf: - - $ref: '#/definitions/models.EventType' - enum: - - open - - membersOnly + description: maxLength: 255 - host: - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 type: string - is_recurring: + is_recruiting: type: boolean - location: + logo: maxLength: 255 type: string - meeting_link: - type: string name: maxLength: 255 type: string - preview: + one_word_to_describe_us: maxLength: 255 type: string - start_time: - type: string - updated_at: - example: "2023-09-20T16:34:50Z" + preview: + maxLength: 255 type: string - required: - - content - - end_time - - event_type - - location - - name - - preview - - start_time - type: object - models.EventType: - enum: - - open - - membersOnly - type: string - x-enum-varnames: - - Open - - MembersOnly - models.File: - properties: - created_at: - example: "2023-09-20T16:34:50Z" - type: string - file_name: + recruitment_cycle: + allOf: + - $ref: '#/definitions/models.RecruitmentCycle' + enum: + - fall + - spring + - fallSpring + - always maxLength: 255 - type: string - file_size: + recruitment_type: + allOf: + - $ref: '#/definitions/models.RecruitmentType' + enum: + - unrestricted + - tryout + - application + maxLength: 255 + weekly_time_commitment: minimum: 1 type: integer - file_type: - maxLength: 255 - type: string - file_url: - maxLength: 255 - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 + required: + - application_link + - recruitment_cycle + - recruitment_type + type: object + base.UpdateTagRequestBody: + properties: + category_id: type: string - object_key: + name: maxLength: 255 type: string - updated_at: - example: "2023-09-20T16:34:50Z" - type: string - required: - - file_name - - file_size - - file_type - - file_url - - object_key type: object - models.GraduationCycle: - enum: - - december - - may - type: string - x-enum-varnames: - - December - - May - models.LoginUserResponseBody: + base.UpdateUserRequestBody: properties: - email: + college: + allOf: + - $ref: '#/definitions/models.College' + enum: + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH + first_name: + maxLength: 255 type: string - password: - description: 'MARK: must be validated manually' + graduation_cycle: + allOf: + - $ref: '#/definitions/models.GraduationCycle' + enum: + - december + - may + maxLength: 255 + graduation_year: + type: integer + last_name: maxLength: 255 type: string - required: - - email - - password - type: object - models.Major: - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - type: string - x-enum-varnames: - - AfricanaStudies - - AmericanSignLanguage - - AmericanSignLanguageEnglishInterpreting - - AppliedPhysics - - ArchitecturalStudies - - Architecture - - ArtArtVisualStudies - - BehavioralNeuroscience - - Biochemistry - - Bioengineering - - Biology - - BiomedicalPhysics - - BusinessAdministration - - BusinessAdministrationAccounting - - BusinessAdministrationAccountingAndAdvisoryServices - - BusinessAdministrationBrandManagement - - BusinessAdministrationBusinessAnalytics - - BusinessAdministrationCorporateInnovation - - BusinessAdministrationEntrepreneurialStartups - - BusinessAdministrationFamilyBusiness - - BusinessAdministrationFinance - - BusinessAdministrationFintech - - BusinessAdministrationHealthcareManagementAndConsulting - - BusinessAdministrationManagement - - BusinessAdministrationManagementInformationSystems - - BusinessAdministrationMarketing - - BusinessAdministrationMarketingAnalytics - - BusinessAdministrationSocialInnovationAndEntrepreneurship - - BusinessAdministrationSupplyChainManagement - - CellAndMolecularBiology - - ChemicalEngineering - - Chemistry - - CivilEngineering - - CommunicationStudies - - ComputerEngineering - - ComputerScience - - ComputingAndLaw - - CriminologyAndCriminalJustice - - CulturalAnthropology - - Cybersecurity - - DataScience - - Design - - Economics - - ElectricalEngineering - - English - - EnvironmentalAndSustainabilityStudies - - EnvironmentalEngineering - - EnvironmentalScience - - EnvironmentalStudies - - GameArtAndAnimation - - GameDesign - - GlobalAsianStudies - - HealthScience - - History - - HistoryCultureAndLaw - - HumanServices - - IndustrialEngineering - - InternationalAffairs - - InternationalBusiness - - InternationalBusinessAccounting - - InternationalBusinessAccountingAndAdvisoryServices - - InternationalBusinessBrandManagement - - InternationalBusinessBusinessAnalytics - - InternationalBusinessCorporateInnovation - - InternationalBusinessEntrepreneurialStartups - - InternationalBusinessFamilyBusiness - - InternationalBusinessFinance - - InternationalBusinessFintech - - InternationalBusinessHealthcareManagementAndConsulting - - InternationalBusinessManagement - - InternationalBusinessManagementInformationSystems - - InternationalBusinessMarketing - - InternationalBusinessMarketingAnalytics - - InternationalBusinessSocialInnovationAndEntrepreneurship - - InternationalBusinessSupplyChainManagement - - Journalism - - LandscapeArchitecture - - Linguistics - - MarineBiology - - Mathematics - - MechanicalEngineering - - MediaAndScreenStudies - - MediaArts - - Music - - MusicTechnology - - Nursing - - PharmaceuticalSciences - - PharmacyPharmD - - Philosophy - - Physics - - PoliticalScience - - PoliticsPhilosophyEconomics - - Psychology - - PublicHealth - - PublicRelations - - ReligiousStudies - - Sociology - - Spanish - - SpeechLanguagePathologyAndAudiology - - Theatre - models.PointOfContact: - properties: - created_at: - example: "2023-09-20T16:34:50Z" - type: string - email: - maxLength: 255 - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 - type: string - name: - maxLength: 255 - type: string - photo_file: - $ref: '#/definitions/models.File' - position: - maxLength: 255 - type: string - updated_at: - example: "2023-09-20T16:34:50Z" - type: string - required: - - email - - name - - position - type: object - models.PutContactRequestBody: - properties: - content: - maxLength: 255 - type: string - type: + major0: allOf: - - $ref: '#/definitions/models.ContactType' + - $ref: '#/definitions/models.Major' enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 - required: - - content - - type - type: object - models.RecruitmentCycle: - enum: - - fall - - spring - - fallSpring - - always - type: string - x-enum-varnames: - - Fall - - Spring - - FallSpring - - Always - models.RecruitmentType: - enum: - - unrestricted - - tryout - - application - type: string - x-enum-varnames: - - Unrestricted - - Tryout - - Application - models.RecurringType: - enum: - - daily - - weekly - - monthly - type: string - x-enum-varnames: - - Daily - - Weekly - - Monthly - models.Series: - properties: - created_at: - example: "2023-09-20T16:34:50Z" - type: string - events: - items: - $ref: '#/definitions/models.Event' - type: array - id: - example: 123e4567-e89b-12d3-a456-426614174000 - type: string - max_occurrences: - minimum: 1 - type: integer - recurring_type: - allOf: - - $ref: '#/definitions/models.RecurringType' - maxLength: 255 - updated_at: - example: "2023-09-20T16:34:50Z" - type: string - type: object - models.Tag: - properties: - category_id: - type: string - created_at: - example: "2023-09-20T16:34:50Z" - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 - type: string - name: - maxLength: 255 - type: string - updated_at: - example: "2023-09-20T16:34:50Z" - type: string - required: - - category_id - - name - type: object - models.UpdateClubRequestBody: - properties: - application_link: - maxLength: 255 - type: string - description: - maxLength: 255 - type: string - is_recruiting: - type: boolean - logo: - maxLength: 255 - type: string - name: - maxLength: 255 - type: string - one_word_to_describe_us: - maxLength: 255 - type: string - preview: - maxLength: 255 - type: string - recruitment_cycle: - allOf: - - $ref: '#/definitions/models.RecruitmentCycle' - enum: - - fall - - spring - - fallSpring - - always - maxLength: 255 - recruitment_type: - allOf: - - $ref: '#/definitions/models.RecruitmentType' - enum: - - unrestricted - - tryout - - application - maxLength: 255 - weekly_time_commitment: - minimum: 1 - type: integer - required: - - application_link - - recruitment_cycle - - recruitment_type - type: object - models.UpdateEventRequestBody: - properties: - content: - maxLength: 255 - type: string - end_time: - type: string - event_type: - allOf: - - $ref: '#/definitions/models.EventType' - enum: - - open - - membersOnly - maxLength: 255 - host: - type: string - location: - maxLength: 255 - type: string - name: - maxLength: 255 - type: string - preview: - maxLength: 255 - type: string - start_time: - type: string - type: object - models.UpdatePasswordRequestBody: - properties: - new_password: - description: 'MARK: must be validated manually' - maxLength: 255 - type: string - old_password: - description: 'MARK: must be validated manually' - maxLength: 255 - type: string - required: - - new_password - - old_password - type: object - models.UpdateSeriesRequestBody: - properties: - event_details: - $ref: '#/definitions/models.UpdateEventRequestBody' - max_occurrences: - minimum: 2 - type: integer - recurring_type: - allOf: - - $ref: '#/definitions/models.RecurringType' - enum: - - daily - - weekly - - monthly - maxLength: 255 - type: object - models.UpdateTagRequestBody: - properties: - category_id: - type: string - name: - maxLength: 255 - type: string - type: object - models.UpdateUserRequestBody: - properties: - college: - allOf: - - $ref: '#/definitions/models.College' - enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH - first_name: - maxLength: 255 - type: string - graduation_cycle: - allOf: - - $ref: '#/definitions/models.GraduationCycle' - enum: - - december - - may - maxLength: 255 - graduation_year: - type: integer - last_name: - maxLength: 255 - type: string - major0: - allOf: - - $ref: '#/definitions/models.Major' - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - maxLength: 255 - major1: + major1: allOf: - $ref: '#/definitions/models.Major' enum: @@ -1589,397 +861,570 @@ definitions: - theatre maxLength: 255 type: object - models.User: + base.VerifyEmailRequestBody: properties: - college: - allOf: - - $ref: '#/definitions/models.College' - maxLength: 255 - created_at: - example: "2023-09-20T16:34:50Z" - type: string email: - maxLength: 255 - type: string - first_name: - maxLength: 255 type: string - graduation_cycle: - allOf: - - $ref: '#/definitions/models.GraduationCycle' - enum: - - december - - may - maxLength: 255 - graduation_year: - type: integer - id: - example: 123e4567-e89b-12d3-a456-426614174000 + token: type: string - is_verified: - type: boolean - last_name: - maxLength: 255 + required: + - email + - token + type: object + base.VerifyPasswordResetTokenRequestBody: + properties: + new_password: + minLength: 8 type: string - major0: - allOf: - - $ref: '#/definitions/models.Major' - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + token: + type: string + verify_new_password: + minLength: 8 + type: string + required: + - new_password + - token + - verify_new_password + type: object + categories.CategoryRequestBody: + properties: + name: maxLength: 255 - major1: - allOf: - - $ref: '#/definitions/models.Major' - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + type: string + required: + - name + type: object + contacts.PutContactRequestBody: + properties: + content: maxLength: 255 - major2: + type: string + type: allOf: - - $ref: '#/definitions/models.Major' + - $ref: '#/definitions/models.ContactType' enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - facebook + - instagram + - x + - linkedin + - youtube + - github + - slack + - discord + - email + - customSite maxLength: 255 - role: - enum: - - super - - student + required: + - content + - type + type: object + models.Category: + properties: + created_at: + example: "2023-09-20T16:34:50Z" + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + name: + type: string + updated_at: + example: "2023-09-20T16:34:50Z" + type: string + type: object + models.Club: + properties: + application_link: + type: string + created_at: + example: "2023-09-20T16:34:50Z" + type: string + description: + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + is_recruiting: + type: boolean + logo: + type: string + name: + type: string + num_members: + type: integer + one_word_to_describe_us: + type: string + preview: + type: string + recruitment_cycle: + $ref: '#/definitions/models.RecruitmentCycle' + recruitment_type: + $ref: '#/definitions/models.RecruitmentType' + updated_at: + example: "2023-09-20T16:34:50Z" + type: string + weekly_time_commitment: + type: integer + type: object + models.College: + enum: + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH + type: string + x-enum-comments: + BCHS: Bouvé College of Health Sciences + CAMD: College of Arts, Media and Design + CE: College of Engineering + CPS: College of Professional Studies + CS: College of Science + CSSH: College of Social Sciences and Humanities + DMSB: D'Amore-McKim School of Business + KCCS: Khoury College of Computer Sciences + SL: School of Law + x-enum-varnames: + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH + models.Contact: + properties: + content: + type: string + created_at: + example: "2023-09-20T16:34:50Z" + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + type: + $ref: '#/definitions/models.ContactType' + updated_at: + example: "2023-09-20T16:34:50Z" + type: string + type: object + models.ContactType: + enum: + - facebook + - instagram + - x + - linkedin + - youtube + - github + - slack + - discord + - email + - customSite + type: string + x-enum-varnames: + - Facebook + - Instagram + - X + - LinkedIn + - YouTube + - GitHub + - Slack + - Discord + - Email + - CustomSite + models.Event: + properties: + created_at: + example: "2023-09-20T16:34:50Z" + type: string + description: + type: string + end_time: + type: string + event_type: + allOf: + - $ref: '#/definitions/models.EventType' + description: geoshi + host: + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + is_archived: + type: boolean + is_draft: + type: boolean + is_public: + description: internal housekeeping states + type: boolean + link: + type: string + location: + type: string + name: + description: details + type: string + preview: + type: string + start_time: + description: timing + type: string + updated_at: + example: "2023-09-20T16:34:50Z" + type: string + type: object + models.EventType: + enum: + - hybrid + - in_person + - virtual + type: string + x-enum-varnames: + - Hybrid + - InPerson + - Virtual + models.File: + properties: + created_at: + example: "2023-09-20T16:34:50Z" + type: string + file_name: + type: string + file_size: + type: integer + file_type: + type: string + file_url: + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + object_key: + type: string + updated_at: + example: "2023-09-20T16:34:50Z" + type: string + type: object + models.GraduationCycle: + enum: + - december + - may + type: string + x-enum-varnames: + - December + - May + models.Major: + enum: + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre + type: string + x-enum-varnames: + - AfricanaStudies + - AmericanSignLanguage + - AmericanSignLanguageEnglishInterpreting + - AppliedPhysics + - ArchitecturalStudies + - Architecture + - ArtArtVisualStudies + - BehavioralNeuroscience + - Biochemistry + - Bioengineering + - Biology + - BiomedicalPhysics + - BusinessAdministration + - BusinessAdministrationAccounting + - BusinessAdministrationAccountingAndAdvisoryServices + - BusinessAdministrationBrandManagement + - BusinessAdministrationBusinessAnalytics + - BusinessAdministrationCorporateInnovation + - BusinessAdministrationEntrepreneurialStartups + - BusinessAdministrationFamilyBusiness + - BusinessAdministrationFinance + - BusinessAdministrationFintech + - BusinessAdministrationHealthcareManagementAndConsulting + - BusinessAdministrationManagement + - BusinessAdministrationManagementInformationSystems + - BusinessAdministrationMarketing + - BusinessAdministrationMarketingAnalytics + - BusinessAdministrationSocialInnovationAndEntrepreneurship + - BusinessAdministrationSupplyChainManagement + - CellAndMolecularBiology + - ChemicalEngineering + - Chemistry + - CivilEngineering + - CommunicationStudies + - ComputerEngineering + - ComputerScience + - ComputingAndLaw + - CriminologyAndCriminalJustice + - CulturalAnthropology + - Cybersecurity + - DataScience + - Design + - Economics + - ElectricalEngineering + - English + - EnvironmentalAndSustainabilityStudies + - EnvironmentalEngineering + - EnvironmentalScience + - EnvironmentalStudies + - GameArtAndAnimation + - GameDesign + - GlobalAsianStudies + - HealthScience + - History + - HistoryCultureAndLaw + - HumanServices + - IndustrialEngineering + - InternationalAffairs + - InternationalBusiness + - InternationalBusinessAccounting + - InternationalBusinessAccountingAndAdvisoryServices + - InternationalBusinessBrandManagement + - InternationalBusinessBusinessAnalytics + - InternationalBusinessCorporateInnovation + - InternationalBusinessEntrepreneurialStartups + - InternationalBusinessFamilyBusiness + - InternationalBusinessFinance + - InternationalBusinessFintech + - InternationalBusinessHealthcareManagementAndConsulting + - InternationalBusinessManagement + - InternationalBusinessManagementInformationSystems + - InternationalBusinessMarketing + - InternationalBusinessMarketingAnalytics + - InternationalBusinessSocialInnovationAndEntrepreneurship + - InternationalBusinessSupplyChainManagement + - Journalism + - LandscapeArchitecture + - Linguistics + - MarineBiology + - Mathematics + - MechanicalEngineering + - MediaAndScreenStudies + - MediaArts + - Music + - MusicTechnology + - Nursing + - PharmaceuticalSciences + - PharmacyPharmD + - Philosophy + - Physics + - PoliticalScience + - PoliticsPhilosophyEconomics + - Psychology + - PublicHealth + - PublicRelations + - ReligiousStudies + - Sociology + - Spanish + - SpeechLanguagePathologyAndAudiology + - Theatre + models.PointOfContact: + properties: + created_at: + example: "2023-09-20T16:34:50Z" + type: string + email: + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + name: + type: string + photo_file: + $ref: '#/definitions/models.File' + position: type: string updated_at: example: "2023-09-20T16:34:50Z" type: string - required: - - college - - email - - first_name - - graduation_cycle - - graduation_year - - last_name - - major0 - - role type: object - models.VerifyEmailRequestBody: + models.RecruitmentCycle: + enum: + - fall + - spring + - fallSpring + - always + type: string + x-enum-varnames: + - Fall + - Spring + - FallSpring + - Always + models.RecruitmentType: + enum: + - unrestricted + - tryout + - application + type: string + x-enum-varnames: + - Unrestricted + - Tryout + - Application + models.Tag: properties: - email: + category_id: type: string - token: + created_at: + example: "2023-09-20T16:34:50Z" + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + name: + type: string + updated_at: + example: "2023-09-20T16:34:50Z" type: string - required: - - email - - token type: object - models.VerifyPasswordResetTokenRequestBody: + models.User: properties: - new_password: - minLength: 8 + college: + $ref: '#/definitions/models.College' + created_at: + example: "2023-09-20T16:34:50Z" type: string - token: + email: type: string - verify_new_password: - minLength: 8 + first_name: + type: string + graduation_cycle: + $ref: '#/definitions/models.GraduationCycle' + graduation_year: + type: integer + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + is_verified: + type: boolean + last_name: + type: string + major0: + $ref: '#/definitions/models.Major' + major1: + $ref: '#/definitions/models.Major' + major2: + $ref: '#/definitions/models.Major' + role: + type: string + updated_at: + example: "2023-09-20T16:34:50Z" type: string + type: object + tags.CreateClubTagsRequestBody: + properties: + tags: + items: + type: string + type: array required: - - new_password - - token - - verify_new_password + - tags type: object - tag.CreateUserTagsBody: + tags.CreateUserTagsBody: properties: tags: items: @@ -2018,16 +1463,13 @@ paths: $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "429": description: Too Many Requests - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Generates a password reset token tags: - auth @@ -2043,7 +1485,7 @@ paths: name: loginBody required: true schema: - $ref: '#/definitions/models.LoginUserResponseBody' + $ref: '#/definitions/auth.LoginResponseBody' produces: - application/json responses: @@ -2053,16 +1495,13 @@ paths: $ref: '#/definitions/models.User' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Logs in a user tags: - auth @@ -2097,20 +1536,16 @@ paths: $ref: '#/definitions/models.User' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} security: - Bearer: [] summary: Retrieves the currently authenticated user @@ -2128,401 +1563,153 @@ paths: "200": description: OK schema: - $ref: '#/definitions/utilities.SuccessResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Refreshes a user's access token - tags: - - auth - /auth/send-code: - post: - consumes: - - application/json - description: Sends a verification code - operationId: send-verification-code - parameters: - - description: Email - in: body - name: email - required: true - schema: - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/utilities.SuccessResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "429": - description: Too Many Requests - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Sends a verification code - tags: - - auth - /auth/verify-email: - post: - consumes: - - application/json - description: Verifies an email - operationId: verify-email - parameters: - - description: Email Verification Token Body - in: body - name: tokenBody - required: true - schema: - $ref: '#/definitions/models.VerifyEmailRequestBody' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/utilities.SuccessResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "429": - description: Too Many Requests - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Verifies an email - tags: - - auth - /auth/verify-reset: - post: - consumes: - - application/json - description: Verifies a password reset token - operationId: verify-password-reset-token - parameters: - - description: Password Reset Token Body - in: body - name: tokenBody - required: true - schema: - $ref: '#/definitions/models.VerifyPasswordResetTokenRequestBody' - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/utilities.SuccessResponse' - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "429": - description: Too Many Requests - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - security: - - Bearer: [] - summary: Verifies a password reset token - tags: - - auth - /categories/: - get: - description: Retrieves all categories - operationId: get-categories - parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: '#/definitions/models.Category' - type: array - "400": - description: Bad Request - schema: - type: string - "404": - description: Not Found - schema: - type: string - "500": - description: Internal Server Error - schema: - type: string - summary: Retrieve all categories - tags: - - category - post: - consumes: - - application/json - description: Creates a category - operationId: create-category - parameters: - - description: Category Body - in: body - name: categoryBody - required: true - schema: - $ref: '#/definitions/models.CategoryRequestBody' - produces: - - application/json - responses: - "201": - description: Created - schema: - $ref: '#/definitions/models.Category' - "400": - description: Bad Request - schema: - type: string - "401": - description: Unauthorized - schema: - type: string - "404": - description: Not Found - schema: - type: string - "409": - description: Conflict - schema: - type: string - "500": - description: Internal Server Error - schema: - type: string - summary: Creates a category - tags: - - category - /categories/{categoryID}/: - delete: - description: Deletes a category - operationId: delete-category - parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - produces: - - application/json - responses: - "204": - description: No Content - schema: - type: string - "400": - description: Bad Request - schema: - type: string - "401": - description: Unauthorized - schema: - type: string - "404": - description: Not Found - schema: - type: string - "500": - description: Internal Server Error - schema: - type: string - summary: Deletes a category - tags: - - category - get: - description: Retrieves a category - operationId: get-category - parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/models.Category' + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request - schema: - type: string + schema: {} "404": description: Not Found - schema: - type: string + schema: {} "500": description: Internal Server Error - schema: - type: string - summary: Retrieve a category + schema: {} + summary: Refreshes a user's access token tags: - - category - patch: + - auth + /auth/register: + post: consumes: - application/json - description: Updates a category - operationId: update-category + description: Registers a user + operationId: register-user parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Category Body + - description: User Body in: body - name: categoryBody + name: userBody required: true schema: - $ref: '#/definitions/models.CategoryRequestBody' + $ref: '#/definitions/base.CreateUserRequestBody' produces: - application/json responses: - "200": - description: OK + "201": + description: Created schema: - $ref: '#/definitions/models.Category' + $ref: '#/definitions/models.User' "400": description: Bad Request - schema: - type: string - "401": - description: Unauthorized - schema: - type: string + schema: {} "404": description: Not Found - schema: - type: string + schema: {} "500": description: Internal Server Error - schema: - type: string - summary: Updates a category + schema: {} + summary: Registers a user tags: - - category - /categories/{categoryID}/tags/: - get: - description: Retrieves all tags associated with a category - operationId: get-tags-by-category + - auth + /auth/send-code: + post: + consumes: + - application/json + description: Sends a verification code + operationId: send-verification-code parameters: - - description: Category ID - in: path - name: categoryID + - description: Email + in: body + name: email required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + schema: + type: string produces: - application/json responses: "200": description: OK schema: - items: - $ref: '#/definitions/models.Tag' - type: array + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} + "429": + description: Too Many Requests + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all tags by category + schema: {} + summary: Sends a verification code tags: - - category-tag - /categories/{categoryID}/tags/{tagID}/: - get: - description: Retrieves a tag associated with a category - operationId: get-tag-by-category + - auth + /auth/verify-email: + post: + consumes: + - application/json + description: Verifies an email + operationId: verify-email parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Tag ID - in: path - name: tagID + - description: Email Verification Token Body + in: body + name: tokenBody required: true - type: string + schema: + $ref: '#/definitions/base.VerifyEmailRequestBody' produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Tag' + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} + "429": + description: Too Many Requests + schema: {} "500": description: Internal Server Error + schema: {} + summary: Verifies an email + tags: + - auth + /auth/verify-reset: + post: + consumes: + - application/json + description: Verifies a password reset token + operationId: verify-password-reset-token + parameters: + - description: Password Reset Token Body + in: body + name: tokenBody + required: true + schema: + $ref: '#/definitions/base.VerifyPasswordResetTokenRequestBody' + produces: + - application/json + responses: + "200": + description: OK schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve a tag by category + $ref: '#/definitions/utilities.SuccessResponse' + "400": + description: Bad Request + schema: {} + "429": + description: Too Many Requests + schema: {} + "500": + description: Internal Server Error + schema: {} + security: + - Bearer: [] + summary: Verifies a password reset token tags: - - category-tag - /clubs/: + - auth + /categories/: get: - description: Retrieves all clubs - operationId: get-all-clubs + description: Retrieves all categories + operationId: get-categories parameters: - description: Limit in: query @@ -2539,175 +1726,108 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.Club' + $ref: '#/definitions/models.Category' type: array "400": description: Bad Request schema: - $ref: '#/definitions/errors.Error' + type: string + "404": + description: Not Found + schema: + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all clubs + type: string + summary: Retrieve all categories tags: - - club + - category post: consumes: - application/json - description: Creates a club - operationId: create-club + description: Creates a category + operationId: create-category parameters: - - description: Club + - description: Category Body in: body - name: club + name: categoryBody required: true schema: - $ref: '#/definitions/models.CreateClubRequestBody' + $ref: '#/definitions/categories.CategoryRequestBody' produces: - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Club' + $ref: '#/definitions/models.Category' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Create a club - tags: - - club - /clubs/{clubID}/: - delete: - description: Deletes a club - operationId: delete-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - produces: - - application/json - responses: - "204": - description: No Content schema: type: string - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' "401": description: Unauthorized schema: - $ref: '#/definitions/errors.Error' + type: string "404": description: Not Found schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Delete a club - tags: - - club - get: - description: Retrieves a club - operationId: get-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/models.Club' - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found + type: string + "409": + description: Conflict schema: - $ref: '#/definitions/errors.Error' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve a club + type: string + summary: Creates a category tags: - - club - patch: - consumes: - - application/json - description: Updates a club - operationId: update-club + - category + /categories/{categoryID}/: + delete: + description: Deletes a category + operationId: delete-category parameters: - - description: Club ID + - description: Category ID in: path - name: clubID + name: categoryID required: true type: string - - description: Club - in: body - name: club - required: true - schema: - $ref: '#/definitions/models.UpdateClubRequestBody' produces: - application/json responses: - "200": - description: OK + "204": + description: No Content schema: - $ref: '#/definitions/models.Club' + type: string "400": description: Bad Request schema: - $ref: '#/definitions/errors.Error' + type: string "401": description: Unauthorized schema: - $ref: '#/definitions/errors.Error' + type: string "404": description: Not Found schema: - $ref: '#/definitions/errors.Error' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Update a club + type: string + summary: Deletes a category tags: - - club - /clubs/{clubID}/contacts/: + - category get: - description: Retrieves all contacts associated with a club - operationId: get-contacts-by-club + description: Retrieves a category + operationId: get-category parameters: - - description: Club ID + - description: Category ID in: path - name: clubID + name: categoryID required: true type: string produces: @@ -2716,75 +1836,73 @@ paths: "200": description: OK schema: - items: - $ref: '#/definitions/models.Contact' - type: array + $ref: '#/definitions/models.Category' "400": description: Bad Request schema: - $ref: '#/definitions/errors.Error' + type: string "404": description: Not Found schema: - $ref: '#/definitions/errors.Error' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all contacts for a club + type: string + summary: Retrieve a category tags: - - club-contact - put: + - category + patch: consumes: - application/json - description: Creates a contact - operationId: put-contact + description: Updates a category + operationId: update-category parameters: - - description: Club ID + - description: Category ID in: path - name: clubID + name: categoryID required: true type: string - - description: Contact Body + - description: Category Body in: body - name: contactBody + name: categoryBody required: true schema: - $ref: '#/definitions/models.PutContactRequestBody' + $ref: '#/definitions/categories.CategoryRequestBody' produces: - application/json responses: - "201": - description: Created + "200": + description: OK schema: - $ref: '#/definitions/models.Contact' + $ref: '#/definitions/models.Category' "400": description: Bad Request schema: - $ref: '#/definitions/errors.Error' + type: string "401": description: Unauthorized schema: - $ref: '#/definitions/errors.Error' + type: string "404": description: Not Found schema: - $ref: '#/definitions/errors.Error' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Creates a contact + type: string + summary: Updates a category tags: - - club-contact - /clubs/{clubID}/events/: + - category + /categories/{categoryID}/tags/: get: - description: Retrieves all events associated with a club - operationId: get-events-by-club + description: Retrieves all tags associated with a category + operationId: get-tags-by-category parameters: - - description: Club ID + - description: Category ID in: path - name: clubID + name: categoryID required: true type: string - description: Limit @@ -2802,75 +1920,59 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.Event' + $ref: '#/definitions/models.Tag' type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all events for a club + schema: {} + summary: Retrieve all tags by category tags: - - club-event - /clubs/{clubID}/followers/: + - category-tag + /categories/{categoryID}/tags/{tagID}/: get: - description: Retrieves all followers associated with a club - operationId: get-followers-by-club + description: Retrieves a tag associated with a category + operationId: get-tag-by-category parameters: - - description: Club ID + - description: Category ID in: path - name: clubID + name: categoryID + required: true + type: string + - description: Tag ID + in: path + name: tagID required: true type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer produces: - application/json responses: "200": description: OK schema: - items: - $ref: '#/definitions/models.User' - type: array + $ref: '#/definitions/models.Tag' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all followers for a club + schema: {} + summary: Retrieve a tag by category tags: - - club-follower - /clubs/{clubID}/members/: + - category-tag + /clubs/: get: - description: Retrieves all members associated with a club - operationId: get-members-by-club + description: Retrieves all clubs + operationId: get-all-clubs parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - description: Limit in: query name: limit @@ -2886,188 +1988,86 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.User' + $ref: '#/definitions/models.Club' type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all members for a club + schema: {} + summary: Retrieve all clubs tags: - - club-member - /clubs/{clubID}/poc/: + - club post: consumes: - - multipart/form-data - description: Creates a point of contact associated with a club - operationId: create-point-of-contact-by-club + - application/json + description: Creates a club + operationId: create-club parameters: - - description: Club ID - in: path - name: clubID + - description: Club + in: body + name: club required: true - type: string + schema: + $ref: '#/definitions/base.CreateClubRequestBody' produces: - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.PointOfContact' + $ref: '#/definitions/models.Club' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Create a point of contact for a club + schema: {} + summary: Create a club tags: - - club-point-of-contact - /clubs/{clubID}/poc/{pocID}: + - club + /clubs/{clubID}/: delete: - description: Delete a point of contact associated with a club - operationId: delete-point-of-contact-by-club + description: Deletes a club + operationId: delete-club parameters: - description: Club ID in: path name: clubID required: true type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string produces: - application/json responses: "204": description: No Content - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Delete a point of contact for a club - tags: - - club-point-of-contact - patch: - consumes: - - multipart/form-data - description: Updates a point of contact photo associated with a club - operationId: update-point-of-contact-photo-by-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/models.PointOfContact' - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Update a point of contact photo for a club - tags: - - club-point-of-contact - put: - consumes: - - application/json - description: Updates a point of contact associated with a club - operationId: update-point-of-contact-by-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/models.PointOfContact' + type: string "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Update a point of contact for a club + schema: {} + summary: Delete a club tags: - - club-point-of-contact - /clubs/{clubID}/pocs/: + - club get: - description: Retrieves all point of contacts associated with a club - operationId: get-point-of-contacts-by-club + description: Retrieves a club + operationId: get-club parameters: - description: Club ID in: path @@ -3080,65 +2080,62 @@ paths: "200": description: OK schema: - items: - $ref: '#/definitions/models.PointOfContact' - type: array + $ref: '#/definitions/models.Club' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all point of contacts for a club + schema: {} + summary: Retrieve a club tags: - - club-point-of-contact - /clubs/{clubID}/pocs/{pocID}: - get: - description: Retrieves a point of contact associated with a club - operationId: get-point-of-contact-by-club + - club + patch: + consumes: + - application/json + description: Updates a club + operationId: update-club parameters: - description: Club ID in: path name: clubID required: true type: string - - description: Point of Contact ID - in: path - name: pocID + - description: Club + in: body + name: club required: true - type: string + schema: + $ref: '#/definitions/base.UpdateClubRequestBody' produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.PointOfContact' + $ref: '#/definitions/models.Club' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve a point of contact for a club + schema: {} + summary: Update a club tags: - - club-point-of-contact - /clubs/{clubID}/tags/: + - club + /clubs/{clubID}/contacts/: get: - description: Retrieves all tags associated with a club - operationId: get-tags-by-club + description: Retrieves all contacts associated with a club + operationId: get-contacts-by-club parameters: - description: Club ID in: path @@ -3152,114 +2149,108 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.Tag' + $ref: '#/definitions/models.Contact' type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all tags for a club + schema: {} + summary: Retrieve all contacts for a club tags: - - club-tag - post: + - club-contact + put: consumes: - application/json - description: Creates tags for a club - operationId: create-club-tags + description: Creates a contact + operationId: put-contact parameters: - description: Club ID in: path name: clubID required: true type: string - - description: Club Tags Body + - description: Contact Body in: body - name: clubTagsBody + name: contactBody required: true schema: - $ref: '#/definitions/models.CreateClubTagsRequestBody' + $ref: '#/definitions/contacts.PutContactRequestBody' produces: - application/json responses: "201": description: Created schema: - items: - $ref: '#/definitions/models.Tag' - type: array + $ref: '#/definitions/models.Contact' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Create club tags + schema: {} + summary: Creates a contact tags: - - club-tag - /clubs/{clubID}/tags/{tagID}/: - delete: - description: Deletes a tag associated with a club - operationId: delete-tag-by-club + - club-contact + /clubs/{clubID}/events/: + get: + description: Retrieves all events associated with a club + operationId: get-events-by-club parameters: - description: Club ID in: path name: clubID required: true type: string - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - application/json responses: - "204": - description: No Content + "200": + description: OK schema: - type: string + items: + $ref: '#/definitions/models.Event' + type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Delete a tag for a club + schema: {} + summary: Retrieve all events for a club tags: - - club-tag - /contacts/: + - club-event + /clubs/{clubID}/followers/: get: - description: Retrieves all contacts - operationId: get-contacts + description: Retrieves all followers associated with a club + operationId: get-followers-by-club parameters: + - description: Club ID + in: path + name: clubID + required: true + type: string - description: Limit in: query name: limit @@ -3275,95 +2266,66 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.Contact' + $ref: '#/definitions/models.User' type: array "400": description: Bad Request - schema: - type: string + schema: {} "404": description: Not Found - schema: - type: string + schema: {} "500": description: Internal Server Error - schema: - type: string - summary: Retrieve all contacts + schema: {} + summary: Retrieve all followers for a club tags: - - contact - /contacts/{contactID}/: + - club-follower + /clubs/{clubID}/members/: delete: - consumes: - - application/json - description: Deletes a contact - operationId: delete-contact + description: Deletes a member associated with a club + operationId: delete-member-from-club parameters: - - description: Contact ID + - description: Club ID in: path - name: contactID + name: clubID required: true type: string - produces: - - application/json - responses: - "201": - description: Created - schema: - $ref: '#/definitions/models.Contact' - "400": - description: Bad Request - schema: - type: string - "404": - description: Not Found - schema: - type: string - "500": - description: Internal Server Error - schema: - type: string - summary: Deletes a contact - tags: - - contact - get: - consumes: - - application/json - description: Retrieves a contact by id - operationId: get-contact - parameters: - - description: Contact ID + - description: User ID in: path - name: contactID + name: userID required: true type: string produces: - application/json responses: - "201": - description: Created + "204": + description: No Content schema: - $ref: '#/definitions/models.Contact' + $ref: '#/definitions/models.User' "400": description: Bad Request - schema: - type: string + schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found - schema: - type: string + schema: {} "500": description: Internal Server Error - schema: - type: string - summary: Retrieves a contact + schema: {} + summary: Delete a member from a club tags: - - contact - /events/: + - club-member get: - description: Retrieves all events - operationId: get-all-events + description: Retrieves all members associated with a club + operationId: get-members-by-club parameters: + - description: Club ID + in: path + name: clubID + required: true + type: string - description: Limit in: query name: limit @@ -3379,69 +2341,108 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.Event' + $ref: '#/definitions/models.User' type: array "400": description: Bad Request + schema: {} + "401": + description: Unauthorized + schema: {} + "404": + description: Not Found + schema: {} + "500": + description: Internal Server Error + schema: {} + summary: Retrieve all members for a club + tags: + - club-member + post: + consumes: + - application/json + description: Creates a new member associated with a club + operationId: create-member-for-club + parameters: + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: User ID + in: path + name: userID + required: true + type: string + produces: + - application/json + responses: + "201": + description: Created schema: - $ref: '#/definitions/errors.Error' + $ref: '#/definitions/models.User' + "400": + description: Bad Request + schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all events + schema: {} + summary: Create a new member for a club tags: - - event + - club-member + /clubs/{clubID}/poc/: post: consumes: - - application/json - description: Creates an event - operationId: create-event + - multipart/form-data + description: Creates a point of contact associated with a club + operationId: create-point-of-contact-by-club parameters: - - description: Event Body - in: body - name: event + - description: Club ID + in: path + name: clubID required: true - schema: - $ref: '#/definitions/models.CreateEventRequestBody' + type: string produces: - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Event' + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Create an event + schema: {} + summary: Create a point of contact for a club tags: - - event - /events/{eventID}/: + - club-point-of-contact + /clubs/{clubID}/poc/{pocID}: delete: - description: Deletes an event - operationId: delete-event + description: Delete a point of contact associated with a club + operationId: delete-point-of-contact-by-club parameters: - - description: Event ID + - description: Club ID in: path - name: eventID + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID required: true type: string produces: @@ -3449,34 +2450,70 @@ paths: responses: "204": description: No Content - schema: - type: string "400": description: Bad Request + schema: {} + "404": + description: Not Found + schema: {} + "500": + description: Internal Server Error + schema: {} + summary: Delete a point of contact for a club + tags: + - club-point-of-contact + patch: + consumes: + - multipart/form-data + description: Updates a point of contact photo associated with a club + operationId: update-point-of-contact-photo-by-club + parameters: + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK schema: - $ref: '#/definitions/errors.Error' + $ref: '#/definitions/models.PointOfContact' + "400": + description: Bad Request + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Delete an event + schema: {} + summary: Update a point of contact photo for a club tags: - - event - get: - description: Retrieves an event - operationId: get-event + - club-point-of-contact + put: + consumes: + - application/json + description: Updates a point of contact associated with a club + operationId: update-point-of-contact-by-club parameters: - - description: Event ID + - description: Club ID in: path - name: eventID + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID required: true type: string produces: @@ -3485,30 +2522,30 @@ paths: "200": description: OK schema: - $ref: '#/definitions/models.Event' + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve an event + schema: {} + summary: Update a point of contact for a club tags: - - event - /events/{eventID}/hosts: + - club-point-of-contact + /clubs/{clubID}/pocs/: get: - description: Retrieves all hosts associated with an event - operationId: get-hosts-by-event + description: Retrieves all point of contacts associated with a club + operationId: get-point-of-contacts-by-club parameters: - - description: Event ID + - description: Club ID in: path - name: eventID + name: clubID required: true type: string produces: @@ -3518,66 +2555,62 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.Club' + $ref: '#/definitions/models.PointOfContact' type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all hosts by event + schema: {} + summary: Retrieve all point of contacts for a club tags: - - event - /events/{eventID}/series/: - delete: - description: Deletes all series associated with an event - operationId: delete-series-by-event + - club-point-of-contact + /clubs/{clubID}/pocs/{pocID}: + get: + description: Retrieves a point of contact associated with a club + operationId: get-point-of-contact-by-club parameters: - - description: Event ID + - description: Club ID in: path - name: eventID + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID required: true type: string produces: - application/json responses: - "204": - description: No Content + "200": + description: OK schema: - type: string + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Delete all series by event + schema: {} + summary: Retrieve a point of contact for a club tags: - - event + - club-point-of-contact + /clubs/{clubID}/tags/: get: - description: Retrieves all series associated with an event - operationId: get-series-by-event + description: Retrieves all tags associated with a club + operationId: get-tags-by-club parameters: - - description: Event ID + - description: Club ID in: path - name: eventID + name: clubID required: true type: string produces: @@ -3587,79 +2620,74 @@ paths: description: OK schema: items: - $ref: '#/definitions/models.Series' + $ref: '#/definitions/models.Tag' type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all series by event + schema: {} + summary: Retrieve all tags for a club tags: - - event - patch: + - club-tag + post: consumes: - application/json - description: Creates a series - operationId: create-series + description: Creates tags for a club + operationId: create-club-tags parameters: - - description: Event ID + - description: Club ID in: path - name: eventID + name: clubID required: true type: string - - description: Series Body + - description: Club Tags Body in: body - name: seriesBody + name: clubTagsBody required: true schema: - $ref: '#/definitions/models.UpdateEventRequestBody' + $ref: '#/definitions/tags.CreateClubTagsRequestBody' produces: - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Series' + items: + $ref: '#/definitions/models.Tag' + type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Create a series + schema: {} + summary: Create club tags tags: - - event - /events/{eventID}/series/{seriesID}/: + - club-tag + /clubs/{clubID}/tags/{tagID}/: delete: - description: Deletes a series by ID - operationId: delete-series-by-id + description: Deletes a tag associated with a club + operationId: delete-tag-by-club parameters: - - description: Event ID + - description: Club ID in: path - name: eventID + name: clubID required: true type: string - - description: Series ID + - description: Tag ID in: path - name: seriesID + name: tagID required: true type: string produces: @@ -3668,109 +2696,164 @@ paths: "204": description: No Content schema: - type: string + type: string + "400": + description: Bad Request + schema: {} + "401": + description: Unauthorized + schema: {} + "404": + description: Not Found + schema: {} + "500": + description: Internal Server Error + schema: {} + summary: Delete a tag for a club + tags: + - club-tag + /contacts/: + get: + description: Retrieves all contacts + operationId: get-contacts + parameters: + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/models.Contact' + type: array + "400": + description: Bad Request + schema: + type: string + "404": + description: Not Found + schema: + type: string + "500": + description: Internal Server Error + schema: + type: string + summary: Retrieve all contacts + tags: + - contact + /contacts/{contactID}/: + delete: + consumes: + - application/json + description: Deletes a contact + operationId: delete-contact + parameters: + - description: Contact ID + in: path + name: contactID + required: true + type: string + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/models.Contact' "400": description: Bad Request schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + type: string "404": description: Not Found schema: - $ref: '#/definitions/errors.Error' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Delete a series by ID + type: string + summary: Deletes a contact tags: - - event + - contact get: - description: Retrieves a series by ID - operationId: get-series-by-id + consumes: + - application/json + description: Retrieves a contact by id + operationId: get-contact parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series ID + - description: Contact ID in: path - name: seriesID + name: contactID required: true type: string produces: - application/json responses: - "200": - description: OK + "201": + description: Created schema: - $ref: '#/definitions/models.Series' + $ref: '#/definitions/models.Contact' "400": description: Bad Request schema: - $ref: '#/definitions/errors.Error' + type: string "404": description: Not Found schema: - $ref: '#/definitions/errors.Error' + type: string "500": description: Internal Server Error schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve a series by ID + type: string + summary: Retrieves a contact tags: - - event - patch: - consumes: - - application/json - description: Updates a series by event ID - operationId: update-series-by-event-id + - contact + /events/: + get: + description: Retrieves all events + operationId: get-all-events parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series Body - in: body - name: seriesBody - required: true - schema: - $ref: '#/definitions/models.UpdateSeriesRequestBody' + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Series' + items: + $ref: '#/definitions/models.Event' + type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Update a series by event ID + schema: {} + summary: Retrieve all events tags: - event - /events/{eventID}/tags: + /events/{eventID}/: get: - description: Retrieves all tags associated with an event - operationId: get-tags-by-event + description: Retrieves an event + operationId: get-event parameters: - description: Event ID in: path @@ -3783,22 +2866,17 @@ paths: "200": description: OK schema: - items: - $ref: '#/definitions/models.Tag' - type: array + $ref: '#/definitions/models.Event' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Retrieve all tags by event + schema: {} + summary: Retrieve an event tags: - event /files/: @@ -3825,20 +2903,16 @@ paths: type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve all files tags: - file @@ -3853,7 +2927,7 @@ paths: name: file required: true schema: - $ref: '#/definitions/models.CreateFileRequestBody' + $ref: '#/definitions/base.CreateFileRequestBody' produces: - application/json responses: @@ -3863,20 +2937,16 @@ paths: $ref: '#/definitions/models.File' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Create a file tags: - file @@ -3899,20 +2969,16 @@ paths: $ref: '#/definitions/models.File' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Delete a file tags: - file @@ -3934,20 +3000,16 @@ paths: $ref: '#/definitions/models.File' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve a file tags: - file @@ -4044,16 +3106,13 @@ paths: type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve all tags tags: - tag @@ -4069,7 +3128,7 @@ paths: name: tagBody required: true schema: - $ref: '#/definitions/models.CreateTagRequestBody' + $ref: '#/definitions/base.CreateTagRequestBody' produces: - application/json responses: @@ -4079,20 +3138,16 @@ paths: $ref: '#/definitions/models.Tag' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Create a tag tags: - tag @@ -4115,20 +3170,16 @@ paths: type: string "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Delete a tag tags: - tag @@ -4150,16 +3201,13 @@ paths: $ref: '#/definitions/models.Tag' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve a tag tags: - tag @@ -4179,7 +3227,7 @@ paths: name: tag required: true schema: - $ref: '#/definitions/models.UpdateTagRequestBody' + $ref: '#/definitions/base.UpdateTagRequestBody' produces: - application/json responses: @@ -4189,20 +3237,16 @@ paths: $ref: '#/definitions/models.Tag' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Update a tag tags: - tag @@ -4230,61 +3274,16 @@ paths: type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve all users tags: - user - post: - consumes: - - application/json - description: Creates a user - operationId: create-user - parameters: - - description: User Body - in: body - name: userBody - required: true - schema: - $ref: '#/definitions/models.CreateUserRequestBody' - produces: - - application/json - responses: - "201": - description: Created - schema: - $ref: '#/definitions/models.User' - "400": - description: Bad Request - schema: - $ref: '#/definitions/errors.Error' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' - "409": - description: Conflict - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Create a user - tags: - - user /users/{userID}/: delete: description: Deletes a user @@ -4304,20 +3303,16 @@ paths: type: string "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Delete a user tags: - user @@ -4339,20 +3334,16 @@ paths: $ref: '#/definitions/models.User' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve a user tags: - user @@ -4372,7 +3363,7 @@ paths: name: userBody required: true schema: - $ref: '#/definitions/models.UpdateUserRequestBody' + $ref: '#/definitions/base.UpdateUserRequestBody' produces: - application/json responses: @@ -4382,20 +3373,16 @@ paths: $ref: '#/definitions/models.User' "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Update a user tags: - user @@ -4420,20 +3407,16 @@ paths: type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve all clubs a user is following tags: - user-follower @@ -4463,16 +3446,13 @@ paths: $ref: '#/definitions/utilities.SuccessResponse' "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Unfollow a club tags: - user-follower @@ -4501,16 +3481,13 @@ paths: $ref: '#/definitions/utilities.SuccessResponse' "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Follow a club tags: - user-follower @@ -4535,100 +3512,19 @@ paths: type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve all clubs a user is a member of tags: - user-member - /users/{userID}/member/{clubID}/: - delete: - consumes: - - application/json - description: Leave a club - operationId: delete-membership - parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Club ID - in: path - name: clubID - required: true - type: string - produces: - - application/json - responses: - "204": - description: No Content - schema: - $ref: '#/definitions/utilities.SuccessResponse' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Leave a club - tags: - - user-member - post: - consumes: - - application/json - description: Join a club - operationId: create-membership - parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Club ID - in: path - name: clubID - required: true - type: string - produces: - - application/json - responses: - "201": - description: Created - schema: - $ref: '#/definitions/utilities.SuccessResponse' - "401": - description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' - "404": - description: Not Found - schema: - $ref: '#/definitions/errors.Error' - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' - summary: Join a club - tags: - - user-member /users/{userID}/password: patch: consumes: @@ -4646,7 +3542,7 @@ paths: name: passwordBody required: true schema: - $ref: '#/definitions/models.UpdatePasswordRequestBody' + $ref: '#/definitions/auth.UpdatePasswordRequestBody' produces: - application/json responses: @@ -4656,20 +3552,16 @@ paths: type: string "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Update a user's password tags: - user @@ -4692,20 +3584,16 @@ paths: description: Created "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Create user tags tags: - user-tag @@ -4729,20 +3617,16 @@ paths: type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Retrieve all tags for a user tags: - user-tag @@ -4762,7 +3646,7 @@ paths: name: userTagsBody required: true schema: - $ref: '#/definitions/tag.CreateUserTagsBody' + $ref: '#/definitions/tags.CreateUserTagsBody' produces: - application/json responses: @@ -4774,20 +3658,16 @@ paths: type: array "400": description: Bad Request - schema: - $ref: '#/definitions/errors.Error' + schema: {} "401": description: Unauthorized - schema: - $ref: '#/definitions/errors.Error' + schema: {} "404": description: Not Found - schema: - $ref: '#/definitions/errors.Error' + schema: {} "500": description: Internal Server Error - schema: - $ref: '#/definitions/errors.Error' + schema: {} summary: Create user tags tags: - user-tag diff --git a/backend/entities/auth/base/controller.go b/backend/entities/auth/base/controller.go index 52594fce9..48396131e 100644 --- a/backend/entities/auth/base/controller.go +++ b/backend/entities/auth/base/controller.go @@ -1,9 +1,11 @@ package base import ( + "net/http" + "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" + users "github.com/GenerateNU/sac/backend/entities/users/base" "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -24,63 +26,97 @@ func NewAuthController(authService AuthServiceInterface) *AuthController { // @Tags auth // @Accept json // @Produce json -// @Param loginBody body models.LoginUserResponseBody true "Login Body" +// @Param loginBody body authEntities.LoginResponseBody true "Login Body" // @Success 200 {object} models.User -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /auth/login [post] func (a *AuthController) Login(c *fiber.Ctx) error { - var userBody models.LoginUserResponseBody + var userBody authEntities.LoginResponseBody if err := c.BodyParser(&userBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } user, tokens, err := a.authService.Login(userBody) if err != nil { - return err.FiberError(c) + return err + } + + err = auth.SetResponseTokens(c, tokens) + if err != nil { + return err + } + + return c.Status(http.StatusOK).JSON(user) +} + +// Register godoc +// +// @Summary Registers a user +// @Description Registers a user +// @ID register-user +// @Tags auth +// @Accept json +// @Produce json +// @Param userBody body CreateUserRequestBody true "User Body" +// @Success 201 {object} models.User +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /auth/register [post] +func (a *AuthController) Register(c *fiber.Ctx) error { + var userBody users.CreateUserRequestBody + + if err := c.BodyParser(&userBody); err != nil { + return utilities.InvalidJSON() + } + + user, tokens, err := a.authService.Register(userBody) + if err != nil { + return err } err = auth.SetResponseTokens(c, tokens) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(user) + return c.Status(http.StatusCreated).JSON(user) } // Refresh godoc // -// @Summary Refreshes a user's access token -// @Description Refreshes a user's access token +// @Summary Refreshes a user's access token and returns a new pair of tokens +// @Description Refreshes a user's access token and returns a new pair of tokens // @ID refresh-user // @Tags auth // @Accept json // @Produce json // @Success 200 {object} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /auth/refresh [post] func (a *AuthController) Refresh(c *fiber.Ctx) error { - var refreshBody models.RefreshTokenRequestBody + var refreshBody RefreshTokenCookieBody - if err := c.BodyParser(&refreshBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + if err := c.CookieParser(&refreshBody); err != nil { + return utilities.InvalidJSON() } tokens, err := a.authService.Refresh(refreshBody.RefreshToken) if err != nil { - return err.FiberError(c) + return err } err = auth.SetResponseTokens(c, tokens) if err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusOK, "success") + return utilities.FiberMessage(c, http.StatusOK, "success") } // Logout godoc @@ -96,10 +132,10 @@ func (a *AuthController) Refresh(c *fiber.Ctx) error { func (a *AuthController) Logout(c *fiber.Ctx) error { err := a.authService.Logout(c) if err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusOK, "success") + return utilities.FiberMessage(c, http.StatusOK, "success") } // ForgotPassword godoc @@ -112,22 +148,22 @@ func (a *AuthController) Logout(c *fiber.Ctx) error { // @Produce json // @Param email body string true "Email" // @Success 200 {object} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 429 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 429 {object} error +// @Failure 500 {object} error // @Router /auth/forgot-password [post] func (a *AuthController) ForgotPassword(c *fiber.Ctx) error { - var emailBody models.EmailRequestBody + var emailBody EmailRequestBody if err := c.BodyParser(&emailBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } if err := a.authService.ForgotPassword(emailBody.Email); err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusOK, "success") + return utilities.FiberMessage(c, http.StatusOK, "success") } // VerifyPasswordResetToken godoc @@ -138,25 +174,25 @@ func (a *AuthController) ForgotPassword(c *fiber.Ctx) error { // @Tags auth // @Accept json // @Produce json -// @Param tokenBody body models.VerifyPasswordResetTokenRequestBody true "Password Reset Token Body" +// @Param tokenBody body VerifyPasswordResetTokenRequestBody true "Password Reset Token Body" // @Security Bearer // @Success 200 {object} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 429 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 429 {object} error +// @Failure 500 {object} error // @Router /auth/verify-reset [post] func (a *AuthController) VerifyPasswordResetToken(c *fiber.Ctx) error { - var tokenBody models.VerifyPasswordResetTokenRequestBody + var tokenBody VerifyPasswordResetTokenRequestBody if err := c.BodyParser(&tokenBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } if err := a.authService.VerifyPasswordResetToken(tokenBody); err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusOK, "success") + return utilities.FiberMessage(c, http.StatusOK, "success") } // SendCode godoc @@ -169,22 +205,22 @@ func (a *AuthController) VerifyPasswordResetToken(c *fiber.Ctx) error { // @Produce json // @Param email body string true "Email" // @Success 200 {object} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 429 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 429 {object} error +// @Failure 500 {object} error // @Router /auth/send-code [post] func (a *AuthController) SendCode(c *fiber.Ctx) error { - var emailBody models.EmailRequestBody + var emailBody EmailRequestBody if err := c.BodyParser(&emailBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } if err := a.authService.SendCode(emailBody.Email); err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusOK, "success") + return utilities.FiberMessage(c, http.StatusOK, "success") } // VerifyEmail godoc @@ -195,22 +231,22 @@ func (a *AuthController) SendCode(c *fiber.Ctx) error { // @Tags auth // @Accept json // @Produce json -// @Param tokenBody body models.VerifyEmailRequestBody true "Email Verification Token Body" +// @Param tokenBody body VerifyEmailRequestBody true "Email Verification Token Body" // @Success 200 {object} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 429 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 429 {object} error +// @Failure 500 {object} error // @Router /auth/verify-email [post] func (a *AuthController) VerifyEmail(c *fiber.Ctx) error { - var tokenBody models.VerifyEmailRequestBody + var tokenBody VerifyEmailRequestBody if err := c.BodyParser(&tokenBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } if err := a.authService.VerifyEmail(tokenBody); err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusOK, "success") + return utilities.FiberMessage(c, http.StatusOK, "success") } diff --git a/backend/entities/auth/base/models.go b/backend/entities/auth/base/models.go new file mode 100644 index 000000000..a15a48349 --- /dev/null +++ b/backend/entities/auth/base/models.go @@ -0,0 +1,20 @@ +package base + +type VerifyEmailRequestBody struct { + Email string `json:"email" validate:"required,email"` + Token string `json:"token" validate:"required,len=6"` +} + +type VerifyPasswordResetTokenRequestBody struct { + Token string `json:"token" validate:"required"` + NewPassword string `json:"new_password" validate:"required,min=8,password"` + VerifyNewPassword string `json:"verify_new_password" validate:"required,min=8,password,eqfield=NewPassword"` +} + +type EmailRequestBody struct { + Email string `json:"email" validate:"required,email"` +} + +type RefreshTokenCookieBody struct { + RefreshToken string `cookie:"refresh_token" validate:"required"` +} diff --git a/backend/entities/auth/base/routes.go b/backend/entities/auth/base/routes.go index 5000e1f5e..b79cbd818 100644 --- a/backend/entities/auth/base/routes.go +++ b/backend/entities/auth/base/routes.go @@ -10,6 +10,7 @@ func Auth(params types.RouteParams) { // api/v1/auth/* auth := params.Router.Group("/auth") + auth.Post("/register", authController.Register) auth.Post("/logout", authController.Logout) auth.Post("/login", authController.Login) auth.Post("/refresh", authController.Refresh) diff --git a/backend/entities/auth/base/service.go b/backend/entities/auth/base/service.go index bc68504e6..c2ebc4371 100644 --- a/backend/entities/auth/base/service.go +++ b/backend/entities/auth/base/service.go @@ -1,12 +1,17 @@ package base import ( + "errors" + "fmt" + "log/slog" "time" "github.com/GenerateNU/sac/backend/auth" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/users" - "github.com/GenerateNU/sac/backend/errors" + usersEntities "github.com/GenerateNU/sac/backend/entities/users/base" + "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" @@ -16,16 +21,17 @@ import ( ) type AuthServiceInterface interface { - GetRole(id string) (*models.UserRole, *errors.Error) - Login(userBody models.LoginUserResponseBody) (*models.User, *auth.Token, *errors.Error) - Refresh(refreshToken string) (*auth.Token, *errors.Error) - Logout(c *fiber.Ctx) *errors.Error + GetRole(id string) (*models.UserRole, error) + Register(userBody usersEntities.CreateUserRequestBody) (*models.User, *auth.Token, error) + Login(userBody authEntities.LoginResponseBody) (*models.User, *auth.Token, error) + Refresh(refreshToken string) (*auth.Token, error) + Logout(c *fiber.Ctx) error - SendCode(email string) *errors.Error - VerifyEmail(emailBody models.VerifyEmailRequestBody) *errors.Error + SendCode(email string) error + VerifyEmail(emailBody VerifyEmailRequestBody) error - ForgotPassword(email string) *errors.Error - VerifyPasswordResetToken(passwordBody models.VerifyPasswordResetTokenRequestBody) *errors.Error + ForgotPassword(email string) error + VerifyPasswordResetToken(passwordBody VerifyPasswordResetTokenRequestBody) error } type AuthService struct { @@ -36,23 +42,19 @@ func NewAuthService(serviceParams types.ServiceParams) AuthServiceInterface { return &AuthService{serviceParams} } -func (a *AuthService) Login(loginBody models.LoginUserResponseBody) (*models.User, *auth.Token, *errors.Error) { - if err := a.Validate.Struct(loginBody); err != nil { - return nil, nil, &errors.FailedToValidateUser - } - - if pwordValErr := auth.ValidatePassword(loginBody.Password); pwordValErr != nil { - return nil, nil, pwordValErr +func (a *AuthService) Login(loginBody authEntities.LoginResponseBody) (*models.User, *auth.Token, error) { + if err := utilities.Validate(a.Validate, loginBody, *utilities.NewMaybeError("password", auth.ValidatePassword(loginBody.Password))); err != nil { + return nil, nil, err } - user, getUserByEmailErr := users.GetUserByEmail(a.DB, loginBody.Email) - if getUserByEmailErr != nil { - return nil, nil, getUserByEmailErr + user, err := users.GetUserByEmail(a.DB, loginBody.Email) + if err != nil { + return nil, nil, err } - correct, passwordErr := auth.CompareHash(loginBody.Password, user.PasswordHash) - if passwordErr != nil || !correct { - return nil, nil, &errors.FailedToValidateUser + correct, err := auth.CompareHash(loginBody.Password, user.PasswordHash) + if err != nil || !correct { + return nil, nil, err } tokens, err := a.JWT.GenerateTokenPair(auth.Claims{ @@ -70,21 +72,62 @@ func (a *AuthService) Login(loginBody models.LoginUserResponseBody) (*models.Use }, }) if err != nil { - return nil, nil, &errors.FailedToGenerateToken + return nil, nil, err + } + + return user, tokens, nil +} + +func (a *AuthService) Register(userBody usersEntities.CreateUserRequestBody) (*models.User, *auth.Token, error) { + if err := utilities.Validate(a.Validate, userBody, *utilities.NewMaybeError("password", auth.ValidatePassword(userBody.Password))); err != nil { + return nil, nil, err + } + + user, err := utilities.MapJsonTags(userBody, &models.User{}) + if err != nil { + return nil, nil, err + } + + user.Role = models.Student + + passwordHash, err := auth.ComputeHash(userBody.Password) + if err != nil { + return nil, nil, err + } + + user.Email = utilities.NormalizeEmail(userBody.Email) + user.PasswordHash = *passwordHash + + if err := a.Integrations.Email.SendWelcomeEmail(fmt.Sprintf("%s %s", user.FirstName, user.LastName), user.Email); err != nil { + return nil, nil, fmt.Errorf("failed to send welcome email: %w", err) + } + + user, err = CreateUser(a.DB, user) + if err != nil { + return nil, nil, err + } + + if err := a.SendCode(user.Email); err != nil { + return nil, nil, err + } + + _, tokens, err := a.Login(authEntities.LoginResponseBody{Email: user.Email, Password: userBody.Password}) + if err != nil { + return nil, nil, err } return user, tokens, nil } -func (a *AuthService) Refresh(refreshToken string) (*auth.Token, *errors.Error) { +func (a *AuthService) Refresh(refreshToken string) (*auth.Token, error) { claims, err := a.JWT.ExtractClaims(refreshToken, auth.RefreshToken) if err != nil { - return nil, &errors.FailedToExtractClaims + return nil, err } - role, roleErr := a.GetRole(claims["iss"].(string)) - if roleErr != nil { - return nil, roleErr + role, err := a.GetRole(claims["iss"].(string)) + if err != nil { + return nil, err } tokens, err := a.JWT.GenerateTokenPair(auth.Claims{ @@ -102,16 +145,16 @@ func (a *AuthService) Refresh(refreshToken string) (*auth.Token, *errors.Error) }, }) if err != nil { - return nil, &errors.FailedToGenerateToken + return nil, err } return tokens, nil } -func (a *AuthService) GetRole(id string) (*models.UserRole, *errors.Error) { - idAsUUID, idErr := utilities.ValidateID(id) - if idErr != nil { - return nil, idErr +func (a *AuthService) GetRole(id string) (*models.UserRole, error) { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return nil, err } user, err := users.GetUser(a.DB, *idAsUUID) @@ -122,63 +165,61 @@ func (a *AuthService) GetRole(id string) (*models.UserRole, *errors.Error) { return &user.Role, nil } -func (a *AuthService) ForgotPassword(email string) *errors.Error { +func (a *AuthService) ForgotPassword(email string) error { user, err := users.GetUserByEmail(a.DB, email) if err != nil { return nil } - activeToken, tokenErr := GetActiveTokenByUserID(a.DB, user.ID, models.PasswordResetType) - if tokenErr != nil { - if tokenErr != &errors.TokenNotFound { - return tokenErr + activeToken, err := GetActiveTokenByUserID(a.DB, user.ID, models.PasswordResetType) + if err != nil { + if !utilities.IsNotFound(err) { + return err } } if activeToken != nil { - sendErr := a.Integrations.Email.SendPasswordResetEmail(user.FirstName, user.Email, activeToken.Token) - if sendErr != nil { - return &errors.FailedToSendEmail + err := a.Integrations.Email.SendPasswordResetEmail(user.FirstName, user.Email, activeToken.Token) + if err != nil { + return err } return nil } - token, generateErr := auth.GenerateURLSafeToken(64) - if generateErr != nil { - return &errors.FailedToGenerateToken + token, err := auth.GenerateURLSafeToken(64) + if err != nil { + return err } - saveErr := SaveToken(a.DB, user.ID, *token, models.PasswordResetType, time.Now().Add(time.Hour*24).UTC()) - if saveErr != nil { - return saveErr + if err := SaveToken(a.DB, user.ID, *token, models.PasswordResetType, time.Now().Add(time.Hour*24).UTC()); err != nil { + return err } - sendErr := a.Integrations.Email.SendPasswordResetEmail(user.FirstName, user.Email, *token) - if sendErr != nil { - return sendErr + if err := a.Integrations.Email.SendPasswordResetEmail(user.FirstName, user.Email, *token); err != nil { + return err } return nil } -func (a *AuthService) VerifyPasswordResetToken(passwordBody models.VerifyPasswordResetTokenRequestBody) *errors.Error { - if err := a.Validate.Struct(passwordBody); err != nil { - return &errors.FailedToValidateUser +func (a *AuthService) VerifyPasswordResetToken(passwordBody VerifyPasswordResetTokenRequestBody) error { + if err := utilities.Validate(a.Validate, passwordBody); err != nil { + return err } - token, tokenErr := GetToken(a.DB, passwordBody.Token, models.PasswordResetType) - if tokenErr != nil { - return tokenErr + token, err := GetToken(a.DB, passwordBody.Token, models.PasswordResetType) + if err != nil { + return err } if token.ExpiresAt.Before(time.Now().UTC()) { - return &errors.TokenExpired + return utilities.Unauthorized() } - hash, hashErr := auth.ComputeHash(passwordBody.NewPassword) - if hashErr != nil { - return &errors.FailedToValidateUser + hash, err := auth.ComputeHash(passwordBody.NewPassword) + if err != nil { + return fmt.Errorf("failed to hash password: %w", err) } tx := a.DB.Begin() @@ -188,73 +229,68 @@ func (a *AuthService) VerifyPasswordResetToken(passwordBody models.VerifyPasswor } }() - updateErr := users.UpdatePassword(tx, token.UserID, *hash) - if updateErr != nil { + if err := users.UpdatePassword(tx, token.UserID, *hash); err != nil { tx.Rollback() - return updateErr + return err } - deleteErr := DeleteToken(tx, passwordBody.Token, models.PasswordResetType) - if deleteErr != nil { + if err := DeleteToken(tx, passwordBody.Token, models.PasswordResetType); err != nil { tx.Rollback() - return deleteErr + return err } if err := tx.Commit().Error; err != nil { tx.Rollback() - return &errors.FailedToUpdatePassword + return err } return nil } -func (a *AuthService) SendCode(email string) *errors.Error { +func (a *AuthService) SendCode(email string) error { user, err := users.GetUserByEmail(a.DB, email) if err != nil { return err } if user.IsVerified { - return &errors.EmailAlreadyVerified + return fmt.Errorf("user is already verified") } - activeOTP, tokenErr := GetActiveTokenByUserID(a.DB, user.ID, models.EmailVerificationType) - if tokenErr != nil { - if tokenErr != &errors.TokenNotFound { - return tokenErr + activeOTP, err := GetActiveTokenByUserID(a.DB, user.ID, models.EmailVerificationType) + if err != nil { + if !utilities.IsNotFound(err) { + return err } } if activeOTP != nil { - sendErr := a.Integrations.Email.SendEmailVerification(user.Email, activeOTP.Token) - if sendErr != nil { - return &errors.FailedToSendEmail + if err := a.Integrations.Email.SendEmailVerification(user.Email, activeOTP.Token); err != nil { + return err } return nil } - otp, otpErr := auth.GenerateOTP(6) - if otpErr != nil { - return &errors.FailedToGenerateOTP + otp, err := auth.GenerateOTP(6) + if err != nil { + return fmt.Errorf("failed to generate OTP: %w", err) } - saveErr := SaveToken(a.DB, user.ID, *otp, models.EmailVerificationType, time.Now().Add(time.Minute*5).UTC()) - if saveErr != nil { - return saveErr + if err := SaveToken(a.DB, user.ID, *otp, models.EmailVerificationType, time.Now().Add(time.Minute*5).UTC()); err != nil { + return err } - sendErr := a.Integrations.Email.SendEmailVerification(user.Email, *otp) - if sendErr != nil { - return &errors.FailedToSendEmail + if err := a.Integrations.Email.SendEmailVerification(user.Email, *otp); err != nil { + return err } return nil } -func verifyEmailHelper(user *models.User, token string, db *gorm.DB) *errors.Error { +func verifyEmailHelper(user *models.User, token string, db *gorm.DB) error { if user.IsVerified { - return &errors.EmailAlreadyVerified + return fmt.Errorf("user is already verified") } otp, otpErr := GetToken(db, token, models.EmailVerificationType) @@ -263,19 +299,20 @@ func verifyEmailHelper(user *models.User, token string, db *gorm.DB) *errors.Err } if otp.Token != token { - return &errors.InvalidOTP + slog.Error("invalid otp", "otp", otp.Token, "token", token) + return utilities.BadRequest(errors.New("invalid otp")) } if otp.ExpiresAt.Before(time.Now().UTC()) { - return &errors.OTPExpired + return utilities.BadRequest(errors.New("otp expired")) } return nil } -func (a *AuthService) VerifyEmail(emailBody models.VerifyEmailRequestBody) *errors.Error { - if err := a.Validate.Struct(emailBody); err != nil { - return &errors.FailedToValidateUser +func (a *AuthService) VerifyEmail(emailBody VerifyEmailRequestBody) error { + if err := utilities.Validate(a.Validate, emailBody); err != nil { + return err } user, err := users.GetUserByEmail(a.DB, emailBody.Email) @@ -283,9 +320,8 @@ func (a *AuthService) VerifyEmail(emailBody models.VerifyEmailRequestBody) *erro return err } - verifyErr := verifyEmailHelper(user, emailBody.Token, a.DB) - if verifyErr != nil { - return verifyErr + if err := verifyEmailHelper(user, emailBody.Token, a.DB); err != nil { + return err } tx := a.DB.Begin() @@ -295,27 +331,25 @@ func (a *AuthService) VerifyEmail(emailBody models.VerifyEmailRequestBody) *erro } }() - updateErr := users.UpdateEmailVerification(tx, user.ID) - if updateErr != nil { + if err := users.UpdateEmailVerification(tx, user.ID); err != nil { tx.Rollback() - return updateErr + return err } - deleteErr := DeleteToken(tx, emailBody.Token, models.EmailVerificationType) - if deleteErr != nil { + if err := DeleteToken(tx, emailBody.Token, models.EmailVerificationType); err != nil { tx.Rollback() - return deleteErr + return err } if err := tx.Commit().Error; err != nil { tx.Rollback() - return &errors.FailedToUpdateEmailVerification + return err } return nil } -func (a *AuthService) Logout(c *fiber.Ctx) *errors.Error { +func (a *AuthService) Logout(c *fiber.Ctx) error { c.Cookie(&fiber.Cookie{ Name: "refresh_token", Value: "", diff --git a/backend/entities/auth/base/transactions.go b/backend/entities/auth/base/transactions.go index 4749ea05a..a8812c280 100644 --- a/backend/entities/auth/base/transactions.go +++ b/backend/entities/auth/base/transactions.go @@ -1,47 +1,59 @@ package base import ( + "errors" "time" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" ) -func GetToken(db *gorm.DB, token string, tokenType models.VerificationType) (*models.Verification, *errors.Error) { +func CreateUser(db *gorm.DB, user *models.User) (*models.User, error) { + if err := db.Create(user).Error; err != nil { + if errors.Is(err, gorm.ErrDuplicatedKey) { + return nil, utilities.ErrDuplicate + } + return nil, err + } + + return user, nil +} + +func GetToken(db *gorm.DB, token string, tokenType models.VerificationType) (*models.Verification, error) { tokenModel := models.Verification{} if err := db.Where("token = ? AND type = ?", token, tokenType).First(&tokenModel).Error; err != nil { - if err == gorm.ErrRecordNotFound { - return nil, &errors.TokenNotFound + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } - return nil, &errors.FailedToGetToken + return nil, err } return &tokenModel, nil } -func GetActiveTokenByUserID(db *gorm.DB, userID uuid.UUID, tokenType models.VerificationType) (*models.Verification, *errors.Error) { +func GetActiveTokenByUserID(db *gorm.DB, userID uuid.UUID, tokenType models.VerificationType) (*models.Verification, error) { token := models.Verification{} if err := db.Where("user_id = ? AND expires_at > ? AND type = ?", userID, time.Now().UTC(), tokenType).First(&token).Error; err != nil { - if err == gorm.ErrRecordNotFound { - return nil, &errors.TokenNotFound + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } - return nil, &errors.FailedToGetToken + return nil, err } return &token, nil } -func DeleteToken(db *gorm.DB, token string, tokenType models.VerificationType) *errors.Error { +func DeleteToken(db *gorm.DB, token string, tokenType models.VerificationType) error { if err := db.Where("token = ? AND type = ?", token, tokenType).Delete(&models.Verification{}).Error; err != nil { - return &errors.FailedToDeleteToken + return err } return nil } -func SaveToken(db *gorm.DB, userID uuid.UUID, token string, tokenType models.VerificationType, expiry time.Time) *errors.Error { +func SaveToken(db *gorm.DB, userID uuid.UUID, token string, tokenType models.VerificationType, expiry time.Time) error { tokenModel := models.Verification{ UserID: userID, Token: token, @@ -50,7 +62,7 @@ func SaveToken(db *gorm.DB, userID uuid.UUID, token string, tokenType models.Ver } if err := db.Create(&tokenModel).Error; err != nil { - return &errors.FailedToSaveToken + return err } return nil diff --git a/backend/entities/auth/models.go b/backend/entities/auth/models.go new file mode 100644 index 000000000..7272b50d8 --- /dev/null +++ b/backend/entities/auth/models.go @@ -0,0 +1,15 @@ +package auth + +type LoginResponseBody struct { + Email string `json:"email" validate:"required,email"` + Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually +} + +type UpdatePasswordRequestBody struct { + OldPassword string `json:"old_password" validate:"required,max=255"` // MARK: must be validated manually + NewPassword string `json:"new_password" validate:"required,not_equal_if_not_empty=OldPassword,max=255"` // MARK: must be validated manually +} + +type RefreshTokenRequestBody struct { + RefreshToken string `json:"refresh_token" validate:"required"` +} diff --git a/backend/entities/categories/base/controller.go b/backend/entities/categories/base/controller.go index 7ac6e2a7e..2ec179336 100644 --- a/backend/entities/categories/base/controller.go +++ b/backend/entities/categories/base/controller.go @@ -1,9 +1,12 @@ package base import ( - "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "net/http" + + "github.com/GenerateNU/sac/backend/entities/categories" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" + "github.com/gofiber/fiber/v2" ) @@ -23,27 +26,27 @@ func NewCategoryController(categoryService CategoryServiceInterface) *CategoryCo // @Tags category // @Accept json // @Produce json -// @Param categoryBody body models.CategoryRequestBody true "Category Body" +// @Param categoryBody body categories.CategoryRequestBody true "Category Body" // @Success 201 {object} models.Category -// @Failure 400 {string} errors.Error -// @Failure 401 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 409 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 401 {string} error +// @Failure 404 {string} error +// @Failure 409 {string} error +// @Failure 500 {string} error // @Router /categories/ [post] func (cat *CategoryController) CreateCategory(c *fiber.Ctx) error { - var categoryBody models.CategoryRequestBody + var categoryBody categories.CategoryRequestBody if err := c.BodyParser(&categoryBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } newCategory, err := cat.categoryService.CreateCategory(categoryBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(newCategory) + return c.Status(http.StatusCreated).JSON(newCategory) } // GetCategories godoc @@ -56,17 +59,22 @@ func (cat *CategoryController) CreateCategory(c *fiber.Ctx) error { // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.Category -// @Failure 400 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /categories/ [get] func (cat *CategoryController) GetCategories(c *fiber.Ctx) error { - categories, err := cat.categoryService.GetCategories(c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + categories, err := cat.categoryService.GetCategories(*pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&categories) + return c.Status(http.StatusOK).JSON(&categories) } // GetCategory godoc @@ -78,17 +86,17 @@ func (cat *CategoryController) GetCategories(c *fiber.Ctx) error { // @Produce json // @Param categoryID path string true "Category ID" // @Success 200 {object} models.Category -// @Failure 400 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /categories/{categoryID}/ [get] func (cat *CategoryController) GetCategory(c *fiber.Ctx) error { category, err := cat.categoryService.GetCategory(c.Params("categoryID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&category) + return c.Status(http.StatusOK).JSON(&category) } // DeleteCategory godoc @@ -100,17 +108,17 @@ func (cat *CategoryController) GetCategory(c *fiber.Ctx) error { // @Produce json // @Param categoryID path string true "Category ID" // @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {string} errors.Error -// @Failure 401 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 401 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /categories/{categoryID}/ [delete] func (cat *CategoryController) DeleteCategory(c *fiber.Ctx) error { if err := cat.categoryService.DeleteCategory(c.Params("categoryID")); err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } // UpdateCategory godoc @@ -122,24 +130,23 @@ func (cat *CategoryController) DeleteCategory(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param categoryID path string true "Category ID" -// @Param categoryBody body models.CategoryRequestBody true "Category Body" +// @Param categoryBody body categories.CategoryRequestBody true "Category Body" // @Success 200 {object} models.Category -// @Failure 400 {string} errors.Error -// @Failure 401 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 401 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /categories/{categoryID}/ [patch] func (cat *CategoryController) UpdateCategory(c *fiber.Ctx) error { - var category models.CategoryRequestBody - + var category categories.CategoryRequestBody if err := c.BodyParser(&category); err != nil { - return errors.FailedToValidateCategory.FiberError(c) + return utilities.InvalidJSON() } updatedCategory, err := cat.categoryService.UpdateCategory(c.Params("categoryID"), category) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(updatedCategory) + return c.Status(http.StatusOK).JSON(updatedCategory) } diff --git a/backend/entities/categories/base/routes.go b/backend/entities/categories/base/routes.go index 87ab9e30f..f41980ee0 100644 --- a/backend/entities/categories/base/routes.go +++ b/backend/entities/categories/base/routes.go @@ -2,7 +2,7 @@ package base import ( "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/categories/tag" + "github.com/GenerateNU/sac/backend/entities/categories/tags" "github.com/GenerateNU/sac/backend/types" "github.com/gofiber/fiber/v2" ) @@ -13,7 +13,7 @@ func CategoryRoutes(categoryParams types.RouteParams) { // update the router in params categoryParams.Router = categoryIDRoute - tag.CategoryTag(categoryParams) + tags.CategoryTag(categoryParams) } func Category(categoryParams types.RouteParams) fiber.Router { @@ -23,7 +23,7 @@ func Category(categoryParams types.RouteParams) fiber.Router { categories := categoryParams.Router.Group("/categories") categories.Post("/", categoryParams.AuthMiddleware.Authorize(auth.CreateAll), categoryController.CreateCategory) - categories.Get("/", categoryController.GetCategories) + categories.Get("/", categoryParams.UtilityMiddleware.Paginator, categoryController.GetCategories) // api/v1/categories/:categoryID/* categoryID := categories.Group("/:categoryID") diff --git a/backend/entities/categories/base/service.go b/backend/entities/categories/base/service.go index c41ab6252..47d13cdaa 100644 --- a/backend/entities/categories/base/service.go +++ b/backend/entities/categories/base/service.go @@ -1,21 +1,22 @@ package base import ( + "github.com/GenerateNU/sac/backend/entities/categories" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "golang.org/x/text/cases" "golang.org/x/text/language" ) type CategoryServiceInterface interface { - CreateCategory(categoryBody models.CategoryRequestBody) (*models.Category, *errors.Error) - GetCategories(limit string, page string) ([]models.Category, *errors.Error) - GetCategory(id string) (*models.Category, *errors.Error) - UpdateCategory(id string, params models.CategoryRequestBody) (*models.Category, *errors.Error) - DeleteCategory(id string) *errors.Error + CreateCategory(categoryBody categories.CategoryRequestBody) (*models.Category, error) + GetCategories(pageInfo fiberpaginate.PageInfo) ([]models.Category, error) + GetCategory(id string) (*models.Category, error) + UpdateCategory(id string, params categories.CategoryRequestBody) (*models.Category, error) + DeleteCategory(id string) error } type CategoryService struct { @@ -26,14 +27,14 @@ func NewCategoryService(params types.ServiceParams) CategoryServiceInterface { return &CategoryService{params} } -func (c *CategoryService) CreateCategory(categoryBody models.CategoryRequestBody) (*models.Category, *errors.Error) { - if err := c.Validate.Struct(categoryBody); err != nil { - return nil, &errors.FailedToValidateCategory +func (c *CategoryService) CreateCategory(categoryBody categories.CategoryRequestBody) (*models.Category, error) { + if err := utilities.Validate(c.Validate, categoryBody); err != nil { + return nil, err } - category, err := utilities.MapRequestToModel(categoryBody, &models.Category{}) + category, err := utilities.MapJsonTags(categoryBody, &models.Category{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } category.Name = cases.Title(language.English).String(category.Name) @@ -41,21 +42,11 @@ func (c *CategoryService) CreateCategory(categoryBody models.CategoryRequestBody return CreateCategory(c.DB, *category) } -func (c *CategoryService) GetCategories(limit string, page string) ([]models.Category, *errors.Error) { - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetCategories(c.DB, *limitAsInt, *pageAsInt) +func (c *CategoryService) GetCategories(pageInfo fiberpaginate.PageInfo) ([]models.Category, error) { + return GetCategories(c.DB, pageInfo) } -func (c *CategoryService) GetCategory(id string) (*models.Category, *errors.Error) { +func (c *CategoryService) GetCategory(id string) (*models.Category, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { return nil, err @@ -64,19 +55,19 @@ func (c *CategoryService) GetCategory(id string) (*models.Category, *errors.Erro return GetCategory(c.DB, *idAsUUID) } -func (c *CategoryService) UpdateCategory(id string, categoryBody models.CategoryRequestBody) (*models.Category, *errors.Error) { - idAsUUID, idErr := utilities.ValidateID(id) - if idErr != nil { - return nil, idErr +func (c *CategoryService) UpdateCategory(id string, categoryBody categories.CategoryRequestBody) (*models.Category, error) { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return nil, err } - if err := c.Validate.Struct(categoryBody); err != nil { - return nil, &errors.FailedToValidateTag + if err := utilities.Validate(c.Validate, categoryBody); err != nil { + return nil, err } - category, err := utilities.MapRequestToModel(categoryBody, &models.Category{}) + category, err := utilities.MapJsonTags(categoryBody, &models.Category{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } category.Name = cases.Title(language.English).String(category.Name) @@ -84,7 +75,7 @@ func (c *CategoryService) UpdateCategory(id string, categoryBody models.Category return UpdateCategory(c.DB, *idAsUUID, *category) } -func (c *CategoryService) DeleteCategory(id string) *errors.Error { +func (c *CategoryService) DeleteCategory(id string) error { idAsUUID, err := utilities.ValidateID(id) if err != nil { return err diff --git a/backend/entities/categories/base/transactions.go b/backend/entities/categories/base/transactions.go index a753bc780..6e981f10e 100644 --- a/backend/entities/categories/base/transactions.go +++ b/backend/entities/categories/base/transactions.go @@ -1,73 +1,70 @@ package base import ( - stdliberrors "errors" + "errors" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/google/uuid" "github.com/GenerateNU/sac/backend/entities/models" "gorm.io/gorm" + "gorm.io/gorm/clause" ) -func CreateCategory(db *gorm.DB, category models.Category) (*models.Category, *errors.Error) { +func CreateCategory(db *gorm.DB, category models.Category) (*models.Category, error) { if err := db.Create(&category).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrDuplicatedKey) { - return nil, &errors.CategoryAlreadyExists - } else { - return nil, &errors.FailedToCreateCategory + if errors.Is(err, gorm.ErrDuplicatedKey) { + return nil, utilities.ErrDuplicate } + return nil, err } return &category, nil } -func GetCategories(db *gorm.DB, limit int, page int) ([]models.Category, *errors.Error) { +func GetCategories(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.Category, error) { var categories []models.Category - offset := (page - 1) * limit - - if err := db.Limit(limit).Offset(offset).Find(&categories).Error; err != nil { - return nil, &errors.FailedToGetCategories + if err := db.Scopes(utilities.IntoScope(pageInfo, db)).Find(&categories).Error; err != nil { + return nil, err } return categories, nil } -func GetCategory(db *gorm.DB, id uuid.UUID) (*models.Category, *errors.Error) { +func GetCategory(db *gorm.DB, id uuid.UUID) (*models.Category, error) { var category models.Category if err := db.First(&category, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.CategoryNotFound - } else { - return nil, &errors.FailedToGetCategory + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &category, nil } -func UpdateCategory(db *gorm.DB, id uuid.UUID, category models.Category) (*models.Category, *errors.Error) { - if err := db.Model(&models.Category{}).Where("id = ?", id).Updates(category).First(&category, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.TagNotFound - } else { - return nil, &errors.FailedToUpdateTag +func UpdateCategory(db *gorm.DB, id uuid.UUID, category models.Category) (*models.Category, error) { + var resultingCategory models.Category + if err := db.Model(&resultingCategory).Clauses(clause.Returning{}).Where("id = ?", id).Updates(category).First(&category, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } - return &category, nil + return &resultingCategory, nil } -func DeleteCategory(db *gorm.DB, id uuid.UUID) *errors.Error { +func DeleteCategory(db *gorm.DB, id uuid.UUID) error { if result := db.Delete(&models.Category{}, id); result.RowsAffected == 0 { if result.Error == nil { - return &errors.CategoryNotFound - } else { - return &errors.FailedToDeleteCategory + return utilities.ErrNotFound } + return result.Error } return nil diff --git a/backend/entities/categories/models.go b/backend/entities/categories/models.go new file mode 100644 index 000000000..18285b996 --- /dev/null +++ b/backend/entities/categories/models.go @@ -0,0 +1,5 @@ +package categories + +type CategoryRequestBody struct { + Name string `json:"name" validate:"required,max=255"` +} diff --git a/backend/entities/categories/tag/transactions.go b/backend/entities/categories/tag/transactions.go deleted file mode 100644 index 9f6741d12..000000000 --- a/backend/entities/categories/tag/transactions.go +++ /dev/null @@ -1,46 +0,0 @@ -package tag - -import ( - stdliberrors "errors" - - "github.com/GenerateNU/sac/backend/errors" - "github.com/google/uuid" - - "github.com/GenerateNU/sac/backend/entities/models" - - "gorm.io/gorm" -) - -func GetTagsByCategory(db *gorm.DB, categoryID uuid.UUID, limit int, page int) ([]models.Tag, *errors.Error) { - var category models.Category - - if err := db.Where("id = ?", categoryID).First(&category).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.CategoryNotFound - } - return nil, &errors.FailedToGetCategory - } - - var tags []models.Tag - - offset := (page - 1) * limit - - if err := db.Where("category_id = ?", categoryID).Limit(limit).Offset(offset).Find(&tags).Error; err != nil { - return nil, &errors.FailedToGetTags - } - - return tags, nil -} - -func GetTagByCategory(db *gorm.DB, categoryID uuid.UUID, tagID uuid.UUID) (*models.Tag, *errors.Error) { - var tag models.Tag - if err := db.Where("category_id = ? AND id = ?", categoryID, tagID).First(&tag).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.TagNotFound - } else { - return nil, &errors.FailedToGetTag - } - } - - return &tag, nil -} diff --git a/backend/entities/categories/tag/controller.go b/backend/entities/categories/tags/controller.go similarity index 71% rename from backend/entities/categories/tag/controller.go rename to backend/entities/categories/tags/controller.go index c6db327f2..8fb211b12 100644 --- a/backend/entities/categories/tag/controller.go +++ b/backend/entities/categories/tags/controller.go @@ -1,8 +1,10 @@ -package tag +package tags import ( - "github.com/GenerateNU/sac/backend/constants" + "net/http" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -25,17 +27,22 @@ func NewCategoryTagController(categoryTagService CategoryTagServiceInterface) *C // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.Tag -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /categories/{categoryID}/tags/ [get] func (ct *CategoryTagController) GetTagsByCategory(c *fiber.Ctx) error { - tags, err := ct.categoryTagService.GetTagsByCategory(c.Params("categoryID"), c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + tags, err := ct.categoryTagService.GetTagsByCategory(c.Params("categoryID"), *pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&tags) + return c.Status(http.StatusOK).JSON(&tags) } // GetTagByCategory godoc @@ -48,15 +55,15 @@ func (ct *CategoryTagController) GetTagsByCategory(c *fiber.Ctx) error { // @Param categoryID path string true "Category ID" // @Param tagID path string true "Tag ID" // @Success 200 {object} models.Tag -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /categories/{categoryID}/tags/{tagID}/ [get] func (ct *CategoryTagController) GetTagByCategory(c *fiber.Ctx) error { tag, err := ct.categoryTagService.GetTagByCategory(c.Params("categoryID"), c.Params("tagID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&tag) + return c.Status(http.StatusOK).JSON(&tag) } diff --git a/backend/entities/categories/tag/routes.go b/backend/entities/categories/tags/routes.go similarity index 75% rename from backend/entities/categories/tag/routes.go rename to backend/entities/categories/tags/routes.go index e3b46347e..f4a0d4cb4 100644 --- a/backend/entities/categories/tag/routes.go +++ b/backend/entities/categories/tags/routes.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/types" @@ -10,6 +10,6 @@ func CategoryTag(categoryParams types.RouteParams) { // api/v1/categories/:categoryID/tags/* categoryTags := categoryParams.Router.Group("/tags") - categoryTags.Get("/", categoryTagController.GetTagsByCategory) + categoryTags.Get("/", categoryParams.UtilityMiddleware.Paginator, categoryTagController.GetTagsByCategory) categoryTags.Get("/:tagID", categoryTagController.GetTagByCategory) } diff --git a/backend/entities/categories/tag/service.go b/backend/entities/categories/tags/service.go similarity index 61% rename from backend/entities/categories/tag/service.go rename to backend/entities/categories/tags/service.go index 90db3286e..7f3dfd63e 100644 --- a/backend/entities/categories/tag/service.go +++ b/backend/entities/categories/tags/service.go @@ -1,15 +1,15 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" ) type CategoryTagServiceInterface interface { - GetTagsByCategory(categoryID string, limit string, page string) ([]models.Tag, *errors.Error) - GetTagByCategory(categoryID string, tagID string) (*models.Tag, *errors.Error) + GetTagsByCategory(categoryID string, pageInfo fiberpaginate.PageInfo) ([]models.Tag, error) + GetTagByCategory(categoryID string, tagID string) (*models.Tag, error) } type CategoryTagService struct { @@ -20,26 +20,16 @@ func NewCategoryTagService(params types.ServiceParams) CategoryTagServiceInterfa return &CategoryTagService{params} } -func (t *CategoryTagService) GetTagsByCategory(categoryID string, limit string, page string) ([]models.Tag, *errors.Error) { +func (t *CategoryTagService) GetTagsByCategory(categoryID string, pageInfo fiberpaginate.PageInfo) ([]models.Tag, error) { categoryIDAsUUID, err := utilities.ValidateID(categoryID) if err != nil { return nil, err } - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetTagsByCategory(t.DB, *categoryIDAsUUID, *limitAsInt, *pageAsInt) + return GetTagsByCategory(t.DB, *categoryIDAsUUID, pageInfo) } -func (t *CategoryTagService) GetTagByCategory(categoryID string, tagID string) (*models.Tag, *errors.Error) { +func (t *CategoryTagService) GetTagByCategory(categoryID string, tagID string) (*models.Tag, error) { categoryIDAsUUID, idErr := utilities.ValidateID(categoryID) if idErr != nil { diff --git a/backend/entities/categories/tags/transactions.go b/backend/entities/categories/tags/transactions.go new file mode 100644 index 000000000..817bcedef --- /dev/null +++ b/backend/entities/categories/tags/transactions.go @@ -0,0 +1,44 @@ +package tags + +import ( + "errors" + + "github.com/garrettladley/fiberpaginate" + "github.com/google/uuid" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/utilities" + + "gorm.io/gorm" +) + +func GetTagsByCategory(db *gorm.DB, categoryID uuid.UUID, pageInfo fiberpaginate.PageInfo) ([]models.Tag, error) { + var category models.Category + + if err := db.Where("id = ?", categoryID).First(&category).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + var tags []models.Tag + + if err := db.Where("category_id = ?", categoryID).Scopes(utilities.IntoScope(pageInfo, db)).Find(&tags).Error; err != nil { + return nil, err + } + + return tags, nil +} + +func GetTagByCategory(db *gorm.DB, categoryID uuid.UUID, tagID uuid.UUID) (*models.Tag, error) { + var tag models.Tag + if err := db.Where("category_id = ? AND id = ?", categoryID, tagID).First(&tag).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + return &tag, nil +} diff --git a/backend/entities/clubs/base/controller.go b/backend/entities/clubs/base/controller.go index f4b09e857..add4ae5b5 100644 --- a/backend/entities/clubs/base/controller.go +++ b/backend/entities/clubs/base/controller.go @@ -1,9 +1,11 @@ package base import ( - "github.com/GenerateNU/sac/backend/constants" + "net/http" + "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -25,25 +27,26 @@ func NewClubController(clubService ClubServiceInterface) *ClubController { // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.Club -// @Failure 400 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 500 {object} error // @Router /clubs/ [get] func (cl *ClubController) GetClubs(c *fiber.Ctx) error { var queryParams models.ClubQueryParams - - queryParams.Limit = constants.DEFAULT_LIMIT - queryParams.Page = constants.DEFAULT_PAGE - if err := c.QueryParser(&queryParams); err != nil { - return errors.FailedtoParseQueryParams.FiberError(c) + return err + } + + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination } - clubs, err := cl.clubService.GetClubs(&queryParams) + clubs, err := cl.clubService.GetClubs(&queryParams, *pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(clubs) + return c.Status(http.StatusOK).JSON(clubs) } // CreateClub godoc @@ -54,26 +57,26 @@ func (cl *ClubController) GetClubs(c *fiber.Ctx) error { // @Tags club // @Accept json // @Produce json -// @Param club body models.CreateClubRequestBody true "Club" +// @Param club body CreateClubRequestBody true "Club" // @Success 201 {object} models.Club -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/ [post] func (cl *ClubController) CreateClub(c *fiber.Ctx) error { - var clubBody models.CreateClubRequestBody + var clubBody CreateClubRequestBody if err := c.BodyParser(&clubBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } club, err := cl.clubService.CreateClub(clubBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(club) + return c.Status(http.StatusCreated).JSON(club) } // GetClub godoc @@ -85,17 +88,17 @@ func (cl *ClubController) CreateClub(c *fiber.Ctx) error { // @Produce json // @Param clubID path string true "Club ID" // @Success 200 {object} models.Club -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/ [get] func (cl *ClubController) GetClub(c *fiber.Ctx) error { club, err := cl.clubService.GetClub(c.Params("clubID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(club) + return c.Status(http.StatusOK).JSON(club) } // UpdateClub godoc @@ -107,26 +110,26 @@ func (cl *ClubController) GetClub(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param clubID path string true "Club ID" -// @Param club body models.UpdateClubRequestBody true "Club" +// @Param club body UpdateClubRequestBody true "Club" // @Success 200 {object} models.Club -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/ [patch] func (cl *ClubController) UpdateClub(c *fiber.Ctx) error { - var clubBody models.UpdateClubRequestBody + var clubBody UpdateClubRequestBody if err := c.BodyParser(&clubBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } updatedClub, err := cl.clubService.UpdateClub(c.Params("clubID"), clubBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(updatedClub) + return c.Status(http.StatusOK).JSON(updatedClub) } // DeleteClub godoc @@ -138,15 +141,15 @@ func (cl *ClubController) UpdateClub(c *fiber.Ctx) error { // @Produce json // @Param clubID path string true "Club ID" // @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/ [delete] func (cl *ClubController) DeleteClub(c *fiber.Ctx) error { err := cl.clubService.DeleteClub(c.Params("clubID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/clubs/base/models.go b/backend/entities/clubs/base/models.go new file mode 100644 index 000000000..e0a6b63f1 --- /dev/null +++ b/backend/entities/clubs/base/models.go @@ -0,0 +1,33 @@ +package base + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/google/uuid" +) + +type CreateClubRequestBody struct { + UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` + Name string `json:"name" validate:"required,max=255"` + Preview string `json:"preview" validate:"required,max=255"` + Description string `json:"description" validate:"required,http_url,s3_url,max=255"` + IsRecruiting bool `json:"is_recruiting" validate:"required"` + RecruitmentCycle models.RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` + RecruitmentType models.RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` + WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` + OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` + ApplicationLink string `json:"application_link" validate:"required,max=255,http_url"` + Logo string `json:"logo" validate:"omitempty,http_url,s3_url,max=255"` +} + +type UpdateClubRequestBody struct { + Name string `json:"name" validate:"omitempty,max=255"` + Preview string `json:"preview" validate:"omitempty,max=255"` + Description string `json:"description" validate:"omitempty,http_url,s3_url,max=255"` + IsRecruiting bool `json:"is_recruiting" validate:"omitempty"` + RecruitmentCycle models.RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` + RecruitmentType models.RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` + WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` + OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` + ApplicationLink string `json:"application_link" validate:"omitempty,required,max=255,http_url"` + Logo string `json:"logo" validate:"omitempty,s3_url,max=255,http_url"` +} diff --git a/backend/entities/clubs/base/routes.go b/backend/entities/clubs/base/routes.go index 0af04c27c..7633698b2 100644 --- a/backend/entities/clubs/base/routes.go +++ b/backend/entities/clubs/base/routes.go @@ -2,29 +2,27 @@ package base import ( p "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/clubs/contact" - "github.com/GenerateNU/sac/backend/entities/clubs/event" - "github.com/GenerateNU/sac/backend/entities/clubs/follower" - "github.com/GenerateNU/sac/backend/entities/clubs/member" - "github.com/GenerateNU/sac/backend/entities/clubs/poc" - "github.com/GenerateNU/sac/backend/entities/clubs/tag" + "github.com/GenerateNU/sac/backend/entities/clubs/contacts" + "github.com/GenerateNU/sac/backend/entities/clubs/events" + "github.com/GenerateNU/sac/backend/entities/clubs/followers" + "github.com/GenerateNU/sac/backend/entities/clubs/members" + "github.com/GenerateNU/sac/backend/entities/clubs/pocs" + "github.com/GenerateNU/sac/backend/entities/clubs/tags" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" "github.com/gofiber/fiber/v2" ) func ClubRoutes(clubParams types.RouteParams) { - clubIDRouter := ClubRouter(clubParams) - - // update the router in params - clubParams.Router = clubIDRouter - - tag.ClubTag(clubParams) - follower.ClubFollower(clubParams) - member.ClubMember(clubParams) - contact.ClubContact(clubParams) - event.ClubEvent(clubParams) - poc.ClubPointOfContact(clubParams) + clubParams.Router = ClubRouter(clubParams) + + tags.ClubTag(clubParams) + followers.ClubFollower(clubParams) + members.ClubMember(clubParams) + contacts.ClubContact(clubParams) + events.ClubEvent(clubParams) + pocs.ClubPointOfContact(clubParams) } func ClubRouter(clubParams types.RouteParams) fiber.Router { @@ -33,14 +31,18 @@ func ClubRouter(clubParams types.RouteParams) fiber.Router { // api/v1/clubs/* clubs := clubParams.Router.Group("/clubs") - clubs.Get("/", clubController.GetClubs) + clubs.Get("/", clubParams.UtilityMiddleware.Paginator, clubController.GetClubs) clubs.Post("/", clubParams.AuthMiddleware.Authorize(p.CreateAll), clubController.CreateClub) // api/v1/clubs/:clubID/* clubID := clubs.Group("/:clubID") clubID.Get("/", clubController.GetClub) - clubID.Patch("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubController.UpdateClub) + clubID.Patch( + "/", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubController.UpdateClub, + ) clubID.Delete("/", clubParams.AuthMiddleware.Authorize(p.DeleteAll), clubController.DeleteClub) return clubID diff --git a/backend/entities/clubs/base/service.go b/backend/entities/clubs/base/service.go index 7d3e60280..6891aeb1d 100644 --- a/backend/entities/clubs/base/service.go +++ b/backend/entities/clubs/base/service.go @@ -1,19 +1,21 @@ package base import ( + "fmt" + "github.com/GenerateNU/sac/backend/entities/clubs" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" ) type ClubServiceInterface interface { - GetClubs(queryParams *models.ClubQueryParams) ([]models.Club, *errors.Error) - GetClub(id string) (*models.Club, *errors.Error) - CreateClub(clubBody models.CreateClubRequestBody) (*models.Club, *errors.Error) - UpdateClub(id string, clubBody models.UpdateClubRequestBody) (*models.Club, *errors.Error) - DeleteClub(id string) *errors.Error + GetClubs(queryParams *models.ClubQueryParams, pageInfo fiberpaginate.PageInfo) ([]models.Club, error) + GetClub(id string) (*models.Club, error) + CreateClub(clubBody CreateClubRequestBody) (*models.Club, error) + UpdateClub(id string, clubBody UpdateClubRequestBody) (*models.Club, error) + DeleteClub(id string) error } type ClubService struct { @@ -24,66 +26,58 @@ func NewClubService(serviceParams types.ServiceParams) ClubServiceInterface { return &ClubService{serviceParams} } -func (c *ClubService) GetClubs(queryParams *models.ClubQueryParams) ([]models.Club, *errors.Error) { - if queryParams.Limit < 0 { - return nil, &errors.FailedToValidateLimit - } - - if queryParams.Page < 0 { - return nil, &errors.FailedToValidatePage - } - - return GetClubs(c.DB, c.Integrations.Search, queryParams) +func (c *ClubService) GetClubs(queryParams *models.ClubQueryParams, pageInfo fiberpaginate.PageInfo) ([]models.Club, error) { + return GetClubs(c.DB, c.Integrations.Search, queryParams, pageInfo) } -func (c *ClubService) CreateClub(clubBody models.CreateClubRequestBody) (*models.Club, *errors.Error) { - if err := c.Validate.Struct(clubBody); err != nil { - return nil, &errors.FailedToValidateClub +func (c *ClubService) CreateClub(clubBody CreateClubRequestBody) (*models.Club, error) { + if err := utilities.Validate(c.Validate, clubBody); err != nil { + return nil, err } - club, err := utilities.MapRequestToModel(clubBody, &models.Club{}) + club, err := utilities.MapJsonTags(clubBody, &models.Club{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } return CreateClub(c.DB, c.Integrations.Search, clubBody.UserID, *club) } -func (c *ClubService) GetClub(id string) (*models.Club, *errors.Error) { +func (c *ClubService) GetClub(id string) (*models.Club, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return clubs.GetClub(c.DB, *idAsUUID) } -func (c *ClubService) UpdateClub(id string, clubBody models.UpdateClubRequestBody) (*models.Club, *errors.Error) { - idAsUUID, idErr := utilities.ValidateID(id) - if idErr != nil { - return nil, idErr +func (c *ClubService) UpdateClub(id string, clubBody UpdateClubRequestBody) (*models.Club, error) { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return nil, err } - if utilities.AtLeastOne(clubBody, models.UpdateClubRequestBody{}) { - return nil, &errors.FailedToValidateClub + if utilities.AtLeastOne(clubBody, UpdateClubRequestBody{}) { + return nil, fmt.Errorf("at least one field must be present") } - if err := c.Validate.Struct(clubBody); err != nil { - return nil, &errors.FailedToValidateClub + if err := utilities.Validate(c.Validate, clubBody); err != nil { + return nil, err } - club, err := utilities.MapRequestToModel(clubBody, &models.Club{}) + club, err := utilities.MapJsonTags(clubBody, &models.Club{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } return UpdateClub(c.DB, c.Integrations.Search, *idAsUUID, *club) } -func (c *ClubService) DeleteClub(id string) *errors.Error { +func (c *ClubService) DeleteClub(id string) error { idAsUUID, err := utilities.ValidateID(id) if err != nil { - return &errors.FailedToValidateID + return err } return DeleteClub(c.DB, c.Integrations.Search, *idAsUUID) diff --git a/backend/entities/clubs/base/transactions.go b/backend/entities/clubs/base/transactions.go index 1d4055f9b..c1352a5b8 100644 --- a/backend/entities/clubs/base/transactions.go +++ b/backend/entities/clubs/base/transactions.go @@ -1,19 +1,22 @@ package base import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/integrations/search" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/sahilm/fuzzy" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/users" - "github.com/GenerateNU/sac/backend/errors" + "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) -func GetClubs(db *gorm.DB, pinecone search.SearchClientInterface, queryParams *models.ClubQueryParams) ([]models.Club, *errors.Error) { +func GetClubs(db *gorm.DB, pinecone search.SearchClientInterface, queryParams *models.ClubQueryParams, pageInfo fiberpaginate.PageInfo) ([]models.Club, error) { query := db.Model(&models.Club{}) if queryParams.Tags != nil && len(queryParams.Tags) > 0 { @@ -43,7 +46,7 @@ func GetClubs(db *gorm.DB, pinecone search.SearchClientInterface, queryParams *m if queryParams.Search != "" { if err := query.Find(&clubs).Error; err != nil { - return nil, &errors.FailedToGetClubs + return nil, err } // len(matches) <= len(clubs), because it discardss results that don't fuzz at all. @@ -70,29 +73,35 @@ func GetClubs(db *gorm.DB, pinecone search.SearchClientInterface, queryParams *m return clubsSorted, nil } - offset := (queryParams.Page - 1) * queryParams.Limit - - result := query.Limit(queryParams.Limit).Offset(offset).Find(&clubs) - if result.Error != nil { - return nil, &errors.FailedToGetClubs + if err := query.Scopes(utilities.IntoScope(pageInfo, query)).Find(&clubs).Error; err != nil { + return nil, err } return clubs, nil } -func CreateClub(db *gorm.DB, pinecone search.SearchClientInterface, userId uuid.UUID, club models.Club) (*models.Club, *errors.Error) { +func CreateClub(db *gorm.DB, pinecone search.SearchClientInterface, userId uuid.UUID, club models.Club) (*models.Club, error) { user, err := users.GetUser(db, userId) if err != nil { return nil, err } tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return nil, err + } club.NumMembers = 1 if err := tx.Create(&club).Error; err != nil { tx.Rollback() - return nil, &errors.FailedToCreateClub + return nil, err } membership := models.Membership{ @@ -103,89 +112,83 @@ func CreateClub(db *gorm.DB, pinecone search.SearchClientInterface, userId uuid. if err := tx.Create(&membership).Error; err != nil { tx.Rollback() - return nil, &errors.FailedToCreateClub + return nil, err } if err := tx.Model(&user).Association("Follower").Append(&club); err != nil { tx.Rollback() - return nil, &errors.FailedToCreateClub + return nil, err } if err := pinecone.Upsert([]search.Searchable{&club}); err != nil { tx.Rollback() - return nil, &errors.FailedToCreateClub - } - - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return nil, &errors.FailedToCreateClub + return nil, err } - return &club, nil + return &club, tx.Commit().Error } -func UpdateClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID, club models.Club) (*models.Club, *errors.Error) { +func UpdateClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID, club models.Club) (*models.Club, error) { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var existingClub models.Club - err := tx.First(&existingClub, id).Error if err != nil { tx.Rollback() - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.ClubNotFound - } else { - return nil, &errors.FailedToCreateClub + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } - if err := tx.Model(&existingClub).Updates(&club).Error; err != nil { + if err := tx.Model(&existingClub).Clauses(clause.Returning{}).Updates(&club).Error; err != nil { tx.Rollback() - return nil, &errors.FailedToUpdateUser + return nil, err } if pinecone.Upsert([]search.Searchable{&existingClub}) != nil { tx.Rollback() - return nil, &errors.FailedToUpsertToPinecone - } - - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return nil, &errors.FailedToUpdateClub + return nil, err } - return &existingClub, nil + return &existingClub, tx.Commit().Error } -func DeleteClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID) *errors.Error { +func DeleteClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID) error { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var existingClub models.Club err := tx.First(&existingClub, id).Error if err != nil { tx.Rollback() - return &errors.ClubNotFound + if errors.Is(err, gorm.ErrRecordNotFound) { + return utilities.ErrNotFound + } + return err } - pineconeErr := pinecone.Delete([]search.Searchable{&existingClub}) - if pineconeErr != nil { + if err := pinecone.Delete([]search.Searchable{&existingClub}); err != nil { tx.Rollback() - return &errors.FailedToDeleteClub + return err } if result := tx.Delete(&models.Club{}, id); result.RowsAffected == 0 { tx.Rollback() if result.Error == nil { - return &errors.ClubNotFound - } else { - return &errors.FailedToDeleteClub + return utilities.ErrNotFound } + return result.Error } - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return &errors.FailedToDeleteClub - } - - return nil + return tx.Commit().Error } diff --git a/backend/entities/clubs/contact/controller.go b/backend/entities/clubs/contacts/controller.go similarity index 63% rename from backend/entities/clubs/contact/controller.go rename to backend/entities/clubs/contacts/controller.go index c2c170b8a..ac0bb51b9 100644 --- a/backend/entities/clubs/contact/controller.go +++ b/backend/entities/clubs/contacts/controller.go @@ -1,8 +1,9 @@ -package contact +package contacts import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -23,17 +24,17 @@ func NewClubContactController(clubContactService ClubContactServiceInterface) *C // @Produce json // @Param clubID path string true "Club ID" // @Success 200 {object} []models.Contact -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/contacts/ [get] func (cc *ClubContactController) GetClubContacts(c *fiber.Ctx) error { contacts, err := cc.clubContactService.GetClubContacts(c.Params("clubID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(contacts) + return c.Status(http.StatusOK).JSON(contacts) } // PutContact godoc @@ -45,24 +46,24 @@ func (cc *ClubContactController) GetClubContacts(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param clubID path string true "Club ID" -// @Param contactBody body models.PutContactRequestBody true "Contact Body" +// @Param contactBody body PutContactRequestBody true "Contact Body" // @Success 201 {object} models.Contact -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/contacts/ [put] func (cc *ClubContactController) PutContact(c *fiber.Ctx) error { - var contactBody models.PutContactRequestBody + var contactBody PutContactRequestBody if err := c.BodyParser(&contactBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } contact, err := cc.clubContactService.PutClubContact(c.Params("clubID"), contactBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(contact) + return c.Status(http.StatusOK).JSON(contact) } diff --git a/backend/entities/clubs/contacts/models.go b/backend/entities/clubs/contacts/models.go new file mode 100644 index 000000000..26c5cf1dd --- /dev/null +++ b/backend/entities/clubs/contacts/models.go @@ -0,0 +1,8 @@ +package contacts + +import "github.com/GenerateNU/sac/backend/entities/models" + +type PutContactRequestBody struct { + Type models.ContactType `json:"type" validate:"required,max=255,oneof=facebook instagram x linkedin youtube github slack discord email customSite"` + Content string `json:"content" validate:"required,contact_pointer,max=255"` +} diff --git a/backend/entities/clubs/contact/routes.go b/backend/entities/clubs/contacts/routes.go similarity index 56% rename from backend/entities/clubs/contact/routes.go rename to backend/entities/clubs/contacts/routes.go index 883f2b63d..252fcfe52 100644 --- a/backend/entities/clubs/contact/routes.go +++ b/backend/entities/clubs/contacts/routes.go @@ -1,6 +1,7 @@ -package contact +package contacts import ( + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) @@ -11,5 +12,9 @@ func ClubContact(clubParams types.RouteParams) { // api/v1/clubs/:clubID/contacts/* clubContacts.Get("/", clubContactController.GetClubContacts) - clubContacts.Put("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubContactController.PutContact) + clubContacts.Put( + "/", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubContactController.PutContact, + ) } diff --git a/backend/entities/clubs/contact/service.go b/backend/entities/clubs/contacts/service.go similarity index 51% rename from backend/entities/clubs/contact/service.go rename to backend/entities/clubs/contacts/service.go index 455ac4c47..5c12bd409 100644 --- a/backend/entities/clubs/contact/service.go +++ b/backend/entities/clubs/contacts/service.go @@ -1,15 +1,14 @@ -package contact +package contacts import ( "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" ) type ClubContactServiceInterface interface { - GetClubContacts(clubID string) ([]models.Contact, *errors.Error) - PutClubContact(clubID string, contactBody models.PutContactRequestBody) (*models.Contact, *errors.Error) + GetClubContacts(clubID string) ([]models.Contact, error) + PutClubContact(clubID string, contactBody PutContactRequestBody) (*models.Contact, error) } type ClubContactService struct { @@ -20,28 +19,28 @@ func NewClubContactService(params types.ServiceParams) ClubContactServiceInterfa return &ClubContactService{params} } -func (c *ClubContactService) GetClubContacts(clubID string) ([]models.Contact, *errors.Error) { +func (c *ClubContactService) GetClubContacts(clubID string) ([]models.Contact, error) { idAsUUID, err := utilities.ValidateID(clubID) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return GetClubContacts(c.DB, *idAsUUID) } -func (c *ClubContactService) PutClubContact(clubID string, contactBody models.PutContactRequestBody) (*models.Contact, *errors.Error) { - idAsUUID, idErr := utilities.ValidateID(clubID) - if idErr != nil { - return nil, idErr +func (c *ClubContactService) PutClubContact(clubID string, contactBody PutContactRequestBody) (*models.Contact, error) { + idAsUUID, err := utilities.ValidateID(clubID) + if err != nil { + return nil, err } - if err := c.Validate.Struct(contactBody); err != nil { - return nil, &errors.FailedToValidateContact + if err := utilities.Validate(c.Validate, contactBody); err != nil { + return nil, err } - contact, err := utilities.MapRequestToModel(contactBody, &models.Contact{}) + contact, err := utilities.MapJsonTags(contactBody, &models.Contact{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } contact.ClubID = *idAsUUID diff --git a/backend/entities/clubs/contact/transactions.go b/backend/entities/clubs/contacts/transactions.go similarity index 56% rename from backend/entities/clubs/contact/transactions.go rename to backend/entities/clubs/contacts/transactions.go index 5db842e1e..5c8ce2bd1 100644 --- a/backend/entities/clubs/contact/transactions.go +++ b/backend/entities/clubs/contacts/transactions.go @@ -1,43 +1,43 @@ -package contact +package contacts import ( - stdliberrors "errors" + "errors" + "fmt" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" ) -func PutClubContact(db *gorm.DB, contact models.Contact) (*models.Contact, *errors.Error) { +func PutClubContact(db *gorm.DB, contact models.Contact) (*models.Contact, error) { err := db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "club_id"}, {Name: "type"}}, DoUpdates: clause.AssignmentColumns([]string{"content"}), }).Create(&contact).Error if err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) || stdliberrors.Is(err, gorm.ErrForeignKeyViolated) { - return nil, &errors.ClubNotFound - } else { - return nil, &errors.FailedToPutContact + if errors.Is(err, gorm.ErrRecordNotFound) || errors.Is(err, gorm.ErrForeignKeyViolated) { + return nil, utilities.ErrNotFound } + return nil, err } return &contact, nil } -func GetClubContacts(db *gorm.DB, clubID uuid.UUID) ([]models.Contact, *errors.Error) { +func GetClubContacts(db *gorm.DB, clubID uuid.UUID) ([]models.Contact, error) { var club models.Club if err := db.Preload("Contact").First(&club, clubID).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.ClubNotFound - } else { - return nil, &errors.FailedToGetContacts + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } if club.Contact == nil { - return nil, &errors.FailedToGetContacts + return nil, fmt.Errorf("club with ID %s has no contacts", clubID) } return club.Contact, nil diff --git a/backend/entities/clubs/event/service.go b/backend/entities/clubs/event/service.go deleted file mode 100644 index d918ec5e2..000000000 --- a/backend/entities/clubs/event/service.go +++ /dev/null @@ -1,39 +0,0 @@ -package event - -import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/GenerateNU/sac/backend/types" - "github.com/GenerateNU/sac/backend/utilities" -) - -type ClubEventServiceInterface interface { - GetClubEvents(clubID string, limit string, page string) ([]models.Event, *errors.Error) -} - -type ClubEventService struct { - types.ServiceParams -} - -func NewClubEventService(params types.ServiceParams) ClubEventServiceInterface { - return &ClubEventService{params} -} - -func (c *ClubEventService) GetClubEvents(clubID string, limit string, page string) ([]models.Event, *errors.Error) { - idAsUUID, err := utilities.ValidateID(clubID) - if err != nil { - return nil, &errors.FailedToValidateID - } - - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetClubEvents(c.DB, *idAsUUID, *limitAsInt, *pageAsInt) -} diff --git a/backend/entities/clubs/event/transactions.go b/backend/entities/clubs/event/transactions.go deleted file mode 100644 index 99b946063..000000000 --- a/backend/entities/clubs/event/transactions.go +++ /dev/null @@ -1,20 +0,0 @@ -package event - -import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/google/uuid" - "gorm.io/gorm" -) - -func GetClubEvents(db *gorm.DB, clubID uuid.UUID, limit int, page int) ([]models.Event, *errors.Error) { - var events []models.Event - - offset := (page - 1) * limit - - if err := db.Where("club_id = ?", clubID).Limit(limit).Offset(offset).Find(&events).Error; err != nil { - return nil, &errors.FailedToGetEvents - } - - return events, nil -} diff --git a/backend/entities/clubs/event/controller.go b/backend/entities/clubs/events/controller.go similarity index 66% rename from backend/entities/clubs/event/controller.go rename to backend/entities/clubs/events/controller.go index 8e7c677aa..9f0235657 100644 --- a/backend/entities/clubs/event/controller.go +++ b/backend/entities/clubs/events/controller.go @@ -1,7 +1,10 @@ -package event +package events import ( - "github.com/GenerateNU/sac/backend/constants" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -24,14 +27,19 @@ func NewClubEventController(clubEventService ClubEventServiceInterface) *ClubEve // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.Event -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/events/ [get] func (cl *ClubEventController) GetClubEvents(c *fiber.Ctx) error { - if events, err := cl.clubEventService.GetClubEvents(c.Params("clubID"), c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)); err != nil { - return err.FiberError(c) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + if events, err := cl.clubEventService.GetClubEvents(c.Params("clubID"), *pagination); err != nil { + return err } else { - return c.Status(fiber.StatusOK).JSON(events) + return c.Status(http.StatusOK).JSON(events) } } diff --git a/backend/entities/clubs/event/routes.go b/backend/entities/clubs/events/routes.go similarity index 72% rename from backend/entities/clubs/event/routes.go rename to backend/entities/clubs/events/routes.go index e18221b62..1a0bd42dd 100644 --- a/backend/entities/clubs/event/routes.go +++ b/backend/entities/clubs/events/routes.go @@ -1,4 +1,4 @@ -package event +package events import ( "github.com/GenerateNU/sac/backend/types" @@ -10,5 +10,5 @@ func ClubEvent(clubParams types.RouteParams) { // api/v1/clubs/:clubID/events/* events := clubParams.Router.Group("/events") - events.Get("/", clubEventController.GetClubEvents) + events.Get("/", clubParams.UtilityMiddleware.Paginator, clubEventController.GetClubEvents) } diff --git a/backend/entities/clubs/events/service.go b/backend/entities/clubs/events/service.go new file mode 100644 index 000000000..4f11880f2 --- /dev/null +++ b/backend/entities/clubs/events/service.go @@ -0,0 +1,29 @@ +package events + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" +) + +type ClubEventServiceInterface interface { + GetClubEvents(clubID string, pageInfo fiberpaginate.PageInfo) ([]models.Event, error) +} + +type ClubEventService struct { + types.ServiceParams +} + +func NewClubEventService(params types.ServiceParams) ClubEventServiceInterface { + return &ClubEventService{params} +} + +func (c *ClubEventService) GetClubEvents(clubID string, pageInfo fiberpaginate.PageInfo) ([]models.Event, error) { + idAsUUID, err := utilities.ValidateID(clubID) + if err != nil { + return nil, err + } + + return GetClubEvents(c.DB, *idAsUUID, pageInfo) +} diff --git a/backend/entities/clubs/events/transactions.go b/backend/entities/clubs/events/transactions.go new file mode 100644 index 000000000..f8e681715 --- /dev/null +++ b/backend/entities/clubs/events/transactions.go @@ -0,0 +1,20 @@ +package events + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/utilities" + + "github.com/garrettladley/fiberpaginate" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func GetClubEvents(db *gorm.DB, clubID uuid.UUID, pageInfo fiberpaginate.PageInfo) ([]models.Event, error) { + var events []models.Event + + if err := db.Where("club_id = ?", clubID).Scopes(utilities.IntoScope(pageInfo, db)).Find(&events).Error; err != nil { + return nil, err + } + + return events, nil +} diff --git a/backend/entities/clubs/follower/service.go b/backend/entities/clubs/follower/service.go deleted file mode 100644 index ec63940f2..000000000 --- a/backend/entities/clubs/follower/service.go +++ /dev/null @@ -1,39 +0,0 @@ -package follower - -import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/GenerateNU/sac/backend/types" - "github.com/GenerateNU/sac/backend/utilities" -) - -type ClubFollowerServiceInterface interface { - GetClubFollowers(clubID string, limit string, page string) ([]models.User, *errors.Error) -} - -type ClubFollowerService struct { - types.ServiceParams -} - -func NewClubFollowerService(params types.ServiceParams) ClubFollowerServiceInterface { - return &ClubFollowerService{params} -} - -func (cf *ClubFollowerService) GetClubFollowers(clubID string, limit string, page string) ([]models.User, *errors.Error) { - idAsUUID, err := utilities.ValidateID(clubID) - if err != nil { - return nil, &errors.FailedToValidateID - } - - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetClubFollowers(cf.DB, *idAsUUID, *limitAsInt, *pageAsInt) -} diff --git a/backend/entities/clubs/follower/transactions.go b/backend/entities/clubs/follower/transactions.go deleted file mode 100644 index 929f1202f..000000000 --- a/backend/entities/clubs/follower/transactions.go +++ /dev/null @@ -1,26 +0,0 @@ -package follower - -import ( - "github.com/GenerateNU/sac/backend/entities/clubs" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/google/uuid" - "gorm.io/gorm" -) - -func GetClubFollowers(db *gorm.DB, clubID uuid.UUID, limit int, page int) ([]models.User, *errors.Error) { - club, err := clubs.GetClub(db, clubID) - if err != nil { - return nil, err - } - - var users []models.User - - offset := (page - 1) * limit - - if err := db.Limit(limit).Offset(offset).Model(&club).Association("Follower").Find(&users); err != nil { - return nil, &errors.FailedToGetClubFollowers - } - - return users, nil -} diff --git a/backend/entities/clubs/follower/controller.go b/backend/entities/clubs/followers/controller.go similarity index 67% rename from backend/entities/clubs/follower/controller.go rename to backend/entities/clubs/followers/controller.go index 7e56d3516..45f8b9217 100644 --- a/backend/entities/clubs/follower/controller.go +++ b/backend/entities/clubs/followers/controller.go @@ -1,7 +1,10 @@ -package follower +package followers import ( - "github.com/GenerateNU/sac/backend/constants" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -24,15 +27,20 @@ func NewClubFollowerController(clubFollowerService ClubFollowerServiceInterface) // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.User -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/followers/ [get] func (cf *ClubFollowerController) GetClubFollowers(c *fiber.Ctx) error { - followers, err := cf.clubFollowerService.GetClubFollowers(c.Params("clubID"), c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + followers, err := cf.clubFollowerService.GetClubFollowers(c.Params("clubID"), *pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(followers) + return c.Status(http.StatusOK).JSON(followers) } diff --git a/backend/entities/clubs/follower/routes.go b/backend/entities/clubs/followers/routes.go similarity index 71% rename from backend/entities/clubs/follower/routes.go rename to backend/entities/clubs/followers/routes.go index 294f735e8..81f9e3a61 100644 --- a/backend/entities/clubs/follower/routes.go +++ b/backend/entities/clubs/followers/routes.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/types" @@ -10,5 +10,5 @@ func ClubFollower(clubParams types.RouteParams) { clubFollowers := clubParams.Router.Group("/followers") // api/clubs/:clubID/followers/* - clubFollowers.Get("/", clubFollowerController.GetClubFollowers) + clubFollowers.Get("/", clubParams.UtilityMiddleware.Paginator, clubFollowerController.GetClubFollowers) } diff --git a/backend/entities/clubs/followers/service.go b/backend/entities/clubs/followers/service.go new file mode 100644 index 000000000..e1fced5c2 --- /dev/null +++ b/backend/entities/clubs/followers/service.go @@ -0,0 +1,29 @@ +package followers + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" +) + +type ClubFollowerServiceInterface interface { + GetClubFollowers(clubID string, pageInfo fiberpaginate.PageInfo) ([]models.User, error) +} + +type ClubFollowerService struct { + types.ServiceParams +} + +func NewClubFollowerService(params types.ServiceParams) ClubFollowerServiceInterface { + return &ClubFollowerService{params} +} + +func (cf *ClubFollowerService) GetClubFollowers(clubID string, pageInfo fiberpaginate.PageInfo) ([]models.User, error) { + idAsUUID, err := utilities.ValidateID(clubID) + if err != nil { + return nil, err + } + + return GetClubFollowers(cf.DB, *idAsUUID, pageInfo) +} diff --git a/backend/entities/clubs/followers/transactions.go b/backend/entities/clubs/followers/transactions.go new file mode 100644 index 000000000..8a98f8d2e --- /dev/null +++ b/backend/entities/clubs/followers/transactions.go @@ -0,0 +1,24 @@ +package followers + +import ( + "github.com/GenerateNU/sac/backend/entities/clubs" + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func GetClubFollowers(db *gorm.DB, clubID uuid.UUID, pageInfo fiberpaginate.PageInfo) ([]models.User, error) { + club, err := clubs.GetClub(db, clubID) + if err != nil { + return nil, err + } + + var users []models.User + if err := db.Scopes(utilities.IntoScope(pageInfo, db)).Model(&club).Association("Follower").Find(&users); err != nil { + return nil, err + } + + return users, nil +} diff --git a/backend/entities/clubs/member/controller.go b/backend/entities/clubs/member/controller.go deleted file mode 100644 index 3e241ff64..000000000 --- a/backend/entities/clubs/member/controller.go +++ /dev/null @@ -1,39 +0,0 @@ -package member - -import ( - "github.com/GenerateNU/sac/backend/constants" - "github.com/gofiber/fiber/v2" -) - -type ClubMemberController struct { - clubMemberService ClubMemberServiceInterface -} - -func NewClubMemberController(clubMemberService ClubMemberServiceInterface) *ClubMemberController { - return &ClubMemberController{clubMemberService: clubMemberService} -} - -// GetClubMembers godoc -// -// @Summary Retrieve all members for a club -// @Description Retrieves all members associated with a club -// @ID get-members-by-club -// @Tags club-member -// @Produce json -// @Param clubID path string true "Club ID" -// @Param limit query int false "Limit" -// @Param page query int false "Page" -// @Success 200 {object} []models.User -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /clubs/{clubID}/members/ [get] -func (cm *ClubMemberController) GetClubMembers(c *fiber.Ctx) error { - followers, err := cm.clubMemberService.GetClubMembers(c.Params("clubID"), c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) - if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusOK).JSON(followers) -} diff --git a/backend/entities/clubs/member/routes.go b/backend/entities/clubs/member/routes.go deleted file mode 100644 index a7cdfb093..000000000 --- a/backend/entities/clubs/member/routes.go +++ /dev/null @@ -1,14 +0,0 @@ -package member - -import ( - "github.com/GenerateNU/sac/backend/types" -) - -func ClubMember(clubParams types.RouteParams) { - clubMemberController := NewClubMemberController(NewClubMemberService(clubParams.ServiceParams)) - - clubMembers := clubParams.Router.Group("/members") - - // api/v1/clubs/:clubID/members/* - clubMembers.Get("/", clubMemberController.GetClubMembers) -} diff --git a/backend/entities/clubs/member/service.go b/backend/entities/clubs/member/service.go deleted file mode 100644 index 88549c794..000000000 --- a/backend/entities/clubs/member/service.go +++ /dev/null @@ -1,39 +0,0 @@ -package member - -import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/GenerateNU/sac/backend/types" - "github.com/GenerateNU/sac/backend/utilities" -) - -type ClubMemberServiceInterface interface { - GetClubMembers(clubID string, limit string, page string) ([]models.User, *errors.Error) -} - -type ClubMemberService struct { - types.ServiceParams -} - -func NewClubMemberService(params types.ServiceParams) ClubMemberServiceInterface { - return &ClubMemberService{params} -} - -func (cms *ClubMemberService) GetClubMembers(clubID string, limit string, page string) ([]models.User, *errors.Error) { - idAsUUID, err := utilities.ValidateID(clubID) - if err != nil { - return nil, &errors.FailedToValidateID - } - - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetClubMembers(cms.DB, *idAsUUID, *limitAsInt, *pageAsInt) -} diff --git a/backend/entities/clubs/member/transactions.go b/backend/entities/clubs/member/transactions.go deleted file mode 100644 index 6d5308d1b..000000000 --- a/backend/entities/clubs/member/transactions.go +++ /dev/null @@ -1,27 +0,0 @@ -package member - -import ( - "github.com/GenerateNU/sac/backend/entities/clubs" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - - "github.com/google/uuid" - "gorm.io/gorm" -) - -func GetClubMembers(db *gorm.DB, clubID uuid.UUID, limit int, page int) ([]models.User, *errors.Error) { - club, err := clubs.GetClub(db, clubID) - if err != nil { - return nil, err - } - - var users []models.User - - offset := (page - 1) * limit - - if err := db.Limit(limit).Offset(offset).Model(&club).Association("Member").Find(&users); err != nil { - return nil, &errors.FailedToGetClubMembers - } - - return users, nil -} diff --git a/backend/entities/clubs/members/controller.go b/backend/entities/clubs/members/controller.go new file mode 100644 index 000000000..b5c899bee --- /dev/null +++ b/backend/entities/clubs/members/controller.go @@ -0,0 +1,96 @@ +package members + +import ( + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" + "github.com/gofiber/fiber/v2" +) + +type ClubMemberController struct { + clubMemberService ClubMemberServiceInterface +} + +func NewClubMemberController(clubMemberService ClubMemberServiceInterface) *ClubMemberController { + return &ClubMemberController{clubMemberService: clubMemberService} +} + +// GetClubMembers godoc +// +// @Summary Retrieve all members for a club +// @Description Retrieves all members associated with a club +// @ID get-members-by-club +// @Tags club-member +// @Produce json +// @Param clubID path string true "Club ID" +// @Param limit query int false "Limit" +// @Param page query int false "Page" +// @Success 200 {object} []models.User +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /clubs/{clubID}/members/ [get] +func (cm *ClubMemberController) GetClubMembers(c *fiber.Ctx) error { + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + followers, err := cm.clubMemberService.GetClubMembers(c.Params("clubID"), *pagination) + if err != nil { + return err + } + + return c.Status(http.StatusOK).JSON(followers) +} + +// CreateClubMember godoc +// +// @Summary Create a new member for a club +// @Description Creates a new member associated with a club +// @ID create-member-for-club +// @Tags club-member +// @Accept json +// @Produce json +// @Param clubID path string true "Club ID" +// @Param userID path string true "User ID" +// @Success 201 {object} models.User +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /clubs/{clubID}/members/ [post] +func (cm *ClubMemberController) CreateClubMember(c *fiber.Ctx) error { + err := cm.clubMemberService.CreateClubMember(c.Params("clubID"), c.Params("userID")) + if err != nil { + return err + } + + return c.SendStatus(http.StatusCreated) +} + +// DeleteClubMember godoc +// +// @Summary Delete a member from a club +// @Description Deletes a member associated with a club +// @ID delete-member-from-club +// @Tags club-member +// @Produce json +// @Param clubID path string true "Club ID" +// @Param userID path string true "User ID" +// @Success 204 {object} models.User +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /clubs/{clubID}/members/ [delete] +func (cm *ClubMemberController) DeleteClubMember(c *fiber.Ctx) error { + err := cm.clubMemberService.DeleteClubMember(c.Params("clubID"), c.Params("userID")) + if err != nil { + return err + } + + return c.SendStatus(http.StatusNoContent) +} diff --git a/backend/entities/clubs/members/routes.go b/backend/entities/clubs/members/routes.go new file mode 100644 index 000000000..660a83db8 --- /dev/null +++ b/backend/entities/clubs/members/routes.go @@ -0,0 +1,25 @@ +package members + +import ( + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + "github.com/GenerateNU/sac/backend/types" +) + +func ClubMember(clubParams types.RouteParams) { + clubMemberController := NewClubMemberController(NewClubMemberService(clubParams.ServiceParams)) + + clubMembers := clubParams.Router.Group("/members") + + // api/v1/clubs/:clubID/members/* + clubMembers.Get("/", clubParams.UtilityMiddleware.Paginator, clubMemberController.GetClubMembers) + clubMembers.Post( + "/:userID", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubMemberController.CreateClubMember, + ) + clubMembers.Delete( + "/:userID", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubMemberController.DeleteClubMember, + ) +} diff --git a/backend/entities/clubs/members/service.go b/backend/entities/clubs/members/service.go new file mode 100644 index 000000000..4e23be332 --- /dev/null +++ b/backend/entities/clubs/members/service.go @@ -0,0 +1,59 @@ +package members + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" +) + +type ClubMemberServiceInterface interface { + GetClubMembers(clubID string, pageInfo fiberpaginate.PageInfo) ([]models.User, error) + CreateClubMember(clubID string, userID string) error + DeleteClubMember(clubID string, userID string) error +} + +type ClubMemberService struct { + types.ServiceParams +} + +func NewClubMemberService(params types.ServiceParams) ClubMemberServiceInterface { + return &ClubMemberService{params} +} + +func (cms *ClubMemberService) GetClubMembers(clubID string, pageInfo fiberpaginate.PageInfo) ([]models.User, error) { + clubIDAsUUID, err := utilities.ValidateID(clubID) + if err != nil { + return nil, err + } + + return GetClubMembers(cms.DB, *clubIDAsUUID, pageInfo) +} + +func (cms *ClubMemberService) CreateClubMember(clubID string, userID string) error { + clubIDAsUUID, err := utilities.ValidateID(clubID) + if err != nil { + return err + } + + userIDAsUUID, err := utilities.ValidateID(userID) + if err != nil { + return err + } + + return CreateClubMember(cms.DB, *clubIDAsUUID, *userIDAsUUID) +} + +func (cms *ClubMemberService) DeleteClubMember(clubID string, userID string) error { + clubIDAsUUID, err := utilities.ValidateID(clubID) + if err != nil { + return err + } + + userIDAsUUID, err := utilities.ValidateID(userID) + if err != nil { + return err + } + + return DeleteClubMember(cms.DB, *clubIDAsUUID, *userIDAsUUID) +} diff --git a/backend/entities/users/member/transactions.go b/backend/entities/clubs/members/transactions.go similarity index 53% rename from backend/entities/users/member/transactions.go rename to backend/entities/clubs/members/transactions.go index 6d03ce77a..8a0fd1f62 100644 --- a/backend/entities/users/member/transactions.go +++ b/backend/entities/clubs/members/transactions.go @@ -1,17 +1,32 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/entities/clubs" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/users" - "github.com/GenerateNU/sac/backend/entities/users/follower" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/entities/users/followers" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/google/uuid" "gorm.io/gorm" ) -func CreateMember(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Error { +func GetClubMembers(db *gorm.DB, clubID uuid.UUID, pageInfo fiberpaginate.PageInfo) ([]models.User, error) { + club, err := clubs.GetClub(db, clubID) + if err != nil { + return nil, err + } + + var users []models.User + if err := db.Scopes(utilities.IntoScope(pageInfo, db)).Model(&club).Association("Member").Find(&users); err != nil { + return nil, err + } + + return users, nil +} + +func CreateClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { user, err := users.GetUser(db, userID) if err != nil { return err @@ -23,10 +38,15 @@ func CreateMember(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Error } tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var count int64 if err := tx.Model(&models.Membership{}).Where("user_id = ? AND club_id = ?", userID, clubID).Count(&count).Error; err != nil { - return &errors.FailedToGetUserMemberships + return err } if count > 0 { @@ -35,27 +55,23 @@ func CreateMember(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Error if err := tx.Model(&user).Association("Member").Append(club); err != nil { tx.Rollback() - return &errors.FailedToUpdateUser + return err } - if err := follower.CreateFollowing(tx, userID, clubID); err != nil { + if err := followers.CreateFollowing(tx, userID, clubID); err != nil { tx.Rollback() return err } if err := tx.Model(&club).Update("num_members", gorm.Expr("num_members + 1")).Error; err != nil { tx.Rollback() - return &errors.FailedToUpdateUser - } - - if err := tx.Commit().Error; err != nil { - return &errors.FailedToUpdateUser + return err } - return nil + return tx.Commit().Error } -func DeleteMember(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Error { +func DeleteClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { user, err := users.GetUser(db, userID) if err != nil { return err @@ -67,40 +83,26 @@ func DeleteMember(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Error } tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() if err := tx.Model(&user).Association("Member").Delete(club); err != nil { tx.Rollback() - return &errors.FailedToUpdateUser + return err } - if err := follower.DeleteFollowing(tx, userID, clubID); err != nil { + if err := followers.DeleteFollowing(tx, userID, clubID); err != nil { tx.Rollback() return err } if err := tx.Model(&club).Update("num_members", gorm.Expr("num_members - 1")).Error; err != nil { tx.Rollback() - return &errors.FailedToUpdateUser - } - - if err := tx.Commit().Error; err != nil { - return &errors.FailedToUpdateUser - } - - return nil -} - -func GetClubMembership(db *gorm.DB, userID uuid.UUID) ([]models.Club, *errors.Error) { - var clubs []models.Club - - user, err := users.GetUser(db, userID) - if err != nil { - return nil, err - } - - if err := db.Model(&user).Association("Member").Find(&clubs); err != nil { - return nil, &errors.FailedToGetUserMemberships + return err } - return clubs, nil + return tx.Commit().Error } diff --git a/backend/entities/clubs/poc/routes.go b/backend/entities/clubs/poc/routes.go deleted file mode 100644 index 135f72a8e..000000000 --- a/backend/entities/clubs/poc/routes.go +++ /dev/null @@ -1,19 +0,0 @@ -package poc - -import ( - "github.com/GenerateNU/sac/backend/types" -) - -func ClubPointOfContact(clubParams types.RouteParams) { - clubPointOfContactController := NewClubPointOfContactController(NewClubPointOfContactService(clubParams.ServiceParams)) - - clubPointOfContacts := clubParams.Router.Group("/pocs") - - // api/v1/clubs/:clubID/pocs/* - clubPointOfContacts.Get("/", clubPointOfContactController.GetClubPointOfContacts) - clubPointOfContacts.Get("/:pocID", clubPointOfContactController.GetClubPointOfContact) - clubPointOfContacts.Post("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.CreateClubPointOfContact) - clubPointOfContacts.Patch("/:pocID", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.UpdateClubPointOfContact) - clubPointOfContacts.Patch("/:pocID/photo", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.UpdateClubPointOfContactPhoto) - clubPointOfContacts.Delete("/:pocID", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.DeleteClubPointOfContact) -} diff --git a/backend/entities/clubs/poc/controller.go b/backend/entities/clubs/pocs/controller.go similarity index 66% rename from backend/entities/clubs/poc/controller.go rename to backend/entities/clubs/pocs/controller.go index 58214b04c..8d9de7e6f 100644 --- a/backend/entities/clubs/poc/controller.go +++ b/backend/entities/clubs/pocs/controller.go @@ -1,8 +1,9 @@ -package poc +package pocs import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -23,17 +24,17 @@ func NewClubPointOfContactController(clubPointOfContactService ClubPointOfContac // @Produce json // @Param clubID path string true "Club ID" // @Success 200 {object} []models.PointOfContact -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/pocs/ [get] func (cpoc *ClubPointOfContactController) GetClubPointOfContacts(c *fiber.Ctx) error { pointOfContact, err := cpoc.clubPointOfContactService.GetClubPointOfContacts(c.Params("clubID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(pointOfContact) + return c.Status(http.StatusOK).JSON(pointOfContact) } // GetClubPointOfContact godoc @@ -46,17 +47,17 @@ func (cpoc *ClubPointOfContactController) GetClubPointOfContacts(c *fiber.Ctx) e // @Param clubID path string true "Club ID" // @Param pocID path string true "Point of Contact ID" // @Success 200 {object} models.PointOfContact -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/pocs/{pocID} [get] func (cpoc *ClubPointOfContactController) GetClubPointOfContact(c *fiber.Ctx) error { pointOfContact, err := cpoc.clubPointOfContactService.GetClubPointOfContact(c.Params("clubID"), c.Params("pocID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(pointOfContact) + return c.Status(http.StatusOK).JSON(pointOfContact) } // UpdateClubPointOfContactPhoto godoc @@ -70,23 +71,23 @@ func (cpoc *ClubPointOfContactController) GetClubPointOfContact(c *fiber.Ctx) er // @Param clubID path string true "Club ID" // @Param pocID path string true "Point of Contact ID" // @Success 200 {object} models.PointOfContact -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/poc/{pocID} [patch] func (cpoc *ClubPointOfContactController) UpdateClubPointOfContactPhoto(c *fiber.Ctx) error { - formFile, parseErr := c.FormFile("file") - if parseErr != nil { - return errors.FailedToParseRequestBody.FiberError(c) + formFile, err := c.FormFile("file") + if err != nil { + return err } pointOfContact, err := cpoc.clubPointOfContactService.UpdateClubPointOfContactPhoto(c.Params("clubID"), c.Params("pocID"), formFile) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(pointOfContact) + return c.Status(http.StatusOK).JSON(pointOfContact) } // UpdateClubPointOfContact godoc @@ -100,24 +101,24 @@ func (cpoc *ClubPointOfContactController) UpdateClubPointOfContactPhoto(c *fiber // @Param clubID path string true "Club ID" // @Param pocID path string true "Point of Contact ID" // @Success 200 {object} models.PointOfContact -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/poc/{pocID} [put] func (cpoc *ClubPointOfContactController) UpdateClubPointOfContact(c *fiber.Ctx) error { - var pointOfContactBody models.UpdatePointOfContactBody + var pointOfContactBody UpdatePointOfContactBody - if parseErr := c.BodyParser(&pointOfContactBody); parseErr != nil { - return errors.FailedToParseRequestBody.FiberError(c) + if err := c.BodyParser(&pointOfContactBody); err != nil { + return utilities.InvalidJSON() } pointOfContact, err := cpoc.clubPointOfContactService.UpdateClubPointOfContact(c.Params("clubID"), c.Params("pocID"), pointOfContactBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(pointOfContact) + return c.Status(http.StatusOK).JSON(pointOfContact) } // CreateClubPointOfContact godoc @@ -130,29 +131,29 @@ func (cpoc *ClubPointOfContactController) UpdateClubPointOfContact(c *fiber.Ctx) // @Produce json // @Param clubID path string true "Club ID" // @Success 201 {object} models.PointOfContact -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/poc/ [post] func (cpoc *ClubPointOfContactController) CreateClubPointOfContact(c *fiber.Ctx) error { - var pointOfContactBody models.CreatePointOfContactBody + var pointOfContactBody CreatePointOfContactBody - if parseErr := c.BodyParser(&pointOfContactBody); parseErr != nil { - return errors.FailedToParseRequestBody.FiberError(c) + if err := c.BodyParser(&pointOfContactBody); err != nil { + return utilities.InvalidJSON() } - formFile, parseErr := c.FormFile("file") - if parseErr != nil { - return errors.FailedToParseRequestBody.FiberError(c) + formFile, err := c.FormFile("file") + if err != nil { + return err } pointOfContact, err := cpoc.clubPointOfContactService.CreateClubPointOfContact(c.Params("clubID"), pointOfContactBody, formFile) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(pointOfContact) + return c.Status(http.StatusCreated).JSON(pointOfContact) } // DeleteClubPointOfContact godoc @@ -165,15 +166,15 @@ func (cpoc *ClubPointOfContactController) CreateClubPointOfContact(c *fiber.Ctx) // @Param clubID path string true "Club ID" // @Param pocID path string true "Point of Contact ID" // @Success 204 {object} nil -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/poc/{pocID} [delete] func (cpoc *ClubPointOfContactController) DeleteClubPointOfContact(c *fiber.Ctx) error { err := cpoc.clubPointOfContactService.DeleteClubPointOfContact(c.Params("clubID"), c.Params("pocID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/clubs/pocs/models.go b/backend/entities/clubs/pocs/models.go new file mode 100644 index 000000000..85fa0a9dd --- /dev/null +++ b/backend/entities/clubs/pocs/models.go @@ -0,0 +1,13 @@ +package pocs + +type CreatePointOfContactBody struct { + Name string `json:"name" validate:"required,max=255"` + Email string `json:"email" validate:"required,email,max=255"` + Position string `json:"position" validate:"required,max=255"` +} + +type UpdatePointOfContactBody struct { + Name string `json:"name" validate:"omitempty,max=255"` + Email string `json:"email" validate:"omitempty,email,max=255"` + Position string `json:"position" validate:"omitempty,max=255"` +} diff --git a/backend/entities/clubs/pocs/routes.go b/backend/entities/clubs/pocs/routes.go new file mode 100644 index 000000000..bd57f188c --- /dev/null +++ b/backend/entities/clubs/pocs/routes.go @@ -0,0 +1,36 @@ +package pocs + +import ( + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + "github.com/GenerateNU/sac/backend/types" +) + +func ClubPointOfContact(clubParams types.RouteParams) { + clubPointOfContactController := NewClubPointOfContactController(NewClubPointOfContactService(clubParams.ServiceParams)) + + clubPointOfContacts := clubParams.Router.Group("/pocs") + + // api/v1/clubs/:clubID/pocs/* + clubPointOfContacts.Get("/", clubPointOfContactController.GetClubPointOfContacts) + clubPointOfContacts.Get("/:pocID", clubPointOfContactController.GetClubPointOfContact) + clubPointOfContacts.Post( + "/", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubPointOfContactController.CreateClubPointOfContact, + ) + clubPointOfContacts.Patch( + "/:pocID", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubPointOfContactController.UpdateClubPointOfContact, + ) + clubPointOfContacts.Patch( + "/:pocID/photo", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubPointOfContactController.UpdateClubPointOfContactPhoto, + ) + clubPointOfContacts.Delete( + "/:pocID", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubPointOfContactController.DeleteClubPointOfContact, + ) +} diff --git a/backend/entities/clubs/poc/service.go b/backend/entities/clubs/pocs/service.go similarity index 70% rename from backend/entities/clubs/poc/service.go rename to backend/entities/clubs/pocs/service.go index 2b7fcf7e9..82472507e 100644 --- a/backend/entities/clubs/poc/service.go +++ b/backend/entities/clubs/pocs/service.go @@ -1,4 +1,4 @@ -package poc +package pocs import ( "mime/multipart" @@ -6,19 +6,18 @@ import ( "github.com/GenerateNU/sac/backend/entities/files/base" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/integrations/file" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" ) type ClubPointOfContactServiceInterface interface { - GetClubPointOfContacts(clubID string) ([]models.PointOfContact, *errors.Error) - GetClubPointOfContact(clubID, pocID string) (*models.PointOfContact, *errors.Error) - CreateClubPointOfContact(clubID string, pointOfContactBody models.CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, *errors.Error) - UpdateClubPointOfContactPhoto(clubID, pocID string, fileHeader *multipart.FileHeader) (*models.PointOfContact, *errors.Error) - UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody models.UpdatePointOfContactBody) (*models.PointOfContact, *errors.Error) - DeleteClubPointOfContact(clubID, pocID string) *errors.Error + GetClubPointOfContacts(clubID string) ([]models.PointOfContact, error) + GetClubPointOfContact(clubID, pocID string) (*models.PointOfContact, error) + CreateClubPointOfContact(clubID string, pointOfContactBody CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) + UpdateClubPointOfContactPhoto(clubID, pocID string, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) + UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody UpdatePointOfContactBody) (*models.PointOfContact, error) + DeleteClubPointOfContact(clubID, pocID string) error } type ClubPointOfContactService struct { @@ -29,42 +28,42 @@ func NewClubPointOfContactService(serviceParams types.ServiceParams) ClubPointOf return &ClubPointOfContactService{serviceParams} } -func (cpoc *ClubPointOfContactService) GetClubPointOfContacts(clubID string) ([]models.PointOfContact, *errors.Error) { +func (cpoc *ClubPointOfContactService) GetClubPointOfContacts(clubID string) ([]models.PointOfContact, error) { clubIdAsUUID, err := utilities.ValidateID(clubID) if err != nil { - return nil, &errors.FailedToValidateClub + return nil, err } return GetClubPointOfContacts(cpoc.DB, *clubIdAsUUID) } -func (cpoc *ClubPointOfContactService) GetClubPointOfContact(clubID, pocID string) (*models.PointOfContact, *errors.Error) { +func (cpoc *ClubPointOfContactService) GetClubPointOfContact(clubID, pocID string) (*models.PointOfContact, error) { clubIdAsUUID, err := utilities.ValidateID(clubID) if err != nil { - return nil, &errors.FailedToValidateClub + return nil, err } pocIdAsUUID, err := utilities.ValidateID(pocID) if err != nil { - return nil, &errors.FailedToValidatePointOfContactId + return nil, err } return GetClubPointOfContact(cpoc.DB, *clubIdAsUUID, *pocIdAsUUID) } -func (cpoc *ClubPointOfContactService) CreateClubPointOfContact(clubID string, pointOfContactBody models.CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, *errors.Error) { - if err := cpoc.Validate.Struct(pointOfContactBody); err != nil { - return nil, &errors.FailedToValidatePointOfContact +func (cpoc *ClubPointOfContactService) CreateClubPointOfContact(clubID string, pointOfContactBody CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) { + if err := utilities.Validate(cpoc.Validate, pointOfContactBody); err != nil { + return nil, err } clubIdAsUUID, err := utilities.ValidateID(clubID) if err != nil { - return nil, &errors.FailedToValidateClub + return nil, err } _, err = GetClubPointOfContactByClubIDAndEmail(cpoc.DB, *clubIdAsUUID, pointOfContactBody.Email) if err == nil { - return nil, &errors.PointOfContactAlreadyExists + return nil, err } fileInfo, err := cpoc.Integrations.File.UploadFile("point_of_contacts", fileHeader, []file.FileType{file.IMAGE}) @@ -96,7 +95,7 @@ func (cpoc *ClubPointOfContactService) CreateClubPointOfContact(clubID string, p return nil, err } - return nil, &errors.FailedToCreatePointOfContact + return nil, err } poc.PhotoFile = *file @@ -104,15 +103,15 @@ func (cpoc *ClubPointOfContactService) CreateClubPointOfContact(clubID string, p return poc, nil } -func (cpoc *ClubPointOfContactService) UpdateClubPointOfContactPhoto(clubID, pocID string, fileHeader *multipart.FileHeader) (*models.PointOfContact, *errors.Error) { +func (cpoc *ClubPointOfContactService) UpdateClubPointOfContactPhoto(clubID, pocID string, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) { clubIdAsUUID, err := utilities.ValidateID(clubID) if err != nil { - return nil, &errors.FailedToValidateClub + return nil, err } pocIdAsUUID, err := utilities.ValidateID(pocID) if err != nil { - return nil, &errors.FailedToValidatePointOfContactId + return nil, err } pointOfContact, err := GetClubPointOfContact(cpoc.DB, *clubIdAsUUID, *pocIdAsUUID) @@ -139,33 +138,33 @@ func (cpoc *ClubPointOfContactService) UpdateClubPointOfContactPhoto(clubID, poc return pointOfContact, nil } -func (cpoc *ClubPointOfContactService) UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody models.UpdatePointOfContactBody) (*models.PointOfContact, *errors.Error) { - if err := cpoc.Validate.Struct(pointOfContactBody); err != nil { - return nil, &errors.FailedToValidatePointOfContact +func (cpoc *ClubPointOfContactService) UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody UpdatePointOfContactBody) (*models.PointOfContact, error) { + if err := utilities.Validate(cpoc.Validate, pointOfContactBody); err != nil { + return nil, err } clubIdAsUUID, err := utilities.ValidateID(clubID) if err != nil { - return nil, &errors.FailedToValidateClub + return nil, err } pocIdAsUUID, err := utilities.ValidateID(pocID) if err != nil { - return nil, &errors.FailedToValidatePointOfContactId + return nil, err } return UpdateClubPointOfContact(cpoc.DB, *clubIdAsUUID, *pocIdAsUUID, pointOfContactBody) } -func (cpoc *ClubPointOfContactService) DeleteClubPointOfContact(clubID, pocID string) *errors.Error { +func (cpoc *ClubPointOfContactService) DeleteClubPointOfContact(clubID, pocID string) error { clubIdAsUUID, err := utilities.ValidateID(clubID) if err != nil { - return &errors.FailedToValidateClub + return err } pocIdAsUUID, err := utilities.ValidateID(pocID) if err != nil { - return &errors.FailedToValidatePointOfContactId + return err } pointOfContact, err := GetClubPointOfContact(cpoc.DB, *clubIdAsUUID, *pocIdAsUUID) @@ -184,7 +183,7 @@ func (cpoc *ClubPointOfContactService) DeleteClubPointOfContact(clubID, pocID st } }() if err := tx.Error; err != nil { - return &errors.FailedToDeleteClubPointOfContact + return err } err = base.DeleteFile(tx, pointOfContact.PhotoFile.ID) @@ -200,7 +199,7 @@ func (cpoc *ClubPointOfContactService) DeleteClubPointOfContact(clubID, pocID st } if err := tx.Commit().Error; err != nil { - return &errors.FailedToDeleteClubPointOfContact + return err } return nil diff --git a/backend/entities/clubs/poc/transactions.go b/backend/entities/clubs/pocs/transactions.go similarity index 59% rename from backend/entities/clubs/poc/transactions.go rename to backend/entities/clubs/pocs/transactions.go index b339a53b9..5233fdfaa 100644 --- a/backend/entities/clubs/poc/transactions.go +++ b/backend/entities/clubs/pocs/transactions.go @@ -1,58 +1,57 @@ -package poc +package pocs import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) -func GetClubPointOfContacts(db *gorm.DB, clubID uuid.UUID) ([]models.PointOfContact, *errors.Error) { +func GetClubPointOfContacts(db *gorm.DB, clubID uuid.UUID) ([]models.PointOfContact, error) { var pointOfContacts []models.PointOfContact result := db.Preload("PhotoFile").Where("club_id = ?", clubID).Find(&pointOfContacts) if result.Error != nil { - if stdliberrors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, &errors.PointOfContactsNotFound - } else { - return nil, &errors.FailedToGetClubPointOfContacts + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, result.Error } return pointOfContacts, nil } -func GetClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID) (*models.PointOfContact, *errors.Error) { +func GetClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID) (*models.PointOfContact, error) { var pointOfContact models.PointOfContact if err := db.Preload("PhotoFile").First(&pointOfContact, "id = ? AND club_id = ?", pocID, clubID).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.PointOfContactNotFound - } else { - return nil, &errors.FailedToGetClubPointOfContact + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &pointOfContact, nil } -func GetClubPointOfContactByClubIDAndEmail(db *gorm.DB, clubID uuid.UUID, email string) (*models.PointOfContact, *errors.Error) { +func GetClubPointOfContactByClubIDAndEmail(db *gorm.DB, clubID uuid.UUID, email string) (*models.PointOfContact, error) { var pointOfContact models.PointOfContact if err := db.First(&pointOfContact, "email = ? AND club_id = ?", email, clubID).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.PointOfContactNotFound - } else { - return nil, &errors.FailedToGetClubPointOfContact + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &pointOfContact, nil } -func CreateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pointOfContactBody models.CreatePointOfContactBody) (*models.PointOfContact, *errors.Error) { +func CreateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pointOfContactBody CreatePointOfContactBody) (*models.PointOfContact, error) { pointOfContact := models.PointOfContact{ Name: pointOfContactBody.Name, Email: pointOfContactBody.Email, @@ -61,35 +60,33 @@ func CreateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pointOfContactBody } if err := db.Create(&pointOfContact).Error; err != nil { - return nil, &errors.FailedToCreatePointOfContact + return nil, err } return &pointOfContact, nil } -func UpdateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID, pointOfContactBody models.UpdatePointOfContactBody) (*models.PointOfContact, *errors.Error) { +func UpdateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID, pointOfContactBody UpdatePointOfContactBody) (*models.PointOfContact, error) { pointOfContact, err := GetClubPointOfContact(db, clubID, pocID) if err != nil { return nil, err } - - if err := db.Model(&pointOfContact).Updates(models.PointOfContact{ + if err := db.Model(&pointOfContact).Clauses(clause.Returning{}).Updates(models.PointOfContact{ Name: pointOfContactBody.Name, Email: pointOfContactBody.Email, Position: pointOfContactBody.Position, }).Error; err != nil { - return nil, &errors.FailedToUpdateClubPointOfContact + return nil, err } return pointOfContact, nil } -func DeleteClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID) *errors.Error { +func DeleteClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID) error { if result := db.Delete(&models.PointOfContact{}, "id = ? AND club_id = ?", pocID, clubID); result.RowsAffected == 0 { if result.Error == nil { - return &errors.PointOfContactNotFound - } else { - return &errors.FailedToDeleteClubPointOfContact + return utilities.ErrNotFound } + return result.Error } return nil } diff --git a/backend/entities/clubs/tag/routes.go b/backend/entities/clubs/tag/routes.go deleted file mode 100644 index 552929089..000000000 --- a/backend/entities/clubs/tag/routes.go +++ /dev/null @@ -1,15 +0,0 @@ -package tag - -import ( - "github.com/GenerateNU/sac/backend/types" -) - -func ClubTag(clubParams types.RouteParams) { - clubTagController := NewClubTagController(NewClubTagService(clubParams.ServiceParams)) - - clubTags := clubParams.Router.Group("/tags") - - clubTags.Get("/", clubTagController.GetClubTags) - clubTags.Post("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubTagController.CreateClubTags) - clubTags.Delete("/:tagID", clubParams.AuthMiddleware.ClubAuthorizeById, clubTagController.DeleteClubTag) -} diff --git a/backend/entities/clubs/tag/controller.go b/backend/entities/clubs/tags/controller.go similarity index 63% rename from backend/entities/clubs/tag/controller.go rename to backend/entities/clubs/tags/controller.go index 87d0fda92..597bef7a3 100644 --- a/backend/entities/clubs/tag/controller.go +++ b/backend/entities/clubs/tags/controller.go @@ -1,8 +1,9 @@ -package tag +package tags import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -23,25 +24,25 @@ func NewClubTagController(clubTagService ClubTagServiceInterface) *ClubTagContro // @Accept json // @Produce json // @Param clubID path string true "Club ID" -// @Param clubTagsBody body models.CreateClubTagsRequestBody true "Club Tags Body" +// @Param clubTagsBody body CreateClubTagsRequestBody true "Club Tags Body" // @Success 201 {object} []models.Tag -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/tags/ [post] func (l *ClubTagController) CreateClubTags(c *fiber.Ctx) error { - var clubTagsBody models.CreateClubTagsRequestBody + var clubTagsBody CreateClubTagsRequestBody if err := c.BodyParser(&clubTagsBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } clubTags, err := l.clubTagService.CreateClubTags(c.Params("clubID"), clubTagsBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(clubTags) + return c.Status(http.StatusCreated).JSON(clubTags) } // GetClubTags godoc @@ -53,17 +54,17 @@ func (l *ClubTagController) CreateClubTags(c *fiber.Ctx) error { // @Produce json // @Param clubID path string true "Club ID" // @Success 200 {object} []models.Tag -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/tags/ [get] func (l *ClubTagController) GetClubTags(c *fiber.Ctx) error { clubTags, err := l.clubTagService.GetClubTags(c.Params("clubID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(clubTags) + return c.Status(http.StatusOK).JSON(clubTags) } // DeleteClubTag godoc @@ -76,16 +77,16 @@ func (l *ClubTagController) GetClubTags(c *fiber.Ctx) error { // @Param clubID path string true "Club ID" // @Param tagID path string true "Tag ID" // @Success 204 {string} utilites.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /clubs/{clubID}/tags/{tagID}/ [delete] func (l *ClubTagController) DeleteClubTag(c *fiber.Ctx) error { err := l.clubTagService.DeleteClubTag(c.Params("clubID"), c.Params("tagID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/clubs/tags/models.go b/backend/entities/clubs/tags/models.go new file mode 100644 index 000000000..36f6e0bb8 --- /dev/null +++ b/backend/entities/clubs/tags/models.go @@ -0,0 +1,7 @@ +package tags + +import "github.com/google/uuid" + +type CreateClubTagsRequestBody struct { + Tags []uuid.UUID `json:"tags" validate:"required"` +} diff --git a/backend/entities/clubs/tags/routes.go b/backend/entities/clubs/tags/routes.go new file mode 100644 index 000000000..4384d1ee3 --- /dev/null +++ b/backend/entities/clubs/tags/routes.go @@ -0,0 +1,25 @@ +package tags + +import ( + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + "github.com/GenerateNU/sac/backend/types" +) + +func ClubTag(clubParams types.RouteParams) { + clubTagController := NewClubTagController(NewClubTagService(clubParams.ServiceParams)) + + clubTags := clubParams.Router.Group("/tags") + + // api/v1/clubs/:clubID/tags/* + clubTags.Get("/", clubTagController.GetClubTags) + clubTags.Post( + "/", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubTagController.CreateClubTags, + ) + clubTags.Delete( + "/:tagID", + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + clubTagController.DeleteClubTag, + ) +} diff --git a/backend/entities/clubs/tag/service.go b/backend/entities/clubs/tags/service.go similarity index 62% rename from backend/entities/clubs/tag/service.go rename to backend/entities/clubs/tags/service.go index 9b6b067cc..bff249500 100644 --- a/backend/entities/clubs/tag/service.go +++ b/backend/entities/clubs/tags/service.go @@ -1,17 +1,16 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/tags" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" ) type ClubTagServiceInterface interface { - CreateClubTags(id string, clubTagsBody models.CreateClubTagsRequestBody) ([]models.Tag, *errors.Error) - GetClubTags(id string) ([]models.Tag, *errors.Error) - DeleteClubTag(id string, tagId string) *errors.Error + CreateClubTags(id string, clubTagsBody CreateClubTagsRequestBody) ([]models.Tag, error) + GetClubTags(id string) ([]models.Tag, error) + DeleteClubTag(id string, tagId string) error } type ClubTagService struct { @@ -22,14 +21,14 @@ func NewClubTagService(serviceParams types.ServiceParams) ClubTagServiceInterfac return &ClubTagService{serviceParams} } -func (c *ClubTagService) CreateClubTags(id string, clubTagsBody models.CreateClubTagsRequestBody) ([]models.Tag, *errors.Error) { +func (c *ClubTagService) CreateClubTags(id string, clubTagsBody CreateClubTagsRequestBody) ([]models.Tag, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { return nil, err } - if err := c.Validate.Struct(clubTagsBody); err != nil { - return nil, &errors.FailedToValidateClubTags + if err := utilities.Validate(c.Validate, clubTagsBody); err != nil { + return nil, err } tags, err := tags.GetTagsByIDs(c.DB, clubTagsBody.Tags) @@ -40,24 +39,24 @@ func (c *ClubTagService) CreateClubTags(id string, clubTagsBody models.CreateClu return CreateClubTags(c.DB, *idAsUUID, tags) } -func (c *ClubTagService) GetClubTags(id string) ([]models.Tag, *errors.Error) { +func (c *ClubTagService) GetClubTags(id string) ([]models.Tag, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return GetClubTags(c.DB, *idAsUUID) } -func (c *ClubTagService) DeleteClubTag(id string, tagId string) *errors.Error { +func (c *ClubTagService) DeleteClubTag(id string, tagId string) error { idAsUUID, err := utilities.ValidateID(id) if err != nil { - return &errors.FailedToValidateID + return err } tagIdAsUUID, err := utilities.ValidateID(tagId) if err != nil { - return &errors.FailedToValidateID + return err } return DeleteClubTag(c.DB, *idAsUUID, *tagIdAsUUID) diff --git a/backend/entities/clubs/tag/transactions.go b/backend/entities/clubs/tags/transactions.go similarity index 57% rename from backend/entities/clubs/tag/transactions.go rename to backend/entities/clubs/tags/transactions.go index 16ec27f28..35d691961 100644 --- a/backend/entities/clubs/tag/transactions.go +++ b/backend/entities/clubs/tags/transactions.go @@ -1,45 +1,44 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/clubs" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/tags" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/transactions" "github.com/google/uuid" "gorm.io/gorm" ) -func CreateClubTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, *errors.Error) { - user, err := clubs.GetClub(db, id, transactions.PreloadTag()) +func CreateClubTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, error) { + club, err := clubs.GetClub(db, id, transactions.PreloadTag()) if err != nil { return nil, err } - if err := db.Model(&user).Association("Tag").Append(tags); err != nil { - return nil, &errors.FailedToUpdateUser + if err := db.Model(&club).Association("Tag").Append(tags); err != nil { + return nil, err } return tags, nil } -func GetClubTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, *errors.Error) { +func GetClubTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, error) { var tags []models.Tag - club, err := clubs.GetClub(db, id) + club, err := clubs.GetClub(db, id, transactions.PreloadTag()) if err != nil { return nil, err } if err := db.Model(&club).Association("Tag").Find(&tags); err != nil { - return nil, &errors.FailedToGetTag + return nil, err } return tags, nil } -func DeleteClubTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) *errors.Error { - club, err := clubs.GetClub(db, id) +func DeleteClubTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) error { + club, err := clubs.GetClub(db, id, transactions.PreloadTag()) if err != nil { return err } @@ -50,7 +49,7 @@ func DeleteClubTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) *errors.Error { } if err := db.Model(&club).Association("Tag").Delete(&tag); err != nil { - return &errors.FailedToUpdateClub + return err } return nil } diff --git a/backend/entities/clubs/transactions.go b/backend/entities/clubs/transactions.go index bbe8eeeeb..d501886d4 100644 --- a/backend/entities/clubs/transactions.go +++ b/backend/entities/clubs/transactions.go @@ -1,16 +1,16 @@ package clubs import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/transactions" + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" ) -func GetClub(db *gorm.DB, id uuid.UUID, preloads ...transactions.OptionalQuery) (*models.Club, *errors.Error) { +func GetClub(db *gorm.DB, id uuid.UUID, preloads ...transactions.OptionalQuery) (*models.Club, error) { var club models.Club query := db @@ -20,21 +20,20 @@ func GetClub(db *gorm.DB, id uuid.UUID, preloads ...transactions.OptionalQuery) } if err := query.First(&club, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.ClubNotFound - } else { - return nil, &errors.FailedToGetClub + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &club, nil } -func GetAdminIDs(db *gorm.DB, clubID uuid.UUID) ([]uuid.UUID, *errors.Error) { +func GetAdminIDs(db *gorm.DB, clubID uuid.UUID) ([]uuid.UUID, error) { var adminIDs []models.Membership if err := db.Where("club_id = ? AND membership_type = ?", clubID, models.MembershipTypeAdmin).Find(&adminIDs).Error; err != nil { - return nil, &errors.FailedtoGetAdminIDs + return nil, err } adminUUIDs := make([]uuid.UUID, 0) diff --git a/backend/entities/contacts/base/controller.go b/backend/entities/contacts/base/controller.go index 434e28f10..46d8b3670 100644 --- a/backend/entities/contacts/base/controller.go +++ b/backend/entities/contacts/base/controller.go @@ -1,7 +1,10 @@ package base import ( - "github.com/GenerateNU/sac/backend/constants" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -23,17 +26,17 @@ func NewContactController(contactService ContactServiceInterface) *ContactContro // @Produce json // @Param contactID path string true "Contact ID" // @Success 201 {object} models.Contact -// @Failure 400 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /contacts/{contactID}/ [get] func (co *ContactController) GetContact(c *fiber.Ctx) error { contact, err := co.contactService.GetContact(c.Params("contactID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(contact) + return c.Status(http.StatusOK).JSON(contact) } // GetContacts godoc @@ -46,17 +49,22 @@ func (co *ContactController) GetContact(c *fiber.Ctx) error { // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.Contact -// @Failure 400 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /contacts/ [get] func (co *ContactController) GetContacts(c *fiber.Ctx) error { - contacts, err := co.contactService.GetContacts(c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + contacts, err := co.contactService.GetContacts(*pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(contacts) + return c.Status(http.StatusOK).JSON(contacts) } // DeleteContact godoc @@ -69,15 +77,15 @@ func (co *ContactController) GetContacts(c *fiber.Ctx) error { // @Produce json // @Param contactID path string true "Contact ID" // @Success 201 {object} models.Contact -// @Failure 400 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /contacts/{contactID}/ [delete] func (co *ContactController) DeleteContact(c *fiber.Ctx) error { err := co.contactService.DeleteContact(c.Params("contactID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/contacts/base/routes.go b/backend/entities/contacts/base/routes.go index a44f51206..453705783 100644 --- a/backend/entities/contacts/base/routes.go +++ b/backend/entities/contacts/base/routes.go @@ -11,7 +11,7 @@ func Contact(contactParams types.RouteParams) { // api/v1/contacts/* contacts := contactParams.Router.Group("/contacts") - contacts.Get("/", contactController.GetContacts) + contacts.Get("/", contactParams.UtilityMiddleware.Paginator, contactController.GetContacts) contacts.Get("/:contactID", contactController.GetContact) contacts.Delete("/:contactID", contactParams.AuthMiddleware.Authorize(auth.DeleteAll), contactController.DeleteContact) } diff --git a/backend/entities/contacts/base/service.go b/backend/entities/contacts/base/service.go index 21b41187c..6b5967b2b 100644 --- a/backend/entities/contacts/base/service.go +++ b/backend/entities/contacts/base/service.go @@ -2,15 +2,15 @@ package base import ( "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" ) type ContactServiceInterface interface { - GetContacts(limit string, page string) ([]models.Contact, *errors.Error) - GetContact(contactID string) (*models.Contact, *errors.Error) - DeleteContact(contactID string) *errors.Error + GetContacts(pageInfo fiberpaginate.PageInfo) ([]models.Contact, error) + GetContact(contactID string) (*models.Contact, error) + DeleteContact(contactID string) error } type ContactService struct { @@ -21,33 +21,23 @@ func NewContactService(serviceParams types.ServiceParams) ContactServiceInterfac return &ContactService{serviceParams} } -func (c *ContactService) GetContacts(limit string, page string) ([]models.Contact, *errors.Error) { - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetContacts(c.DB, *limitAsInt, *pageAsInt) +func (c *ContactService) GetContacts(pageInfo fiberpaginate.PageInfo) ([]models.Contact, error) { + return GetContacts(c.DB, pageInfo) } -func (c *ContactService) GetContact(contactID string) (*models.Contact, *errors.Error) { +func (c *ContactService) GetContact(contactID string) (*models.Contact, error) { idAsUUID, err := utilities.ValidateID(contactID) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return GetContact(c.DB, *idAsUUID) } -func (c *ContactService) DeleteContact(contactID string) *errors.Error { +func (c *ContactService) DeleteContact(contactID string) error { idAsUUID, err := utilities.ValidateID(contactID) if err != nil { - return &errors.FailedToValidateID + return err } return DeleteContact(c.DB, *idAsUUID) diff --git a/backend/entities/contacts/base/transactions.go b/backend/entities/contacts/base/transactions.go index 9f0c4fe6b..fa21fceab 100644 --- a/backend/entities/contacts/base/transactions.go +++ b/backend/entities/contacts/base/transactions.go @@ -1,47 +1,42 @@ package base import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/google/uuid" "gorm.io/gorm" ) -func GetContacts(db *gorm.DB, limit int, page int) ([]models.Contact, *errors.Error) { +func GetContacts(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.Contact, error) { var contacts []models.Contact - - offset := (page - 1) * limit - - result := db.Limit(limit).Offset(offset).Find(&contacts) - if result.Error != nil { - return nil, &errors.FailedToGetContacts + if err := db.Scopes(utilities.IntoScope(pageInfo, db)).Find(&contacts).Error; err != nil { + return nil, err } return contacts, nil } -func GetContact(db *gorm.DB, id uuid.UUID) (*models.Contact, *errors.Error) { +func GetContact(db *gorm.DB, id uuid.UUID) (*models.Contact, error) { var contact models.Contact if err := db.First(&contact, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.ContactNotFound - } else { - return nil, &errors.FailedToGetContact + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, err } + return nil, err } return &contact, nil } -func DeleteContact(db *gorm.DB, id uuid.UUID) *errors.Error { +func DeleteContact(db *gorm.DB, id uuid.UUID) error { if result := db.Delete(&models.Contact{}, id); result.RowsAffected == 0 { if result.Error == nil { - return &errors.ContactNotFound - } else { - return &errors.FailedToDeleteContact + return utilities.ErrNotFound } + return result.Error } return nil } diff --git a/backend/entities/events/base/controller.go b/backend/entities/events/base/controller.go index 326d28a0f..e53934759 100644 --- a/backend/entities/events/base/controller.go +++ b/backend/entities/events/base/controller.go @@ -1,9 +1,11 @@ package base import ( - "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "net/http" + + "github.com/GenerateNU/sac/backend/entities/events" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -25,17 +27,22 @@ func NewEventController(eventService EventServiceInterface) *EventController { // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.Event -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /events/ [get] func (e *EventController) GetAllEvents(c *fiber.Ctx) error { - events, err := e.eventService.GetEvents(c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + events, err := e.eventService.GetEvents(*pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(events) + return c.Status(http.StatusOK).JSON(events) } // GetEvent godoc @@ -47,293 +54,52 @@ func (e *EventController) GetAllEvents(c *fiber.Ctx) error { // @Produce json // @Param eventID path string true "Event ID" // @Success 200 {object} models.Event -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /events/{eventID}/ [get] func (e *EventController) GetEvent(c *fiber.Ctx) error { event, err := e.eventService.GetEvent(c.Params("eventID")) if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusOK).JSON(event) -} - -// GetSeriesByEventID godoc -// -// @Summary Retrieve all series by event -// @Description Retrieves all series associated with an event -// @ID get-series-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 200 {object} []models.Series -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/series/ [get] -func (e *EventController) GetSeriesByEventID(c *fiber.Ctx) error { - events, err := e.eventService.GetSeriesByEventID(c.Params("eventID")) - if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(events) + return c.Status(http.StatusOK).JSON(event) } -// GetSeriesByID godoc -// -// @Summary Retrieve a series by ID -// @Description Retrieves a series by ID -// @ID get-series-by-id -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesID path string true "Series ID" -// @Success 200 {object} models.Series -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/series/{seriesID}/ [get] -func (e *EventController) GetSeriesByID(c *fiber.Ctx) error { - events, err := e.eventService.GetSeriesByID(c.Params("seriesID")) - if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusOK).JSON(events) -} - -// CreateEvent godoc -// -// @Summary Create an event -// @Description Creates an event -// @ID create-event -// @Tags event -// @Accept json -// @Produce json -// @Param event body models.CreateEventRequestBody true "Event Body" -// @Success 201 {object} models.Event -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/ [post] func (e *EventController) CreateEvent(c *fiber.Ctx) error { - var eventBody models.CreateEventRequestBody - if err := c.BodyParser(&eventBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + var body events.CreateEventRequestBody + if err := c.BodyParser(&body); err != nil { + return err } - event, err := e.eventService.CreateEvent(eventBody) + event, err := e.eventService.CreateEvent(body) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(event) + return c.Status(http.StatusCreated).JSON(event) } -// UpdateEvent godoc -// -// @Summary Create a series -// @Description Creates a series -// @ID create-series -// @Tags event -// @Accept json -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesBody body models.UpdateEventRequestBody true "Series Body" -// @Success 201 {object} models.Series -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/series/ [patch] func (e *EventController) UpdateEvent(c *fiber.Ctx) error { - var eventBody models.UpdateEventRequestBody - if err := c.BodyParser(&eventBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + var body events.UpdateEventRequestBody + if err := c.BodyParser(&body); err != nil { + return err } - updatedEvent, err := e.eventService.UpdateEvent(c.Params("eventID"), eventBody) + event, err := e.eventService.UpdateEvent(c.Params("eventID"), body) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(updatedEvent) + return c.Status(http.StatusOK).JSON(event) } -// UpdateSeriesByID godoc -// -// @Summary Update a series by ID -// @Description Updates a series by ID. If individual events have been edited prior, -// -// this update will override the previous changes -// -// @ID update-series-by-id -// @Tags event -// @Accept json -// @Produce json -// @Param seriesID path string true "Series ID" -// @Param seriesBody body models.UpdateSeriesRequestBody true "Series Body" -// @Success 200 {object} models.Series -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/series/{seriesID}/ [patch] -func (e *EventController) UpdateSeriesByID(c *fiber.Ctx) error { - var seriesBody models.UpdateSeriesRequestBody - if err := c.BodyParser(&seriesBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) - } - - updatedSeries, err := e.eventService.UpdateSeries(c.Params("seriesID"), seriesBody) - if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusOK).JSON(updatedSeries) -} - -// UpdateSeriesByEventID godoc -// -// @Summary Update a series by event ID -// @Description Updates a series by event ID -// @ID update-series-by-event-id -// @Tags event -// @Accept json -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesBody body models.UpdateSeriesRequestBody true "Series Body" -// @Success 200 {object} models.Series -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/series/{seriesID}/ [patch] -func (e *EventController) UpdateSeriesByEventID(c *fiber.Ctx) error { - var seriesBody models.UpdateSeriesRequestBody - if err := c.BodyParser(&seriesBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) - } - - updatedSeries, err := e.eventService.UpdateSeriesByEventID(c.Params("eventID"), seriesBody) - if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusOK).JSON(updatedSeries) -} - -// DeleteSeriesByID godoc -// -// @Summary Delete a series by ID -// @Description Deletes a series by ID -// @ID delete-series-by-id -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesID path string true "Series ID" -// @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/series/{seriesID}/ [delete] -func (e *EventController) DeleteSeriesByID(c *fiber.Ctx) error { - if err := e.eventService.DeleteSeriesByID(c.Params("seriesID")); err != nil { - return err.FiberError(c) - } - - return c.SendStatus(fiber.StatusNoContent) -} - -// DeleteSeriesByEventID godoc -// -// @Summary Delete all series by event -// @Description Deletes all series associated with an event -// @ID delete-series-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/series/ [delete] -func (e *EventController) DeleteSeriesByEventID(c *fiber.Ctx) error { - if err := e.eventService.DeleteSeriesByEventID(c.Params("eventID")); err != nil { - return err.FiberError(c) - } - - return c.SendStatus(fiber.StatusNoContent) -} - -// DeleteEvent godoc -// -// @Summary Delete an event -// @Description Deletes an event -// @ID delete-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/ [delete] func (e *EventController) DeleteEvent(c *fiber.Ctx) error { - if err := e.eventService.DeleteEvent(c.Params("eventID")); err != nil { - return err.FiberError(c) - } - - return c.SendStatus(fiber.StatusNoContent) -} - -// GetHostsByEventID godoc -// -// @Summary Retrieve all hosts by event -// @Description Retrieves all hosts associated with an event -// @ID get-hosts-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 200 {object} []models.Club -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/hosts [get] -func (e *EventController) GetHostsByEventID(c *fiber.Ctx) error { - hosts, err := e.eventService.GetHostsByEventID(c.Params("eventID")) - if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusOK).JSON(hosts) -} - -// GetTagsByEventID godoc -// -// @Summary Retrieve all tags by event -// @Description Retrieves all tags associated with an event -// @ID get-tags-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 200 {object} []models.Tag -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /events/{eventID}/tags [get] -func (e *EventController) GetTagsByEventID(c *fiber.Ctx) error { - tags, err := e.eventService.GetTagsByEventID(c.Params("eventID")) + err := e.eventService.DeleteEvent(c.Params("eventID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(tags) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/events/base/routes.go b/backend/entities/events/base/routes.go index a755ede52..c0be2cb84 100644 --- a/backend/entities/events/base/routes.go +++ b/backend/entities/events/base/routes.go @@ -1,38 +1,40 @@ package base import ( + "github.com/GenerateNU/sac/backend/entities/events/series" + "github.com/GenerateNU/sac/backend/entities/events/tags" + "github.com/gofiber/fiber/v2" + + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) -func Event(eventParams types.RouteParams) { +func EventRoutes(eventParams types.RouteParams) { + eventParams.Router = EventRouter(eventParams) + + series.EventSeries(eventParams) + tags.EventTags(eventParams) +} + +func EventRouter(eventParams types.RouteParams) fiber.Router { eventController := NewEventController(NewEventService(eventParams.ServiceParams)) // api/v1/events/* events := eventParams.Router.Group("/events") - events.Get("/", eventController.GetAllEvents) - events.Post("/", eventParams.AuthMiddleware.ClubAuthorizeById, eventController.CreateEvent) + events.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetAllEvents) + events.Post( + "/", + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), + eventController.CreateEvent, + ) // api/v1/events/:eventID/* eventID := events.Group("/:eventID") eventID.Get("/", eventController.GetEvent) - eventID.Get("/series", eventController.GetSeriesByEventID) eventID.Patch("/", eventController.UpdateEvent) - eventID.Patch("/series", eventController.UpdateSeriesByEventID) eventID.Delete("/", eventController.DeleteEvent) - eventID.Delete("/series", eventController.DeleteSeriesByEventID) - - eventID.Get("/hosts", eventController.GetHostsByEventID) - eventID.Get("/tags", eventController.GetTagsByEventID) - - // api/v1/events/series/* - series := events.Group("/series") - - // api/v1/events/series/:seriesID/* - seriesID := series.Group("/:seriesID") - seriesID.Get("/", eventController.GetSeriesByID) - seriesID.Patch("/", eventParams.AuthMiddleware.ClubAuthorizeById, eventController.UpdateSeriesByID) - seriesID.Delete("/", eventParams.AuthMiddleware.ClubAuthorizeById, eventController.DeleteSeriesByID) + return events } diff --git a/backend/entities/events/base/service.go b/backend/entities/events/base/service.go index 5062454ab..0f7c9fa1e 100644 --- a/backend/entities/events/base/service.go +++ b/backend/entities/events/base/service.go @@ -1,26 +1,22 @@ package base import ( + "github.com/GenerateNU/sac/backend/entities/events" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" ) type EventServiceInterface interface { - GetEvents(limit string, page string) ([]models.Event, *errors.Error) - GetEvent(eventID string) ([]models.Event, *errors.Error) - GetSeriesByEventID(eventID string) ([]models.Event, *errors.Error) - GetSeriesByID(seriesID string) ([]models.Event, *errors.Error) - CreateEvent(eventBodies models.CreateEventRequestBody) ([]models.Event, *errors.Error) - UpdateEvent(eventID string, eventBody models.UpdateEventRequestBody) ([]models.Event, *errors.Error) - UpdateSeries(seriesID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, *errors.Error) - UpdateSeriesByEventID(eventID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, *errors.Error) - DeleteEvent(eventID string) *errors.Error - DeleteSeriesByEventID(seriesID string) *errors.Error - DeleteSeriesByID(seriesID string) *errors.Error - GetHostsByEventID(eventID string) ([]models.Club, *errors.Error) - GetTagsByEventID(eventID string) ([]models.Tag, *errors.Error) + // getters + GetEvents(pageInfo fiberpaginate.PageInfo) ([]models.Event, error) + GetEvent(eventID string) (*models.Event, error) + // event cud + CreateEvent(body events.CreateEventRequestBody) (*models.Event, error) + UpdateEvent(eventID string, eventBody events.UpdateEventRequestBody) ([]models.Event, error) + DeleteEvent(eventID string) error } type EventService struct { @@ -31,241 +27,50 @@ func NewEventService(serviceParams types.ServiceParams) EventServiceInterface { return &EventService{serviceParams} } -func (e *EventService) GetEvents(limit string, page string) ([]models.Event, *errors.Error) { - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetEvents(e.DB, *limitAsInt, *pageAsInt) -} - -// right now we are always returning a slice -func (e *EventService) CreateEvent(eventBody models.CreateEventRequestBody) ([]models.Event, *errors.Error) { - if err := e.Validate.Struct(eventBody); err != nil { - return nil, &errors.FailedToValidateEvent - } - - event := &models.Event{ - Name: eventBody.Name, - Preview: eventBody.Preview, - Content: eventBody.Content, - StartTime: eventBody.StartTime, - EndTime: eventBody.EndTime, - Location: eventBody.Location, - EventType: eventBody.EventType, - IsRecurring: *eventBody.IsRecurring, - - Host: eventBody.Host, - Clubs: eventBody.Clubs, - Tag: eventBody.Tag, - Notification: eventBody.Notification, - } - - if !event.IsRecurring { - event, err := CreateEvent(e.DB, *event) - if err != nil { - return nil, &errors.FailedToCreateEvent - } - return event, err - } - - if err := e.Validate.Struct(eventBody.Series); err != nil { - return nil, &errors.FailedToValidateEventSeries - } - - series, err := utilities.MapRequestToModel(eventBody.Series, &models.Series{}) - if err != nil { - return nil, &errors.FailedToMapRequestToModel - } - - // Create other events in series and update field in series (for join table) - events := createEventSlice(event, *series) - series.Events = events - - return CreateEventSeries(e.DB, *series) +func (e *EventService) GetEvents(pageInfo fiberpaginate.PageInfo) ([]models.Event, error) { + return GetEvents(e.DB, pageInfo) } -func (e *EventService) GetEvent(eventID string) ([]models.Event, *errors.Error) { +func (e *EventService) GetEvent(eventID string) (*models.Event, error) { idAsUUID, err := utilities.ValidateID(eventID) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } - return GetEvent(e.DB, *idAsUUID) + return events.GetEvent(e.DB, *idAsUUID) } -func (e *EventService) GetSeriesByEventID(eventID string) ([]models.Event, *errors.Error) { - idAsUUID, err := utilities.ValidateID(eventID) - if err != nil { - return nil, &errors.FailedToValidateID +func (e *EventService) CreateEvent(body events.CreateEventRequestBody) (*models.Event, error) { + if err := utilities.Validate(e.Validate, body); err != nil { + return nil, err } - return GetSeriesByEventID(e.DB, *idAsUUID) + return CreateEvent(e.DB, *body.Into()) } -func (e *EventService) GetSeriesByID(seriesID string) ([]models.Event, *errors.Error) { - idAsUUID, err := utilities.ValidateID(seriesID) - if err != nil { - return nil, &errors.FailedToValidateID - } - - return GetSeriesByID(e.DB, *idAsUUID) -} - -func (e *EventService) UpdateEvent(id string, eventBody models.UpdateEventRequestBody) ([]models.Event, *errors.Error) { - idAsUUID, idErr := utilities.ValidateID(id) - if idErr != nil { - return nil, idErr - } - - if utilities.AtLeastOne(eventBody, models.UpdateEventRequestBody{}) { - return nil, &errors.FailedToValidateTag - } - - if err := e.Validate.Struct(eventBody); err != nil { - return nil, &errors.FailedToValidateEvent - } - - updatedEvent := mapToEvent(eventBody) - - return UpdateEvent(e.DB, *idAsUUID, *updatedEvent) -} - -func (e *EventService) UpdateSeries(seriesID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, *errors.Error) { - seriesIDAsUUID, idErr := utilities.ValidateID(seriesID) - if idErr != nil { - return nil, idErr - } - - if err := e.Validate.Struct(seriesBody); err != nil { - return nil, &errors.FailedToValidateEventSeries - } - - series, err := utilities.MapRequestToModel(seriesBody, &models.Series{}) - if err != nil { - return nil, &errors.FailedToMapRequestToModel - } - - updatedEventBody := mapToEvent(seriesBody.EventDetails) - - newEvents := createEventSlice(updatedEventBody, *series) - series.Events = newEvents - - return UpdateSeries(e.DB, *seriesIDAsUUID, *series) -} - -func (e *EventService) UpdateSeriesByEventID(eventID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, *errors.Error) { - eventIDAsUUID, idErr := utilities.ValidateID(eventID) - if idErr != nil { - return nil, idErr - } - - if err := e.Validate.Struct(seriesBody); err != nil { - return nil, &errors.FailedToValidateEventSeries - } - - series, err := utilities.MapRequestToModel(seriesBody, &models.Series{}) - if err != nil { - return nil, &errors.FailedToMapRequestToModel - } - - updatedEventBody := mapToEvent(seriesBody.EventDetails) - - newEvents := createEventSlice(updatedEventBody, *series) - series.Events = newEvents - - return UpdateSeriesByEventID(e.DB, *eventIDAsUUID, *series) -} - -func (e *EventService) DeleteEvent(eventID string) *errors.Error { - idAsUUID, err := utilities.ValidateID(eventID) - if err != nil { - return &errors.FailedToValidateID - } - - return DeleteEvent(e.DB, *idAsUUID) -} - -func (e *EventService) DeleteSeriesByEventID(eventID string) *errors.Error { +func (e *EventService) UpdateEvent(eventID string, eventBody events.UpdateEventRequestBody) ([]models.Event, error) { idAsUUID, err := utilities.ValidateID(eventID) if err != nil { - return &errors.FailedToValidateID + return nil, err } - return DeleteSeriesByEventID(e.DB, *idAsUUID) -} - -func (e *EventService) DeleteSeriesByID(seriesID string) *errors.Error { - idAsUUID, err := utilities.ValidateID(seriesID) - if err != nil { - return &errors.FailedToValidateID + if err := utilities.Validate(e.Validate, eventBody); err != nil { + return nil, err } - return DeleteSeriesByID(e.DB, *idAsUUID) -} - -func (e *EventService) GetHostsByEventID(eventID string) ([]models.Club, *errors.Error) { - idAsUUID, err := utilities.ValidateID(eventID) + event, err := utilities.MapJsonTags(eventBody, &models.Event{}) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } - return GetHostsByEventID(e.DB, *idAsUUID) + return UpdateEvent(e.DB, *idAsUUID, *event, *eventBody.UpdateAllInSeries) } -func (e *EventService) GetTagsByEventID(eventID string) ([]models.Tag, *errors.Error) { +func (e *EventService) DeleteEvent(eventID string) error { idAsUUID, err := utilities.ValidateID(eventID) if err != nil { - return nil, &errors.FailedToValidateID + return err } - return GetTagsByEventID(e.DB, *idAsUUID) -} - -func createEventSlice(firstEvent *models.Event, series models.Series) []models.Event { - eventBodies := []models.Event{*firstEvent} - months, days := 0, 0 - - switch series.RecurringType { - case "daily": - days = 1 - case "weekly": - days = 7 - case "monthly": - months = 1 - } - - for i := 1; i < series.MaxOccurrences; i++ { - eventToAdd := *firstEvent - eventToAdd.StartTime = eventToAdd.StartTime.AddDate(0, i*months, i*days) - eventToAdd.EndTime = eventToAdd.EndTime.AddDate(0, i*months, i*days) - eventBodies = append(eventBodies, eventToAdd) - } - - return eventBodies -} - -func mapToEvent(eventBody models.UpdateEventRequestBody) *models.Event { - return &models.Event{ - Name: eventBody.Name, - Preview: eventBody.Preview, - Content: eventBody.Content, - StartTime: eventBody.StartTime, - EndTime: eventBody.EndTime, - Location: eventBody.Location, - EventType: eventBody.EventType, - - Host: eventBody.Host, - RSVP: eventBody.RSVP, - Waitlist: eventBody.Waitlist, - Clubs: eventBody.Clubs, - Tag: eventBody.Tag, - Notification: eventBody.Notification, - } + return DeleteEvent(e.DB, *idAsUUID) } diff --git a/backend/entities/events/base/transactions.go b/backend/entities/events/base/transactions.go index f66f790a4..566d0c262 100644 --- a/backend/entities/events/base/transactions.go +++ b/backend/entities/events/base/transactions.go @@ -1,248 +1,86 @@ package base import ( - stdliberrors "errors" + "errors" + "log/slog" - "github.com/GenerateNU/sac/backend/entities/clubs" + "github.com/GenerateNU/sac/backend/entities/events" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/GenerateNU/sac/backend/transactions" + "github.com/garrettladley/fiberpaginate" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) -func GetEvents(db *gorm.DB, limit int, page int) ([]models.Event, *errors.Error) { +func GetEvents(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.Event, error) { var events []models.Event - - offset := (page - 1) * limit - - if db.Limit(limit).Offset(offset).Find(&events).Error != nil { - return nil, &errors.FailedToGetEvents + if err := db.Scopes(utilities.IntoScope(pageInfo, db)).Find(&events).Error; err != nil { + return nil, err } return events, nil } -func GetEvent(db *gorm.DB, eventID uuid.UUID, preloads ...transactions.OptionalQuery) ([]models.Event, *errors.Error) { - var event models.Event - - query := db - - for _, preload := range preloads { - query = preload(query) - } - - if err := query.First(&event, eventID).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.EventNotFound - } else { - return nil, &errors.FailedToGetEvent - } - } - - return []models.Event{event}, nil -} - -func GetSeriesID(db *gorm.DB, eventID uuid.UUID) (*uuid.UUID, *errors.Error) { - var event models.Event - - if err := db.First(&event, eventID).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.EventNotFound - } else { - return nil, &errors.FailedToGetEvent - } - } - - var seriesID string - - if err := db.Model(&models.EventSeries{}).Where("event_id = ?", event.ID).Select("series_id").Find(&seriesID).Error; err != nil { - return nil, &errors.FailedToGetEventSeries - } - - parsedSeriesID, err := uuid.Parse(seriesID) - if err != nil { - return nil, &errors.FailedToGetEventSeries - } - - return &parsedSeriesID, nil -} - -func GetSeriesByEventID(db *gorm.DB, id uuid.UUID) ([]models.Event, *errors.Error) { - seriesID, err := GetSeriesID(db, id) - if err != nil { +func CreateEvent(db *gorm.DB, event models.Event) (*models.Event, error) { + if err := db.Create(&event).Error; err != nil { return nil, err } - events, err := GetSeriesByID(db, *seriesID) - if err != nil { - return nil, &errors.FailedToGetEventSeries - } - return events, nil -} - -func GetSeriesByID(db *gorm.DB, id uuid.UUID) ([]models.Event, *errors.Error) { - var series models.Series - - if err := db.Preload("Events").Find(&series, id).Error; err != nil { - return nil, &errors.FailedToGetEventSeries - } - - return series.Events, nil -} - -func CreateEvent(db *gorm.DB, event models.Event) ([]models.Event, *errors.Error) { - tx := db.Begin() - - if err := tx.Create(&event).Error; err != nil { - tx.Rollback() - return nil, &errors.FailedToCreateEvent - } - - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return nil, &errors.FailedToCreateEvent - } - return []models.Event{event}, nil + return &event, nil } -func CreateEventSeries(db *gorm.DB, series models.Series) ([]models.Event, *errors.Error) { - if err := db.Create(&series).Error; err != nil { - return nil, &errors.FailedToCreateEventSeries +func UpdateEvent(db *gorm.DB, id uuid.UUID, event models.Event, updateAllInSeries bool) ([]models.Event, error) { + if updateAllInSeries { + return updateEventSeries(db, id, event) + } else { + return updateEvent(db, id, event) } - - return series.Events, nil } -func UpdateEvent(db *gorm.DB, id uuid.UUID, event models.Event) ([]models.Event, *errors.Error) { - if err := db.Model(&models.Event{}).Where("id = ?", id).Updates(event).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.UserNotFound - } else { - return nil, &errors.FailedToUpdateEvent - } - } - - var existingEvent models.Event - - if err := db.First(&existingEvent, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.EventNotFound - } else { - return nil, &errors.FailedToCreateEvent +func updateEvent(db *gorm.DB, id uuid.UUID, event models.Event) ([]models.Event, error) { + var resultingEvent models.Event + if result := db.Model(&resultingEvent).Clauses(clause.Returning{}).Where("id = ?", id).Updates(&event); result.RowsAffected == 0 { + if result.Error == nil { + return nil, utilities.ErrNotFound } + return nil, result.Error } - if err := db.Model(&existingEvent).Updates(&event).Error; err != nil { - return nil, &errors.FailedToUpdateUser - } - - return []models.Event{existingEvent}, nil + return []models.Event{resultingEvent}, nil } -func UpdateSeries(db *gorm.DB, seriesID uuid.UUID, series models.Series) ([]models.Event, *errors.Error) { - err := DeleteSeriesByID(db, seriesID) - if err != nil { - return nil, err - } - - series.ID = seriesID - - events, err := CreateEventSeries(db, series) +func updateEventSeries(db *gorm.DB, id uuid.UUID, event models.Event) ([]models.Event, error) { + targetEvent, err := events.GetEvent(db, id) if err != nil { return nil, err } - return events, nil -} -func UpdateSeriesByEventID(db *gorm.DB, eventID uuid.UUID, series models.Series) ([]models.Event, *errors.Error) { - seriesID, err := GetSeriesID(db, eventID) - if err != nil { - return nil, err + if targetEvent.SeriesID == nil { + slog.Error("event is not part of a series", "eventID", id) + return nil, utilities.BadRequest(errors.New("event is not part of a series")) } - events, err := UpdateSeries(db, *seriesID, series) - if err != nil { - return nil, err + var resultingEvents []models.Event + if result := db.Model(&resultingEvents).Clauses(clause.Returning{}).Where("series_id = ?", targetEvent.SeriesID).Updates(&event); result.RowsAffected == 0 { + if result.Error == nil { + return nil, utilities.ErrNotFound + } + return nil, result.Error } - return events, nil + return resultingEvents, nil } -func DeleteEvent(db *gorm.DB, id uuid.UUID) *errors.Error { +func DeleteEvent(db *gorm.DB, id uuid.UUID) error { if result := db.Delete(&models.Event{}, id); result.RowsAffected == 0 { if result.Error == nil { - return &errors.EventNotFound - } else { - return &errors.FailedToDeleteEvent + return utilities.ErrNotFound } + return result.Error } return nil } - -func DeleteSeriesByEventID(db *gorm.DB, eventID uuid.UUID) *errors.Error { - seriesID, err := GetSeriesID(db, eventID) - if err != nil { - return err - } - - if err := DeleteSeriesByID(db, *seriesID); err != nil { - return err - } - - return nil -} - -func DeleteSeriesByID(db *gorm.DB, seriesID uuid.UUID) *errors.Error { - tx := db.Begin() - - var eventIDs uuid.UUIDs - - if err := tx.Model(&models.EventSeries{}).Select("event_id").Where("series_id = (?)", seriesID).Find(&eventIDs).Error; err != nil { - tx.Rollback() - return &errors.FailedToDeleteSeries - } else if len(eventIDs) < 1 { - tx.Rollback() - return &errors.SeriesNotFound - } - - if result := tx.Delete(&models.Event{}, eventIDs); result.RowsAffected == 0 { - tx.Rollback() - return &errors.FailedToDeleteSeries - } - - if result := tx.Delete(&models.Series{}, seriesID); result.RowsAffected == 0 { - tx.Rollback() - return &errors.FailedToDeleteSeries - } - - tx.Commit() - - return nil -} - -func GetHostsByEventID(db *gorm.DB, eventID uuid.UUID) ([]models.Club, *errors.Error) { - // Get the club that hosts the event - event, err := GetEvent(db, eventID) - if err != nil { - return nil, err - } - - clubs, err := clubs.GetClub(db, *event[0].Host, transactions.PreloadEvent()) - if err != nil { - return nil, err - } - - return []models.Club{*clubs}, nil -} - -func GetTagsByEventID(db *gorm.DB, eventID uuid.UUID) ([]models.Tag, *errors.Error) { - event, err := GetEvent(db, eventID, transactions.PreloadTag()) - if err != nil { - return nil, err - } - - return event[0].Tag, nil -} diff --git a/backend/entities/events/models.go b/backend/entities/events/models.go new file mode 100644 index 000000000..f0f4c547e --- /dev/null +++ b/backend/entities/events/models.go @@ -0,0 +1,71 @@ +package events + +import ( + "time" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/google/uuid" +) + +type CreateEventRequestBody struct { + // details + Name string `json:"name" validate:"required,max=255"` + Preview string `json:"preview" validate:"required,max=255"` + Description string `json:"description" validate:"required,max=255"` + HostID uuid.UUID `json:"host" validate:"uuid4"` + + // geoshi + EventType models.EventType `json:"event_type" validate:"required,max=255,oneof=hybrid in_person virtual"` + Location string `json:"location" validate:"max=255,required_if=EventType in_person,required_if=EventType hybrid"` + Link string `json:"link" validate:"http_url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + + // internal housekeeping states + IsPublic *bool `json:"is_public" validate:"required"` + IsDraft *bool `json:"is_draft" validate:"required"` + IsArchived *bool `json:"is_archived" validate:"required"` + + // timing + StartTime time.Time `json:"start_time" validate:"required,ltefield=EndTime"` + EndTime time.Time `json:"end_time" validate:"required,gtefield=StartTime"` +} + +func (c *CreateEventRequestBody) Into() *models.Event { + return &models.Event{ + Name: c.Name, + Preview: c.Preview, + Description: c.Description, + Host: &c.HostID, + EventType: c.EventType, + Location: c.Location, + Link: c.Link, + IsPublic: *c.IsPublic, + IsDraft: *c.IsDraft, + IsArchived: *c.IsArchived, + StartTime: c.StartTime, + EndTime: c.EndTime, + } +} + +type UpdateEventRequestBody struct { + // details + Name string `json:"name" validate:"omitempty,max=255"` + Preview string `json:"preview" validate:"omitempty,max=255"` + Description string `json:"description" validate:"omitempty,max=255"` + HostID *uuid.UUID `json:"host" validate:"omitempty,uuid4"` + + // geoshi + EventType models.EventType `json:"event_type" validate:"omitempty,max=255,oneof=hybrid in_person virtual"` + Location string `json:"location" validate:"omitempty,max=255,required_if=EventType in_person,required_if=EventType hybrid"` + Link string `json:"link" validate:"omitempty,url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + + // internal housekeeping states + IsPublic bool `json:"is_public" validate:"omitempty"` + IsDraft bool `json:"is_draft" validate:"omitempty"` + IsArchived bool `json:"is_archived" validate:"omitempty"` + + // timing + StartTime time.Time `json:"start_time" validate:"omitempty,ltecsfield=EndTime"` + EndTime time.Time `json:"end_time" validate:"omitempty,gtecsfield=StartTime"` + + UpdateAllInSeries *bool `json:"update_all_in_series" validate:"required"` +} diff --git a/backend/entities/events/series/controller.go b/backend/entities/events/series/controller.go new file mode 100644 index 000000000..470a6b4c0 --- /dev/null +++ b/backend/entities/events/series/controller.go @@ -0,0 +1,47 @@ +package series + +import ( + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +type EventSeriesController struct { + eventSeriesService EventSeriesServiceInterface +} + +func NewEventSeriesController(eventSeriesService EventSeriesServiceInterface) *EventSeriesController { + return &EventSeriesController{eventSeriesService: eventSeriesService} +} + +func (e *EventSeriesController) CreateEventSeries(c *fiber.Ctx) error { + var body CreateEventSeriesRequestBody + if err := c.BodyParser(&body); err != nil { + return utilities.InvalidJSON() + } + + events, err := e.eventSeriesService.CreateEventSeries(body) + if err != nil { + return err + } + + return c.Status(http.StatusCreated).JSON(events) +} + +func (e *EventSeriesController) GetEventSeries(c *fiber.Ctx) error { + events, err := e.eventSeriesService.GetEventSeries(c.Params("seriesID")) + if err != nil { + return err + } + + return c.Status(http.StatusOK).JSON(events) +} + +func (e *EventSeriesController) DeleteEventSeries(c *fiber.Ctx) error { + if err := e.eventSeriesService.DeleteEventSeries(c.Params("seriesID")); err != nil { + return err + } + + return c.SendStatus(http.StatusNoContent) +} diff --git a/backend/entities/events/series/models.go b/backend/entities/events/series/models.go new file mode 100644 index 000000000..6d98cb4c4 --- /dev/null +++ b/backend/entities/events/series/models.go @@ -0,0 +1,50 @@ +package series + +import ( + "fmt" + "time" + + "github.com/GenerateNU/sac/backend/entities/events" + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/protos" + "github.com/GenerateNU/sac/backend/utilities" +) + +type CreateEventSeriesRequestBody struct { + events.CreateEventRequestBody + Recurrence protos.StringRecurrence `json:"recurrence" validate:"required"` + Termination time.Time `json:"termination" validate:"required"` +} + +func (c *CreateEventSeriesRequestBody) Validate() (*ValidatedCreateEventSeriesRequestBody, error) { + errors := make(map[string]string) + recurrence, err := protos.RecurrenceFrom(c.Recurrence) + if err != nil { + errors["Recurrence"] = fmt.Sprintf("%s failed %s", "Recurrence", "StringRecurrenceProto") + } + + if len(errors) > 0 { + return nil, utilities.InvalidRequestData(errors) + } + + return &ValidatedCreateEventSeriesRequestBody{ + CreateEventRequestBody: c.CreateEventRequestBody, + Recurrence: *recurrence, + Termination: c.Termination, + }, nil +} + +type ValidatedCreateEventSeriesRequestBody struct { + events.CreateEventRequestBody + Recurrence protos.Recurrence `json:"recurrence"` + Termination time.Time `json:"termination"` +} + +func (v *ValidatedCreateEventSeriesRequestBody) Into() *models.Event { + return v.CreateEventRequestBody.Into() +} + +type Series struct { + models.Model + Events []models.Event `gorm:"foreignKey:SeriesID" json:"events"` +} diff --git a/backend/entities/events/series/routes.go b/backend/entities/events/series/routes.go new file mode 100644 index 000000000..b4310c2da --- /dev/null +++ b/backend/entities/events/series/routes.go @@ -0,0 +1,32 @@ +package series + +import ( + "github.com/GenerateNU/sac/backend/extractors" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + "github.com/GenerateNU/sac/backend/types" +) + +func EventSeries(eventParams types.RouteParams) { + eventSeriesController := NewEventSeriesController(NewEventSeriesService(eventParams.ServiceParams)) + + // api/v1/events/series/* + eventSeries := eventParams.Router.Group("/series") + + eventSeries.Post( + "/", + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromBody("host")), + eventSeriesController.CreateEventSeries, + ) + + eventSeriedID := eventSeries.Group("/:seriesID") + + eventSeriedID.Get("/", eventSeriesController.GetEventSeries) + eventSeriedID.Delete( + "/", + authMiddleware.AttachExtractor( + eventParams.AuthMiddleware.ClubAuthorizeById, + authMiddleware.FromExtractFromParamIntoQuery("seriesID", eventParams.ServiceParams.DB, extractors.GetSeriesHost), + ), + eventSeriesController.DeleteEventSeries, + ) +} diff --git a/backend/entities/events/series/service.go b/backend/entities/events/series/service.go new file mode 100644 index 000000000..d8886a31d --- /dev/null +++ b/backend/entities/events/series/service.go @@ -0,0 +1,78 @@ +package series + +import ( + "fmt" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/google/uuid" +) + +type EventSeriesServiceInterface interface { + CreateEventSeries(body CreateEventSeriesRequestBody) (*Series, error) + GetEventSeries(seriesID string) ([]models.Event, error) + DeleteEventSeries(seriesID string) error +} + +type EventSeriesService struct { + types.ServiceParams +} + +func NewEventSeriesService(serviceParams types.ServiceParams) EventSeriesServiceInterface { + return &EventSeriesService{serviceParams} +} + +func (e *EventSeriesService) CreateEventSeries(body CreateEventSeriesRequestBody) (*Series, error) { + if err := utilities.Validate(e.Validate, body); err != nil { + return nil, err + } + + validatedBody, err := body.Validate() + if err != nil { + return nil, err + } + + if validatedBody.Termination.After(e.Calendar.MaxTerminationDate) { + return nil, utilities.BadRequest(fmt.Errorf("termination date is after max termination date. termination: %s, max termination: %s", validatedBody.Termination, e.Calendar.MaxTerminationDate)) + } + + rootEvent := validatedBody.Into() + + occurrences, err := validatedBody.Recurrence.ReccurUntil(rootEvent.StartTime, rootEvent.EndTime, validatedBody.Termination) + if err != nil { + return nil, utilities.BadRequest(fmt.Errorf("error creating recurring event series: %w", err)) + } + + events := make([]models.Event, len(occurrences)) + seriesID := uuid.New() + + for index, occurrence := range occurrences { + eventOccurence := *rootEvent + eventOccurence.ID = uuid.New() + eventOccurence.SeriesID = &seriesID + eventOccurence.StartTime = occurrence.Start + eventOccurence.EndTime = occurrence.End + events[index] = eventOccurence + } + + return CreateEventSeries(e.DB, seriesID, events) +} + +func (e *EventSeriesService) GetEventSeries(seriesID string) ([]models.Event, error) { + idAsUUID, err := utilities.ValidateID(seriesID) + if err != nil { + return nil, err + } + + return GetEventSeries(e.DB, *idAsUUID) +} + +func (e *EventSeriesService) DeleteEventSeries(seriesID string) error { + idAsUUID, err := utilities.ValidateID(seriesID) + if err != nil { + return err + } + + return DeleteEventSeries(e.DB, *idAsUUID) +} diff --git a/backend/entities/events/series/transactions.go b/backend/entities/events/series/transactions.go new file mode 100644 index 000000000..2c4b3c598 --- /dev/null +++ b/backend/entities/events/series/transactions.go @@ -0,0 +1,77 @@ +package series + +import ( + "errors" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func createSeries(db *gorm.DB, seriesID uuid.UUID) (*Series, error) { + series := &Series{ + Model: models.Model{ + ID: seriesID, + }, + } + + if err := db.Create(series).Error; err != nil { + return nil, err + } + + return series, nil +} + +func CreateEventSeries(db *gorm.DB, seriesID uuid.UUID, events []models.Event) (*Series, error) { + tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return nil, err + } + + series, err := createSeries(tx, seriesID) + if err != nil { + tx.Rollback() + return nil, err + } + + if err := tx.Create(&events).Error; err != nil { + tx.Rollback() + return nil, err + } + + series.Events = events + + return series, tx.Commit().Error +} + +func GetEventSeries(db *gorm.DB, seriesID uuid.UUID) ([]models.Event, error) { + var events []models.Event + + if err := db.Where("series_id = ?", seriesID).Find(&events).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + return events, nil +} + +func DeleteEventSeries(db *gorm.DB, seriesID uuid.UUID) error { + if err := db.Where("id = ?", seriesID).Delete(&Series{}).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return utilities.ErrNotFound + } + + return err + } + + return nil +} diff --git a/backend/entities/events/tags/controller.go b/backend/entities/events/tags/controller.go new file mode 100644 index 000000000..347ab6241 --- /dev/null +++ b/backend/entities/events/tags/controller.go @@ -0,0 +1,48 @@ +package tags + +import ( + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +type EventTagController struct { + eventTagService EventTagServiceInterface +} + +func NewEventTagController(eventTagService EventTagServiceInterface) *EventTagController { + return &EventTagController{eventTagService: eventTagService} +} + +func (e *EventTagController) CreateEventTags(c *fiber.Ctx) error { + var eventTagsBody CreateEventTagsRequestBody + if err := c.BodyParser(&eventTagsBody); err != nil { + return utilities.InvalidJSON() + } + + eventTags, err := e.eventTagService.CreateEventTags(c.Params("eventID"), eventTagsBody) + if err != nil { + return err + } + + return c.Status(http.StatusCreated).JSON(eventTags) +} + +func (e *EventTagController) GetEventTags(c *fiber.Ctx) error { + tags, err := e.eventTagService.GetEventTags(c.Params("eventID")) + if err != nil { + return err + } + + return c.Status(http.StatusCreated).JSON(tags) +} + +func (e *EventTagController) DeleteEventTag(c *fiber.Ctx) error { + err := e.eventTagService.DeleteEventTag(c.Params("eventID"), c.Params("tagID")) + if err != nil { + return err + } + + return c.SendStatus(http.StatusNoContent) +} diff --git a/backend/entities/events/tags/models.go b/backend/entities/events/tags/models.go new file mode 100644 index 000000000..6619f1fc2 --- /dev/null +++ b/backend/entities/events/tags/models.go @@ -0,0 +1,7 @@ +package tags + +import "github.com/google/uuid" + +type CreateEventTagsRequestBody struct { + Tags []uuid.UUID `json:"tags" validate:"required"` +} diff --git a/backend/entities/events/tags/routes.go b/backend/entities/events/tags/routes.go new file mode 100644 index 000000000..7ba3bb9c4 --- /dev/null +++ b/backend/entities/events/tags/routes.go @@ -0,0 +1,24 @@ +package tags + +import ( + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + "github.com/GenerateNU/sac/backend/types" +) + +func EventTags(eventParams types.RouteParams) { + eventTagController := NewEventTagController(NewEventTagService(eventParams.ServiceParams)) + + eventTags := eventParams.Router.Group("/:eventID/tags") + + eventTags.Get("/", eventTagController.GetEventTags) + eventTags.Post( + "/", + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, authMiddleware.ExtractFromParams("eventID")), + eventTagController.CreateEventTags, + ) + eventTags.Delete( + "/:tagID", + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, authMiddleware.ExtractFromParams("eventID")), + eventTagController.DeleteEventTag, + ) +} diff --git a/backend/entities/events/tags/service.go b/backend/entities/events/tags/service.go new file mode 100644 index 000000000..b2287fb73 --- /dev/null +++ b/backend/entities/events/tags/service.go @@ -0,0 +1,63 @@ +package tags + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/entities/tags" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" +) + +type EventTagServiceInterface interface { + CreateEventTags(id string, clubTagsBody CreateEventTagsRequestBody) ([]models.Tag, error) + GetEventTags(id string) ([]models.Tag, error) + DeleteEventTag(id string, tagId string) error +} + +type EventTagService struct { + types.ServiceParams +} + +func NewEventTagService(serviceParams types.ServiceParams) EventTagServiceInterface { + return &EventTagService{serviceParams} +} + +func (e *EventTagService) CreateEventTags(id string, eventTagsBody CreateEventTagsRequestBody) ([]models.Tag, error) { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return nil, err + } + + if err := utilities.Validate(e.Validate, eventTagsBody); err != nil { + return nil, err + } + + tags, err := tags.GetTagsByIDs(e.DB, eventTagsBody.Tags) + if err != nil { + return nil, err + } + + return CreateEventTags(e.DB, *idAsUUID, tags) +} + +func (e *EventTagService) GetEventTags(id string) ([]models.Tag, error) { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return nil, err + } + + return GetEventTags(e.DB, *idAsUUID) +} + +func (e *EventTagService) DeleteEventTag(id string, tagId string) error { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return err + } + + tagIdAsUUID, err := utilities.ValidateID(tagId) + if err != nil { + return err + } + + return DeleteEventTag(e.DB, *idAsUUID, *tagIdAsUUID) +} diff --git a/backend/entities/events/tags/transactions.go b/backend/entities/events/tags/transactions.go new file mode 100644 index 000000000..a7815b074 --- /dev/null +++ b/backend/entities/events/tags/transactions.go @@ -0,0 +1,56 @@ +package tags + +import ( + "github.com/GenerateNU/sac/backend/entities/events" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/entities/tags" + "github.com/GenerateNU/sac/backend/transactions" + "github.com/google/uuid" + + "gorm.io/gorm" +) + +func CreateEventTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, error) { + event, err := events.GetEvent(db, id, transactions.PreloadTag()) + if err != nil { + return nil, err + } + + if err := db.Model(&event).Association("Tag").Append(tags); err != nil { + return nil, err + } + + return tags, nil +} + +func GetEventTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, error) { + var tags []models.Tag + + event, err := events.GetEvent(db, id, transactions.PreloadTag()) + if err != nil { + return nil, err + } + + if err := db.Model(&event).Association("Tag").Find(&tags); err != nil { + return nil, err + } + return tags, nil +} + +func DeleteEventTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) error { + event, err := events.GetEvent(db, id, transactions.PreloadTag()) + if err != nil { + return err + } + + tag, err := tags.GetTag(db, tagID) + if err != nil { + return err + } + + if err := db.Model(&event).Association("Tag").Delete(&tag); err != nil { + return err + } + return nil +} diff --git a/backend/entities/events/transactions.go b/backend/entities/events/transactions.go new file mode 100644 index 000000000..1a4b3ca7a --- /dev/null +++ b/backend/entities/events/transactions.go @@ -0,0 +1,51 @@ +package events + +import ( + "errors" + + "github.com/GenerateNU/sac/backend/entities/clubs" + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/transactions" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func GetEvent(db *gorm.DB, eventID uuid.UUID, preloads ...transactions.OptionalQuery) (*models.Event, error) { + var event models.Event + + query := db + + for _, preload := range preloads { + query = preload(query) + } + if err := query.First(&event, eventID).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + return &event, nil +} + +func GetEventHostAdminIDs(db *gorm.DB, eventID uuid.UUID) ([]uuid.UUID, error) { + event, err := GetEvent(db, eventID) + if err != nil { + return nil, err + } + + return clubs.GetAdminIDs(db, *event.Host) +} + +func GetFirstEventInSeries(db *gorm.DB, seriesID uuid.UUID) (*models.Event, error) { + var event models.Event + if err := db.Where("series_id = ?", seriesID).First(&event).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + return &event, nil +} diff --git a/backend/entities/files/base/controller.go b/backend/entities/files/base/controller.go index 029803d53..de0efaed3 100644 --- a/backend/entities/files/base/controller.go +++ b/backend/entities/files/base/controller.go @@ -1,9 +1,10 @@ package base import ( - "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -25,15 +26,20 @@ func NewFileController(fileService FileServiceInterface) *FileController { // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.File -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /files/ [get] func (f *FileController) GetFiles(c *fiber.Ctx) error { - files, err := f.fileService.GetFiles(c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + files, err := f.fileService.GetFiles(*pagination) if err != nil { - return err.FiberError(c) + return err } return c.JSON(files) @@ -48,17 +54,17 @@ func (f *FileController) GetFiles(c *fiber.Ctx) error { // @Produce json // @Param fileID path string true "File ID" // @Success 200 {object} models.File -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /files/:fileID [get] func (f *FileController) GetFile(c *fiber.Ctx) error { fileID := c.Params("fileID") file, err := f.fileService.GetFile(fileID) if err != nil { - return err.FiberError(c) + return err } return c.JSON(file) @@ -72,31 +78,31 @@ func (f *FileController) GetFile(c *fiber.Ctx) error { // @Tags file // @Accept multipart/form-data // @Produce json -// @Param file body models.CreateFileRequestBody true "File" +// @Param file body CreateFileRequestBody true "File" // @Success 201 {object} models.File -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /files/ [post] func (f *FileController) CreateFile(c *fiber.Ctx) error { - var fileBody models.CreateFileRequestBody + var fileBody CreateFileRequestBody - if parseErr := c.BodyParser(&fileBody); parseErr != nil { - return errors.FailedToParseRequestBody.FiberError(c) + if err := c.BodyParser(&fileBody); err != nil { + return utilities.InvalidJSON() } - formFile, parseErr := c.FormFile("file") - if parseErr != nil { - return errors.FailedToParseRequestBody.FiberError(c) + formFile, err := c.FormFile("file") + if err != nil { + return err } file, err := f.fileService.CreateFile(&fileBody, formFile) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(file) + return c.Status(http.StatusCreated).JSON(file) } // DeleteFile godoc @@ -108,18 +114,18 @@ func (f *FileController) CreateFile(c *fiber.Ctx) error { // @Produce json // @Param fileID path string true "File ID" // @Success 201 {object} models.File -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /files/:fileID [delete] func (f *FileController) DeleteFile(c *fiber.Ctx) error { fileID := c.Params("fileID") err := f.fileService.DeleteFile(fileID) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/files/base/models.go b/backend/entities/files/base/models.go new file mode 100644 index 000000000..120959250 --- /dev/null +++ b/backend/entities/files/base/models.go @@ -0,0 +1,8 @@ +package base + +import "github.com/google/uuid" + +type CreateFileRequestBody struct { + OwnerID uuid.UUID `json:"owner_id" validate:"required,uuid4"` + OwnerType string `json:"owner_type" validate:"required,max=255"` +} diff --git a/backend/entities/files/base/routes.go b/backend/entities/files/base/routes.go index 150382f65..c52205db5 100644 --- a/backend/entities/files/base/routes.go +++ b/backend/entities/files/base/routes.go @@ -8,7 +8,8 @@ func File(fileParams types.RouteParams) { fileController := NewFileController(NewFileService(fileParams.ServiceParams)) file := fileParams.Router.Group("/files") - file.Get("/", fileController.GetFiles) + + file.Get("/", fileParams.UtilityMiddleware.Paginator, fileController.GetFiles) file.Get("/:fileID", fileController.GetFile) file.Post("/", fileController.CreateFile) file.Delete("/:fileID", fileController.DeleteFile) diff --git a/backend/entities/files/base/service.go b/backend/entities/files/base/service.go index a92580d4a..b7969201d 100644 --- a/backend/entities/files/base/service.go +++ b/backend/entities/files/base/service.go @@ -4,17 +4,17 @@ import ( "mime/multipart" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/integrations/file" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" ) type FileServiceInterface interface { - GetFiles(limit string, page string) ([]models.File, *errors.Error) - GetFile(fileID string) (*models.File, *errors.Error) - CreateFile(fileBody *models.CreateFileRequestBody, formFile *multipart.FileHeader) (*models.File, *errors.Error) - DeleteFile(fileID string) *errors.Error + GetFiles(pageInfo fiberpaginate.PageInfo) ([]models.File, error) + GetFile(fileID string) (*models.File, error) + CreateFile(fileBody *CreateFileRequestBody, formFile *multipart.FileHeader) (*models.File, error) + DeleteFile(fileID string) error } type FileService struct { @@ -25,51 +25,41 @@ func NewFileService(serviceParams types.ServiceParams) FileServiceInterface { return &FileService{serviceParams} } -func (f *FileService) GetFiles(limit string, page string) ([]models.File, *errors.Error) { - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetFiles(f.DB, *limitAsInt, *pageAsInt) +func (f *FileService) GetFiles(pageInfo fiberpaginate.PageInfo) ([]models.File, error) { + return GetFiles(f.DB, pageInfo) } -func (f *FileService) GetFile(fileID string) (*models.File, *errors.Error) { +func (f *FileService) GetFile(fileID string) (*models.File, error) { idAsUUID, err := utilities.ValidateID(fileID) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return GetFile(f.DB, *idAsUUID) } -func (f *FileService) CreateFile(fileBody *models.CreateFileRequestBody, fileHeader *multipart.FileHeader) (*models.File, *errors.Error) { - if err := f.Validate.Struct(fileBody); err != nil { - return nil, &errors.FailedToValidateFile +func (f *FileService) CreateFile(fileBody *CreateFileRequestBody, fileHeader *multipart.FileHeader) (*models.File, error) { + if err := utilities.Validate(f.Validate, fileBody); err != nil { + return nil, err } fileInfo, err := f.Integrations.File.UploadFile(fileBody.OwnerType, fileHeader, []file.FileType{file.ALL}) if err != nil { - return nil, &errors.FailedToUploadFile + return nil, err } file, err := CreateFile(f.DB, fileBody.OwnerID, fileBody.OwnerType, *fileInfo) if err != nil { - return nil, &errors.FailedToCreateFile + return nil, err } return file, nil } -func (f *FileService) DeleteFile(fileID string) *errors.Error { +func (f *FileService) DeleteFile(fileID string) error { idAsUUID, err := utilities.ValidateID(fileID) if err != nil { - return &errors.FailedToValidateID + return err } return DeleteFile(f.DB, *idAsUUID) diff --git a/backend/entities/files/base/transactions.go b/backend/entities/files/base/transactions.go index 948a7d903..45310102c 100644 --- a/backend/entities/files/base/transactions.go +++ b/backend/entities/files/base/transactions.go @@ -1,15 +1,17 @@ package base import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/garrettladley/fiberpaginate" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" ) -func CreateFile(db *gorm.DB, ownerID uuid.UUID, ownerType string, fileInfo models.FileInfo) (*models.File, *errors.Error) { +func CreateFile(db *gorm.DB, ownerID uuid.UUID, ownerType string, fileInfo models.FileInfo) (*models.File, error) { file := &models.File{ OwnerID: ownerID, OwnerType: ownerType, @@ -21,25 +23,24 @@ func CreateFile(db *gorm.DB, ownerID uuid.UUID, ownerType string, fileInfo model } if err := db.Create(file).Error; err != nil { - return nil, &errors.FailedToCreateFileInDB + return nil, err } return file, nil } -func DeleteFile(db *gorm.DB, fileID uuid.UUID) *errors.Error { +func DeleteFile(db *gorm.DB, fileID uuid.UUID) error { if err := db.Delete(&models.File{}, fileID).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return &errors.FileNotFound - } else { - return &errors.FailedToDeleteFile + if errors.Is(err, gorm.ErrRecordNotFound) { + return utilities.ErrNotFound } + return err } return nil } -func UpdateFile(db *gorm.DB, fileID uuid.UUID, fileInfo models.FileInfo) (*models.File, *errors.Error) { +func UpdateFile(db *gorm.DB, fileID uuid.UUID, fileInfo models.FileInfo) (*models.File, error) { existingFile, err := GetFile(db, fileID) if err != nil { return nil, err @@ -52,32 +53,28 @@ func UpdateFile(db *gorm.DB, fileID uuid.UUID, fileInfo models.FileInfo) (*model FileURL: fileInfo.FileURL, ObjectKey: fileInfo.ObjectKey, }).Error; err != nil { - return nil, &errors.FailedToUpdateFile + return nil, err } return existingFile, nil } -func GetFiles(db *gorm.DB, limit, page int) ([]models.File, *errors.Error) { +func GetFiles(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.File, error) { var files []models.File - - offset := (page - 1) * limit - - if err := db.Limit(limit).Offset(offset).Find(&files).Error; err != nil { - return nil, &errors.FailedToGetFiles + if err := db.Scopes(utilities.IntoScope(pageInfo, db)).Find(&files).Error; err != nil { + return nil, err } return files, nil } -func GetFile(db *gorm.DB, fileID uuid.UUID) (*models.File, *errors.Error) { +func GetFile(db *gorm.DB, fileID uuid.UUID) (*models.File, error) { var file models.File if err := db.First(&file, fileID).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.FileNotFound - } else { - return nil, &errors.FailedToGetFile + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &file, nil diff --git a/backend/entities/models/category.go b/backend/entities/models/category.go index f4a15da46..f6aaf3df4 100644 --- a/backend/entities/models/category.go +++ b/backend/entities/models/category.go @@ -3,10 +3,6 @@ package models type Category struct { Model - Name string `json:"name" validate:"required,max=255"` - Tag []Tag `json:"-" validate:"-"` -} - -type CategoryRequestBody struct { - Name string `json:"name" validate:"required,max=255"` + Name string `json:"name"` + Tag []Tag `json:"-"` } diff --git a/backend/entities/models/club.go b/backend/entities/models/club.go index ec71db8e7..217338f87 100644 --- a/backend/entities/models/club.go +++ b/backend/entities/models/club.go @@ -8,83 +8,36 @@ import ( "gorm.io/gorm" ) -type RecruitmentCycle string - -const ( - Fall RecruitmentCycle = "fall" - Spring RecruitmentCycle = "spring" - FallSpring RecruitmentCycle = "fallSpring" - Always RecruitmentCycle = "always" -) - -type RecruitmentType string - -const ( - Unrestricted RecruitmentType = "unrestricted" - Tryout RecruitmentType = "tryout" - Application RecruitmentType = "application" -) - type Club struct { Model - SoftDeletedAt gorm.DeletedAt `json:"-" validate:"-"` - - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Description string `json:"description" validate:"required,http_url,s3_url,max=255"` - NumMembers int `json:"num_members" validate:"required,min=1"` - IsRecruiting bool `json:"is_recruiting" validate:"required"` - RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` - RecruitmentType RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` - WeeklyTimeCommitment int `json:"weekly_time_commitment" validate:"omitempty,min=1"` - OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` - ApplicationLink string `json:"application_link" validate:"required,max=255,http_url"` - Logo string `json:"logo" validate:"omitempty,http_url,s3_url,max=255"` - - Parent *uuid.UUID `gorm:"foreignKey:Parent;" json:"-" validate:"uuid4"` - Tag []Tag `gorm:"many2many:club_tags;" json:"-" validate:"-"` - Member []User `gorm:"many2many:user_club_members;" json:"-" validate:"required"` - Follower []User `gorm:"many2many:user_club_followers;" json:"-" validate:"-"` - IntendedApplicant []User `gorm:"many2many:user_club_intended_applicants;" json:"-" validate:"-"` - Comment []Comment `json:"-" validate:"-"` - PointOfContact []PointOfContact `json:"-" validate:"-"` - Contact []Contact `json:"-" validate:"-"` - // Event - HostEvent []Event `gorm:"foreignKey:Host;" json:"-" validate:"-"` - Event []Event `gorm:"many2many:club_events;" json:"-" validate:"-"` - Notifcation []Notification `gorm:"polymorphic:Reference;" json:"-" validate:"-"` -} - -type CreateClubRequestBody struct { - UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Description string `json:"description" validate:"required,http_url,s3_url,max=255"` - IsRecruiting bool `json:"is_recruiting" validate:"required"` - RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` - RecruitmentType RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` - WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` - OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` - ApplicationLink string `json:"application_link" validate:"required,max=255,http_url"` - Logo string `json:"logo" validate:"omitempty,http_url,s3_url,max=255"` -} + SoftDeletedAt gorm.DeletedAt `json:"-"` + + Name string `json:"name"` + Preview string `json:"preview"` + Description string `json:"description"` + NumMembers int `json:"num_members"` + IsRecruiting bool `json:"is_recruiting"` + RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle"` + RecruitmentType RecruitmentType `json:"recruitment_type"` + WeeklyTimeCommitment int `json:"weekly_time_commitment"` + OneWordToDescribeUs string `json:"one_word_to_describe_us"` + ApplicationLink string `json:"application_link"` + Logo string `json:"logo"` + + Parent *uuid.UUID `gorm:"foreignKey:Parent;" json:"-"` + Tag []Tag `gorm:"many2many:club_tags;" json:"-"` + Member []User `gorm:"many2many:user_club_members;" json:"-"` + Follower []User `gorm:"many2many:user_club_followers;" json:"-"` + IntendedApplicant []User `gorm:"many2many:user_club_intended_applicants;" json:"-"` + Comment []Comment `json:"-"` + PointOfContact []PointOfContact `json:"-"` + Contact []Contact `json:"-"` -type UpdateClubRequestBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - Preview string `json:"preview" validate:"omitempty,max=255"` - Description string `json:"description" validate:"omitempty,http_url,s3_url,max=255"` - IsRecruiting bool `json:"is_recruiting" validate:"omitempty"` - RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` - RecruitmentType RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` - WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` - OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` - ApplicationLink string `json:"application_link" validate:"omitempty,required,max=255,http_url"` - Logo string `json:"logo" validate:"omitempty,s3_url,max=255,http_url"` -} - -type CreateClubTagsRequestBody struct { - Tags []uuid.UUID `json:"tags" validate:"required"` + // Event + HostEvent []Event `gorm:"foreignKey:Host;" json:"-"` + Event []Event `gorm:"many2many:club_events;" json:"-"` + Notifcation []Notification `gorm:"polymorphic:Reference;" json:"-"` } type ClubQueryParams struct { @@ -96,8 +49,6 @@ type ClubQueryParams struct { MinWeeklyTimeCommitment int `query:"min_weekly_time_commitment"` MaxWeeklyTimeCommitment int `query:"max_weekly_time_commitment"` OneWordToDescribeUs string `query:"one_word_to_describe_us"` - Limit int `query:"limit"` - Page int `query:"page"` Search string `query:"search"` } diff --git a/backend/entities/models/college.go b/backend/entities/models/college.go new file mode 100644 index 000000000..2defefb71 --- /dev/null +++ b/backend/entities/models/college.go @@ -0,0 +1,15 @@ +package models + +type College string + +const ( + CAMD College = "CAMD" // College of Arts, Media and Design + DMSB College = "DMSB" // D'Amore-McKim School of Business + KCCS College = "KCCS" // Khoury College of Computer Sciences + CE College = "CE" // College of Engineering + BCHS College = "BCHS" // Bouvé College of Health Sciences + SL College = "SL" // School of Law + CPS College = "CPS" // College of Professional Studies + CS College = "CS" // College of Science + CSSH College = "CSSH" // College of Social Sciences and Humanities +) diff --git a/backend/entities/models/comment.go b/backend/entities/models/comment.go index 00f73e552..fde2fa825 100644 --- a/backend/entities/models/comment.go +++ b/backend/entities/models/comment.go @@ -5,16 +5,16 @@ import "github.com/google/uuid" type Comment struct { Model - Question string `json:"question" validate:"required,max=255"` - Answer string `json:"answer" validate:",max=255"` - NumFoundHelpful uint `json:"num_found_helpful" validate:"min=0"` + Question string `json:"question"` + Answer string `json:"answer"` + NumFoundHelpful uint `json:"num_found_helpful"` - AskedByID uuid.UUID `json:"-" validate:"uuid4"` - AskedBy User `json:"-" validate:"-"` + AskedByID uuid.UUID `json:"-"` + AskedBy User `json:"-"` - ClubID uuid.UUID `json:"-" validate:"uuid4"` - Club Club `json:"-" validate:"-"` + ClubID uuid.UUID `json:"-"` + Club Club `json:"-"` - AnsweredByID *uuid.UUID `json:"-" validate:"uuid4"` - AnsweredBy *User `json:"-" validate:"-"` + AnsweredByID *uuid.UUID `json:"-"` + AnsweredBy *User `json:"-"` } diff --git a/backend/entities/models/contact.go b/backend/entities/models/contact.go index cf17c5f6f..82b3de1d3 100644 --- a/backend/entities/models/contact.go +++ b/backend/entities/models/contact.go @@ -43,13 +43,8 @@ func GetContentPrefix(contactType ContactType) string { type Contact struct { Model - Type ContactType `json:"type" validate:"required,max=255,oneof=facebook instagram x linkedin youtube github slack discord email customSite"` - Content string `json:"content" validate:"required,max=255"` + Type ContactType `json:"type"` + Content string `json:"content"` - ClubID uuid.UUID `json:"-" validate:"uuid4"` -} - -type PutContactRequestBody struct { - Type ContactType `json:"type" validate:"required,max=255,oneof=facebook instagram x linkedin youtube github slack discord email customSite,contact_pointer"` - Content string `json:"content" validate:"required,contact_pointer,max=255"` + ClubID uuid.UUID `json:"-"` } diff --git a/backend/entities/models/event.go b/backend/entities/models/event.go index 74b0185da..12eb1b0f6 100644 --- a/backend/entities/models/event.go +++ b/backend/entities/models/event.go @@ -9,111 +9,41 @@ import ( type EventType string const ( - Open EventType = "open" - MembersOnly EventType = "membersOnly" -) - -type RecurringType string - -const ( - Daily RecurringType = "daily" - Weekly RecurringType = "weekly" - Monthly RecurringType = "monthly" + Hybrid EventType = "hybrid" + InPerson EventType = "in_person" + Virtual EventType = "virtual" ) type Event struct { Model - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Content string `json:"content" validate:"required,max=255"` - StartTime time.Time `json:"start_time" validate:"required,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,gtecsfield=StartTime"` - Location string `json:"location" validate:"required,max=255"` - EventType EventType `json:"event_type" validate:"required,max=255,oneof=open membersOnly"` - IsRecurring bool `json:"is_recurring" validate:"-"` - MeetingLink string `json:"meeting_link" validate:"url"` - Host *uuid.UUID `json:"host" validate:"uuid4"` - - RSVP []User `gorm:"many2many:user_event_rsvps;" json:"-" validate:"-"` - Waitlist []User `gorm:"many2many:user_event_waitlists;" json:"-" validate:"-"` - Clubs []Club `gorm:"many2many:club_events;" json:"-" validate:"-"` - Tag []Tag `gorm:"many2many:event_tags;" json:"-" validate:"-"` - Notification []Notification `gorm:"polymorphic:Reference;" json:"-" validate:"-"` -} - -type Series struct { - Model - RecurringType RecurringType `json:"recurring_type" validate:"max=255"` - MaxOccurrences int `json:"max_occurrences" validate:"min=1"` - Events []Event `gorm:"many2many:event_series;" json:"events" validate:"-"` -} - -type EventSeries struct { - EventID uuid.UUID `json:"event_id" validate:"uuid4"` - Event Event `json:"-" validate:"-"` - SeriesID uuid.UUID `json:"series_id" validate:"uuid4"` - Series Series `json:"-" validate:"-"` -} - -// Not needed for now, we will just update the events separately -type EventInstanceException struct { - Model - EventID int `json:"event_id" validate:"required"` - Event Event - IsRescheduled bool `json:"is_rescheduled" validate:"required"` - IsCancelled bool `json:"is_cancelled" validate:"required"` - StartTime time.Time `json:"start_time" validate:"required,datetime,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,datetime,gtecsfield=StartTime"` -} - -// TODO We will likely need to update the create and update structs to account for recurring series -type CreateEventRequestBody struct { - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Content string `json:"content" validate:"required,max=255"` - StartTime time.Time `json:"start_time" validate:"required,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,gtecsfield=StartTime"` - Location string `json:"location" validate:"required,max=255"` - EventType EventType `json:"event_type" validate:"required,max=255,oneof=open membersOnly"` - IsRecurring *bool `json:"is_recurring" validate:"required"` - - // TODO club/tag/notification logic - Host *uuid.UUID `json:"host" validate:"required,uuid4"` - Clubs []Club `json:"-" validate:"omitempty"` - Tag []Tag `json:"-" validate:"omitempty"` - Notification []Notification `json:"-" validate:"omitempty"` - - // TODO validate if isRecurring, then series is required - Series CreateSeriesRequestBody `json:"series" validate:"-"` -} - -type CreateSeriesRequestBody struct { - RecurringType RecurringType `json:"recurring_type" validate:"required,max=255,oneof=daily weekly monthly"` - MaxOccurrences int `json:"max_occurrences" validate:"required,min=2"` -} - -type UpdateEventRequestBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - Preview string `json:"preview" validate:"omitempty,max=255"` - Content string `json:"content" validate:"omitempty,max=255"` - StartTime time.Time `json:"start_time" validate:"omitempty,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"omitempty,gtecsfield=StartTime"` - Location string `json:"location" validate:"omitempty,max=255"` - EventType EventType `json:"event_type" validate:"omitempty,max=255,oneof=open membersOnly"` - - Host *uuid.UUID `json:"host" validate:"omitempty"` - RSVP []User `json:"-" validate:"omitempty"` - Waitlist []User `json:"-" validate:"omitempty"` - Clubs []Club `json:"-" validate:"omitempty"` - Tag []Tag `json:"-" validate:"omitempty"` - Notification []Notification `json:"-" validate:"omitempty"` -} - -// TODO: probably need to make changes to this to update the events as well -type UpdateSeriesRequestBody struct { - RecurringType RecurringType `json:"recurring_type" validate:"omitempty,max=255,oneof=daily weekly monthly"` - MaxOccurrences int `json:"max_occurrences" validate:"omitempty,min=2"` - - EventDetails UpdateEventRequestBody `json:"event_details" validate:"omitempty"` + // details + Name string `json:"name"` + Preview string `json:"preview"` + Description string `json:"description"` + Host *uuid.UUID `json:"host"` + + // geoshi + EventType EventType `json:"event_type"` + Location string `json:"location"` + Link string `json:"link"` + + // internal housekeeping states + IsPublic bool `json:"is_public"` + IsDraft bool `json:"is_draft"` + IsArchived bool `json:"is_archived"` + + // timing + StartTime time.Time `json:"start_time"` + EndTime time.Time `json:"end_time"` + + // series + SeriesID *uuid.UUID `json:"-"` + + // bridgerton + RSVP []User `gorm:"many2many:user_event_rsvps;" json:"-"` + Waitlist []User `gorm:"many2many:user_event_waitlists;" json:"-"` + Clubs []Club `gorm:"many2many:club_events;" json:"-"` + Tag []Tag `gorm:"many2many:event_tags;" json:"-"` + Notification []Notification `gorm:"polymorphic:Reference;" json:"-"` } diff --git a/backend/entities/models/file.go b/backend/entities/models/file.go index a5ea52b43..215618a6a 100644 --- a/backend/entities/models/file.go +++ b/backend/entities/models/file.go @@ -15,17 +15,12 @@ type FileInfo struct { type File struct { Model - OwnerID uuid.UUID `json:"-" validate:"required,uuid4"` - OwnerType string `json:"-" validate:"required,max=255"` + OwnerID uuid.UUID `json:"-"` + OwnerType string `json:"-"` - FileName string `json:"file_name" validate:"required,max=255"` - FileType string `json:"file_type" validate:"required,max=255"` - FileSize int `json:"file_size" validate:"required,min=1"` - FileURL string `json:"file_url" validate:"required,max=255"` - ObjectKey string `json:"object_key" validate:"required,max=255"` -} - -type CreateFileRequestBody struct { - OwnerID uuid.UUID `json:"owner_id" validate:"required,uuid4"` - OwnerType string `json:"owner_type" validate:"required,max=255"` + FileName string `json:"file_name"` + FileType string `json:"file_type"` + FileSize int `json:"file_size"` + FileURL string `json:"file_url"` + ObjectKey string `json:"object_key"` } diff --git a/backend/entities/models/follower.go b/backend/entities/models/follower.go index 9d9f015ca..de469eac1 100644 --- a/backend/entities/models/follower.go +++ b/backend/entities/models/follower.go @@ -9,9 +9,9 @@ func (Follower) TableName() string { } type Follower struct { - UserID uuid.UUID `gorm:"primaryKey;" json:"user_id" validate:"required,uuid4"` - ClubID uuid.UUID `gorm:"primaryKey" json:"club_id" validate:"required,uuid4"` + UserID uuid.UUID `gorm:"primaryKey;" json:"user_id"` + ClubID uuid.UUID `gorm:"primaryKey" json:"club_id"` - Club *Club `json:"-" validate:"-"` - User *User `json:"-" validate:"-"` + Club *Club `json:"-"` + User *User `json:"-"` } diff --git a/backend/entities/models/graduation_cycle.go b/backend/entities/models/graduation_cycle.go new file mode 100644 index 000000000..9bd1f7102 --- /dev/null +++ b/backend/entities/models/graduation_cycle.go @@ -0,0 +1,8 @@ +package models + +type GraduationCycle string + +const ( + December GraduationCycle = "december" + May GraduationCycle = "may" +) diff --git a/backend/entities/models/major.go b/backend/entities/models/major.go new file mode 100644 index 000000000..29da28102 --- /dev/null +++ b/backend/entities/models/major.go @@ -0,0 +1,107 @@ +package models + +type Major string + +// see https://admissions.northeastern.edu/academics/areas-of-study/ +const ( + AfricanaStudies Major = "africanaStudies" + AmericanSignLanguage Major = "americanSignLanguage" + AmericanSignLanguageEnglishInterpreting Major = "americanSignLanguage-EnglishInterpreting" + AppliedPhysics Major = "appliedPhysics" + ArchitecturalStudies Major = "architecturalStudies" + Architecture Major = "architecture" + ArtArtVisualStudies Major = "art:ArtVisualStudies" + BehavioralNeuroscience Major = "behavioralNeuroscience" + Biochemistry Major = "biochemistry" + Bioengineering Major = "bioengineering" + Biology Major = "biology" + BiomedicalPhysics Major = "biomedicalPhysics" + BusinessAdministration Major = "businessAdministration" + BusinessAdministrationAccounting Major = "businessAdministration:Accounting" + BusinessAdministrationAccountingAndAdvisoryServices Major = "businessAdministration:AccountingAndAdvisoryServices" + BusinessAdministrationBrandManagement Major = "businessAdministration:BrandManagement" + BusinessAdministrationBusinessAnalytics Major = "businessAdministration:BusinessAnalytics" + BusinessAdministrationCorporateInnovation Major = "businessAdministration:CorporateInnovation" + BusinessAdministrationEntrepreneurialStartups Major = "businessAdministration:EntrepreneurialStartups" + BusinessAdministrationFamilyBusiness Major = "businessAdministration:FamilyBusiness" + BusinessAdministrationFinance Major = "businessAdministration:Finance" + BusinessAdministrationFintech Major = "businessAdministration:Fintech" + BusinessAdministrationHealthcareManagementAndConsulting Major = "businessAdministration:HealthcareManagementAndConsulting" + BusinessAdministrationManagement Major = "businessAdministration:Management" + BusinessAdministrationManagementInformationSystems Major = "businessAdministration:ManagementInformationSystems" + BusinessAdministrationMarketing Major = "businessAdministration:Marketing" + BusinessAdministrationMarketingAnalytics Major = "businessAdministration:MarketingAnalytics" + BusinessAdministrationSocialInnovationAndEntrepreneurship Major = "businessAdministration:SocialInnovationAndEntrepreneurship" + BusinessAdministrationSupplyChainManagement Major = "businessAdministration:SupplyChainManagement" + CellAndMolecularBiology Major = "cellAndMolecularBiology" + ChemicalEngineering Major = "chemicalEngineering" + Chemistry Major = "chemistry" + CivilEngineering Major = "civilEngineering" + CommunicationStudies Major = "communicationStudies" + ComputerEngineering Major = "computerEngineering" + ComputerScience Major = "computerScience" + ComputingAndLaw Major = "computingAndLaw" + CriminologyAndCriminalJustice Major = "criminologyAndCriminalJustice" + CulturalAnthropology Major = "culturalAnthropology" + Cybersecurity Major = "cybersecurity" + DataScience Major = "dataScience" + Design Major = "design" + Economics Major = "economics" + ElectricalEngineering Major = "electricalEngineering" + English Major = "english" + EnvironmentalAndSustainabilityStudies Major = "environmentalAndSustainabilityStudies" + EnvironmentalEngineering Major = "environmentalEngineering" + EnvironmentalScience Major = "environmentalScience" + EnvironmentalStudies Major = "environmentalStudies" + GameArtAndAnimation Major = "gameArtAndAnimation" + GameDesign Major = "gameDesign" + GlobalAsianStudies Major = "globalAsianStudies" + HealthScience Major = "healthScience" + History Major = "history" + HistoryCultureAndLaw Major = "historyCultureAndLaw" + HumanServices Major = "humanServices" + IndustrialEngineering Major = "industrialEngineering" + InternationalAffairs Major = "internationalAffairs" + InternationalBusiness Major = "internationalBusiness" + InternationalBusinessAccounting Major = "internationalBusiness:Accounting" + InternationalBusinessAccountingAndAdvisoryServices Major = "internationalBusiness:AccountingAndAdvisoryServices" + InternationalBusinessBrandManagement Major = "internationalBusiness:BrandManagement" + InternationalBusinessBusinessAnalytics Major = "internationalBusiness:BusinessAnalytics" + InternationalBusinessCorporateInnovation Major = "internationalBusiness:CorporateInnovation" + InternationalBusinessEntrepreneurialStartups Major = "internationalBusiness:EntrepreneurialStartups" + InternationalBusinessFamilyBusiness Major = "internationalBusiness:FamilyBusiness" + InternationalBusinessFinance Major = "internationalBusiness:Finance" + InternationalBusinessFintech Major = "internationalBusiness:Fintech" + InternationalBusinessHealthcareManagementAndConsulting Major = "internationalBusiness:HealthcareManagementAndConsulting" + InternationalBusinessManagement Major = "internationalBusiness:Management" + InternationalBusinessManagementInformationSystems Major = "internationalBusiness:ManagementInformationSystems" + InternationalBusinessMarketing Major = "internationalBusiness:Marketing" + InternationalBusinessMarketingAnalytics Major = "internationalBusiness:MarketingAnalytics" + InternationalBusinessSocialInnovationAndEntrepreneurship Major = "internationalBusiness:SocialInnovationAndEntrepreneurship" + InternationalBusinessSupplyChainManagement Major = "internationalBusiness:SupplyChainManagement" + Journalism Major = "journalism" + LandscapeArchitecture Major = "landscapeArchitecture" + Linguistics Major = "linguistics" + MarineBiology Major = "marineBiology" + Mathematics Major = "mathematics" + MechanicalEngineering Major = "mechanicalEngineering" + MediaAndScreenStudies Major = "mediaAndScreenStudies" + MediaArts Major = "mediaArts" + Music Major = "music" + MusicTechnology Major = "musicTechnology" + Nursing Major = "nursing" + PharmaceuticalSciences Major = "pharmaceuticalSciences" + PharmacyPharmD Major = "pharmacy(PharmD)" + Philosophy Major = "philosophy" + Physics Major = "physics" + PoliticalScience Major = "politicalScience" + PoliticsPhilosophyEconomics Major = "politicsPhilosophyEconomics" + Psychology Major = "psychology" + PublicHealth Major = "publicHealth" + PublicRelations Major = "publicRelations" + ReligiousStudies Major = "religiousStudies" + Sociology Major = "sociology" + Spanish Major = "spanish" + SpeechLanguagePathologyAndAudiology Major = "speechLanguagePathologyAndAudiology" + Theatre Major = "theatre" +) diff --git a/backend/entities/models/membership.go b/backend/entities/models/membership.go index a4a963911..48c6f79d1 100644 --- a/backend/entities/models/membership.go +++ b/backend/entities/models/membership.go @@ -16,11 +16,11 @@ func (Membership) TableName() string { } type Membership struct { - UserID uuid.UUID `gorm:"primaryKey;" json:"user_id" validate:"required,uuid4"` - ClubID uuid.UUID `gorm:"primaryKey;" json:"club_id" validate:"required,uuid4"` + UserID uuid.UUID `gorm:"primaryKey;" json:"user_id"` + ClubID uuid.UUID `gorm:"primaryKey;" json:"club_id"` - Club *Club `json:"-" validate:"-"` - User *User `json:"-" validate:"-"` + Club *Club `json:"-"` + User *User `json:"-"` - MembershipType MembershipType `json:"membership_type" validate:"required,oneof=member admin"` + MembershipType MembershipType `json:"membership_type"` } diff --git a/backend/entities/models/notification.go b/backend/entities/models/notification.go index 1e1dda738..2c6af0c25 100644 --- a/backend/entities/models/notification.go +++ b/backend/entities/models/notification.go @@ -16,12 +16,12 @@ const ( type Notification struct { Model - SendAt time.Time `json:"send_at" validate:"required"` - Title string `json:"title" validate:"required,max=255"` - Content string `json:"content" validate:"required,max=255"` - DeepLink string `json:"deep_link" validate:"required,max=255"` - Icon string `json:"icon" validate:"required,s3_url,http_url,max=255"` + SendAt time.Time `json:"send_at"` + Title string `json:"title"` + Content string `json:"content"` + DeepLink string `json:"deep_link"` + Icon string `json:"icon"` - ReferenceID uuid.UUID `json:"-" validate:"uuid4"` - ReferenceType NotificationType `json:"-" validate:"max=255"` + ReferenceID uuid.UUID `json:"-"` + ReferenceType NotificationType `json:"-"` } diff --git a/backend/entities/models/poc.go b/backend/entities/models/poc.go index ee03c015b..9a94b45dd 100644 --- a/backend/entities/models/poc.go +++ b/backend/entities/models/poc.go @@ -7,23 +7,11 @@ import ( type PointOfContact struct { Model - Name string `json:"name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,max=255"` - Position string `json:"position" validate:"required,max=255"` + Name string `json:"name"` + Email string `json:"email"` + Position string `json:"position"` - ClubID uuid.UUID `json:"-" validate:"required,uuid4"` + ClubID uuid.UUID `json:"-"` PhotoFile File `gorm:"polymorphic:Owner;" json:"photo_file"` } - -type CreatePointOfContactBody struct { - Name string `json:"name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,max=255"` - Position string `json:"position" validate:"required,max=255"` -} - -type UpdatePointOfContactBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - Email string `json:"email" validate:"omitempty,email,max=255"` - Position string `json:"position" validate:"omitempty,max=255"` -} diff --git a/backend/entities/models/recruitment_cycle.go b/backend/entities/models/recruitment_cycle.go new file mode 100644 index 000000000..95a775f7e --- /dev/null +++ b/backend/entities/models/recruitment_cycle.go @@ -0,0 +1,10 @@ +package models + +type RecruitmentCycle string + +const ( + Fall RecruitmentCycle = "fall" + Spring RecruitmentCycle = "spring" + FallSpring RecruitmentCycle = "fallSpring" + Always RecruitmentCycle = "always" +) diff --git a/backend/entities/models/recruitment_type.go b/backend/entities/models/recruitment_type.go new file mode 100644 index 000000000..6ebcc6542 --- /dev/null +++ b/backend/entities/models/recruitment_type.go @@ -0,0 +1,9 @@ +package models + +type RecruitmentType string + +const ( + Unrestricted RecruitmentType = "unrestricted" + Tryout RecruitmentType = "tryout" + Application RecruitmentType = "application" +) diff --git a/backend/entities/models/role.go b/backend/entities/models/role.go new file mode 100644 index 000000000..0675e6ae1 --- /dev/null +++ b/backend/entities/models/role.go @@ -0,0 +1,8 @@ +package models + +type UserRole string + +var ( + Super UserRole = "super" + Student UserRole = "student" +) diff --git a/backend/entities/models/tag.go b/backend/entities/models/tag.go index 705210aa8..ec3235e41 100644 --- a/backend/entities/models/tag.go +++ b/backend/entities/models/tag.go @@ -5,21 +5,11 @@ import "github.com/google/uuid" type Tag struct { Model - Name string `json:"name" validate:"required,max=255"` + Name string `json:"name"` - CategoryID uuid.UUID `json:"category_id" validate:"required,uuid4"` + CategoryID uuid.UUID `json:"category_id"` - User []User `gorm:"many2many:user_tags;" json:"-" validate:"-"` - Club []Club `gorm:"many2many:club_tags;" json:"-" validate:"-"` - Event []Event `gorm:"many2many:event_tags;" json:"-" validate:"-"` -} - -type CreateTagRequestBody struct { - Name string `json:"name" validate:"required,max=255"` - CategoryID uuid.UUID `json:"category_id" validate:"required,uuid4"` -} - -type UpdateTagRequestBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - CategoryID uuid.UUID `json:"category_id" validate:"omitempty,uuid4"` + User []User `gorm:"many2many:user_tags;" json:"-"` + Club []Club `gorm:"many2many:club_tags;" json:"-"` + Event []Event `gorm:"many2many:event_tags;" json:"-"` } diff --git a/backend/entities/models/tokens.go b/backend/entities/models/tokens.go new file mode 100644 index 000000000..b1b527f76 --- /dev/null +++ b/backend/entities/models/tokens.go @@ -0,0 +1,6 @@ +package models + +type Tokens struct { + AccessToken string `json:"access_token"` + RefreshToken string `json:"refresh_token"` +} diff --git a/backend/entities/models/user.go b/backend/entities/models/user.go index c814eb4a5..bf1bb3b1e 100644 --- a/backend/entities/models/user.go +++ b/backend/entities/models/user.go @@ -4,209 +4,31 @@ import ( "gorm.io/gorm" ) -type UserRole string - -var ( - Super UserRole = "super" - Student UserRole = "student" -) - -type College string - -const ( - CAMD College = "CAMD" // College of Arts, Media and Design - DMSB College = "DMSB" // D'Amore-McKim School of Business - KCCS College = "KCCS" // Khoury College of Computer Sciences - CE College = "CE" // College of Engineering - BCHS College = "BCHS" // Bouvé College of Health Sciences - SL College = "SL" // School of Law - CPS College = "CPS" // College of Professional Studies - CS College = "CS" // College of Science - CSSH College = "CSSH" // College of Social Sciences and Humanities -) - -type Major string - -// see https://admissions.northeastern.edu/academics/areas-of-study/ -const ( - AfricanaStudies Major = "africanaStudies" - AmericanSignLanguage Major = "americanSignLanguage" - AmericanSignLanguageEnglishInterpreting Major = "americanSignLanguage-EnglishInterpreting" - AppliedPhysics Major = "appliedPhysics" - ArchitecturalStudies Major = "architecturalStudies" - Architecture Major = "architecture" - ArtArtVisualStudies Major = "art:ArtVisualStudies" - BehavioralNeuroscience Major = "behavioralNeuroscience" - Biochemistry Major = "biochemistry" - Bioengineering Major = "bioengineering" - Biology Major = "biology" - BiomedicalPhysics Major = "biomedicalPhysics" - BusinessAdministration Major = "businessAdministration" - BusinessAdministrationAccounting Major = "businessAdministration:Accounting" - BusinessAdministrationAccountingAndAdvisoryServices Major = "businessAdministration:AccountingAndAdvisoryServices" - BusinessAdministrationBrandManagement Major = "businessAdministration:BrandManagement" - BusinessAdministrationBusinessAnalytics Major = "businessAdministration:BusinessAnalytics" - BusinessAdministrationCorporateInnovation Major = "businessAdministration:CorporateInnovation" - BusinessAdministrationEntrepreneurialStartups Major = "businessAdministration:EntrepreneurialStartups" - BusinessAdministrationFamilyBusiness Major = "businessAdministration:FamilyBusiness" - BusinessAdministrationFinance Major = "businessAdministration:Finance" - BusinessAdministrationFintech Major = "businessAdministration:Fintech" - BusinessAdministrationHealthcareManagementAndConsulting Major = "businessAdministration:HealthcareManagementAndConsulting" - BusinessAdministrationManagement Major = "businessAdministration:Management" - BusinessAdministrationManagementInformationSystems Major = "businessAdministration:ManagementInformationSystems" - BusinessAdministrationMarketing Major = "businessAdministration:Marketing" - BusinessAdministrationMarketingAnalytics Major = "businessAdministration:MarketingAnalytics" - BusinessAdministrationSocialInnovationAndEntrepreneurship Major = "businessAdministration:SocialInnovationAndEntrepreneurship" - BusinessAdministrationSupplyChainManagement Major = "businessAdministration:SupplyChainManagement" - CellAndMolecularBiology Major = "cellAndMolecularBiology" - ChemicalEngineering Major = "chemicalEngineering" - Chemistry Major = "chemistry" - CivilEngineering Major = "civilEngineering" - CommunicationStudies Major = "communicationStudies" - ComputerEngineering Major = "computerEngineering" - ComputerScience Major = "computerScience" - ComputingAndLaw Major = "computingAndLaw" - CriminologyAndCriminalJustice Major = "criminologyAndCriminalJustice" - CulturalAnthropology Major = "culturalAnthropology" - Cybersecurity Major = "cybersecurity" - DataScience Major = "dataScience" - Design Major = "design" - Economics Major = "economics" - ElectricalEngineering Major = "electricalEngineering" - English Major = "english" - EnvironmentalAndSustainabilityStudies Major = "environmentalAndSustainabilityStudies" - EnvironmentalEngineering Major = "environmentalEngineering" - EnvironmentalScience Major = "environmentalScience" - EnvironmentalStudies Major = "environmentalStudies" - GameArtAndAnimation Major = "gameArtAndAnimation" - GameDesign Major = "gameDesign" - GlobalAsianStudies Major = "globalAsianStudies" - HealthScience Major = "healthScience" - History Major = "history" - HistoryCultureAndLaw Major = "historyCultureAndLaw" - HumanServices Major = "humanServices" - IndustrialEngineering Major = "industrialEngineering" - InternationalAffairs Major = "internationalAffairs" - InternationalBusiness Major = "internationalBusiness" - InternationalBusinessAccounting Major = "internationalBusiness:Accounting" - InternationalBusinessAccountingAndAdvisoryServices Major = "internationalBusiness:AccountingAndAdvisoryServices" - InternationalBusinessBrandManagement Major = "internationalBusiness:BrandManagement" - InternationalBusinessBusinessAnalytics Major = "internationalBusiness:BusinessAnalytics" - InternationalBusinessCorporateInnovation Major = "internationalBusiness:CorporateInnovation" - InternationalBusinessEntrepreneurialStartups Major = "internationalBusiness:EntrepreneurialStartups" - InternationalBusinessFamilyBusiness Major = "internationalBusiness:FamilyBusiness" - InternationalBusinessFinance Major = "internationalBusiness:Finance" - InternationalBusinessFintech Major = "internationalBusiness:Fintech" - InternationalBusinessHealthcareManagementAndConsulting Major = "internationalBusiness:HealthcareManagementAndConsulting" - InternationalBusinessManagement Major = "internationalBusiness:Management" - InternationalBusinessManagementInformationSystems Major = "internationalBusiness:ManagementInformationSystems" - InternationalBusinessMarketing Major = "internationalBusiness:Marketing" - InternationalBusinessMarketingAnalytics Major = "internationalBusiness:MarketingAnalytics" - InternationalBusinessSocialInnovationAndEntrepreneurship Major = "internationalBusiness:SocialInnovationAndEntrepreneurship" - InternationalBusinessSupplyChainManagement Major = "internationalBusiness:SupplyChainManagement" - Journalism Major = "journalism" - LandscapeArchitecture Major = "landscapeArchitecture" - Linguistics Major = "linguistics" - MarineBiology Major = "marineBiology" - Mathematics Major = "mathematics" - MechanicalEngineering Major = "mechanicalEngineering" - MediaAndScreenStudies Major = "mediaAndScreenStudies" - MediaArts Major = "mediaArts" - Music Major = "music" - MusicTechnology Major = "musicTechnology" - Nursing Major = "nursing" - PharmaceuticalSciences Major = "pharmaceuticalSciences" - PharmacyPharmD Major = "pharmacy(PharmD)" - Philosophy Major = "philosophy" - Physics Major = "physics" - PoliticalScience Major = "politicalScience" - PoliticsPhilosophyEconomics Major = "politicsPhilosophyEconomics" - Psychology Major = "psychology" - PublicHealth Major = "publicHealth" - PublicRelations Major = "publicRelations" - ReligiousStudies Major = "religiousStudies" - Sociology Major = "sociology" - Spanish Major = "spanish" - SpeechLanguagePathologyAndAudiology Major = "speechLanguagePathologyAndAudiology" - Theatre Major = "theatre" -) - -type GraduationCycle string - -const ( - December GraduationCycle = "december" - May GraduationCycle = "may" -) - -type Tokens struct { - AccessToken string `json:"access_token"` - RefreshToken string `json:"refresh_token"` -} - type User struct { Model - Role UserRole `json:"role" validate:"required,oneof=super student"` - FirstName string `json:"first_name" validate:"required,max=255"` - LastName string `json:"last_name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,max=255"` - PasswordHash string `json:"-" validate:"required,len=97"` - Major0 Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,required,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major1 Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major2 Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - College College `json:"college" validate:"required,max=255"` - GraduationCycle GraduationCycle `json:"graduation_cycle" validate:"required,max=255,oneof=december may"` - GraduationYear int16 `json:"graduation_year" validate:"required"` + Role UserRole `json:"role"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Email string `json:"email"` + PasswordHash string `json:"-"` + Major0 Major `json:"major0"` + Major1 Major `json:"major1"` + Major2 Major `json:"major2"` + College College `json:"college"` + GraduationCycle GraduationCycle `json:"graduation_cycle"` + GraduationYear int16 `json:"graduation_year"` IsVerified bool `json:"is_verified"` - Tag []Tag `gorm:"many2many:user_tags;" json:"-" validate:"-"` - Admin []Club `gorm:"many2many:user_club_admins;" json:"-" validate:"-"` - Member []Club `gorm:"many2many:user_club_members;" json:"-" validate:"-"` - Follower []Club `gorm:"many2many:user_club_followers;" json:"-" validate:"-"` - IntendedApplicant []Club `gorm:"many2many:user_club_intended_applicants;" json:"-" validate:"-"` - Asked []Comment `gorm:"foreignKey:AskedByID;" json:"-" validate:"-"` - Answered []Comment `gorm:"foreignKey:AnsweredByID;" json:"-" validate:"-"` - RSVP []Event `gorm:"many2many:user_event_rsvps;" json:"-" validate:"-"` - Waitlist []Event `gorm:"many2many:user_event_waitlists;" json:"-" validate:"-"` -} - -type CreateUserRequestBody struct { - FirstName string `json:"first_name" validate:"required,max=255"` - LastName string `json:"last_name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,neu_email,max=255"` - Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually - // Optional fields - Major0 Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major1 Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major2 Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - College College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` - GraduationCycle GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` - GraduationYear int16 `json:"graduation_year" validate:"omitempty"` -} - -type UpdateUserRequestBody struct { - FirstName string `json:"first_name" validate:"omitempty,max=255"` - LastName string `json:"last_name" validate:"omitempty,max=255"` - Major0 Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major1 Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major2 Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - College College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` - GraduationCycle GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` - GraduationYear int16 `json:"graduation_year" validate:"omitempty"` -} - -type LoginUserResponseBody struct { - Email string `json:"email" validate:"required,email"` - Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually -} - -type UpdatePasswordRequestBody struct { - OldPassword string `json:"old_password" validate:"required,max=255"` // MARK: must be validated manually - NewPassword string `json:"new_password" validate:"required,not_equal_if_not_empty=OldPassword,max=255"` // MARK: must be validated manually -} - -type RefreshTokenRequestBody struct { - RefreshToken string `json:"refresh_token" validate:"required"` + Tag []Tag `gorm:"many2many:user_tags;" json:"-"` + Admin []Club `gorm:"many2many:user_club_admins;" json:"-"` + Member []Club `gorm:"many2many:user_club_members;" json:"-"` + Follower []Club `gorm:"many2many:user_club_followers;" json:"-"` + IntendedApplicant []Club `gorm:"many2many:user_club_intended_applicants;" json:"-"` + Asked []Comment `gorm:"foreignKey:AskedByID;" json:"-"` + Answered []Comment `gorm:"foreignKey:AnsweredByID;" json:"-"` + RSVP []Event `gorm:"many2many:user_event_rsvps;" json:"-"` + Waitlist []Event `gorm:"many2many:user_event_waitlists;" json:"-"` } func (u *User) AfterCreate(tx *gorm.DB) (err error) { diff --git a/backend/entities/models/verification.go b/backend/entities/models/verification.go index 96ee2035a..77546ec05 100644 --- a/backend/entities/models/verification.go +++ b/backend/entities/models/verification.go @@ -14,23 +14,8 @@ const ( ) type Verification struct { - UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` - Token string `json:"token" validate:"required,max=255"` - ExpiresAt time.Time `json:"expires_at" validate:"required"` - Type VerificationType `json:"type" validate:"required,oneof=email_verification password_reset"` -} - -type VerifyEmailRequestBody struct { - Email string `json:"email" validate:"required,email"` - Token string `json:"token" validate:"required,len=6"` -} - -type VerifyPasswordResetTokenRequestBody struct { - Token string `json:"token" validate:"required"` - NewPassword string `json:"new_password" validate:"required,min=8,password"` - VerifyNewPassword string `json:"verify_new_password" validate:"required,min=8,password,eqfield=NewPassword"` -} - -type EmailRequestBody struct { - Email string `json:"email" validate:"required,email"` + UserID uuid.UUID `json:"user_id"` + Token string `json:"token"` + ExpiresAt time.Time `json:"expires_at"` + Type VerificationType `json:"type"` } diff --git a/backend/entities/pocs/base/controller.go b/backend/entities/pocs/base/controller.go index d338e2307..e0d610a34 100644 --- a/backend/entities/pocs/base/controller.go +++ b/backend/entities/pocs/base/controller.go @@ -1,7 +1,10 @@ package base import ( - "github.com/GenerateNU/sac/backend/constants" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -23,17 +26,22 @@ func NewPointOfContactController(pointOfContactService PointOfContactServiceInte // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.PointOfContact -// @Failure 400 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /pocs/ [get] func (poc *PointOfContactController) GetPointOfContacts(c *fiber.Ctx) error { - pointOfContacts, err := poc.pointOfContactService.GetPointOfContacts(c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + pointOfContacts, err := poc.pointOfContactService.GetPointOfContacts(*pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(pointOfContacts) + return c.Status(http.StatusOK).JSON(pointOfContacts) } // GetPointOfContact godoc @@ -45,15 +53,15 @@ func (poc *PointOfContactController) GetPointOfContacts(c *fiber.Ctx) error { // @Produce json // @Param pocID path string true "Point of Contact ID" // @Success 200 {object} models.PointOfContact -// @Failure 400 {string} errors.Error -// @Failure 404 {string} errors.Error -// @Failure 500 {string} errors.Error +// @Failure 400 {string} error +// @Failure 404 {string} error +// @Failure 500 {string} error // @Router /pocs/{pocID}/ [get] func (poc *PointOfContactController) GetPointOfContact(c *fiber.Ctx) error { pointOfContact, err := poc.pointOfContactService.GetPointOfContact(c.Params("pocID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(pointOfContact) + return c.Status(http.StatusOK).JSON(pointOfContact) } diff --git a/backend/entities/pocs/base/routes.go b/backend/entities/pocs/base/routes.go index 67827a7b7..907459002 100644 --- a/backend/entities/pocs/base/routes.go +++ b/backend/entities/pocs/base/routes.go @@ -10,7 +10,7 @@ func PointOfContact(pointOfContactParams types.RouteParams) { // api/v1/pocs/* pointofContact := pointOfContactParams.Router.Group("/pocs") - pointofContact.Get("/", pointOfContactController.GetPointOfContacts) + pointofContact.Get("/", pointOfContactParams.UtilityMiddleware.Paginator, pointOfContactController.GetPointOfContacts) pointofContact.Get("/:pocID", pointOfContactController.GetPointOfContact) - // pointOfContact.Get("/:pocID/file", pointOfContactController.GetPointOfContacFileInfo) + // pointOfContact.Get("/:pocID/file", pointOfContactController.GetPointOfContacFileInfo)) } diff --git a/backend/entities/pocs/base/service.go b/backend/entities/pocs/base/service.go index 6717c3c93..3c2b0efc9 100644 --- a/backend/entities/pocs/base/service.go +++ b/backend/entities/pocs/base/service.go @@ -2,14 +2,14 @@ package base import ( "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" ) type PointOfContactServiceInterface interface { - GetPointOfContacts(limit string, page string) ([]models.PointOfContact, *errors.Error) - GetPointOfContact(pocID string) (*models.PointOfContact, *errors.Error) + GetPointOfContacts(pageInfo fiberpaginate.PageInfo) ([]models.PointOfContact, error) + GetPointOfContact(pocID string) (*models.PointOfContact, error) } type PointOfContactService struct { @@ -20,24 +20,14 @@ func NewPointOfContactService(serviceParams types.ServiceParams) PointOfContactS return &PointOfContactService{serviceParams} } -func (poc *PointOfContactService) GetPointOfContacts(limit string, page string) ([]models.PointOfContact, *errors.Error) { - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) - if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetPointOfContacts(poc.DB, *limitAsInt, *pageAsInt) +func (poc *PointOfContactService) GetPointOfContacts(pageInfo fiberpaginate.PageInfo) ([]models.PointOfContact, error) { + return GetPointOfContacts(poc.DB, pageInfo) } -func (poc *PointOfContactService) GetPointOfContact(pocID string) (*models.PointOfContact, *errors.Error) { +func (poc *PointOfContactService) GetPointOfContact(pocID string) (*models.PointOfContact, error) { idAsUUID, err := utilities.ValidateID(pocID) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return GetPointOfContact(poc.DB, *idAsUUID) diff --git a/backend/entities/pocs/base/transactions.go b/backend/entities/pocs/base/transactions.go index 910a49437..a31d5c0c9 100644 --- a/backend/entities/pocs/base/transactions.go +++ b/backend/entities/pocs/base/transactions.go @@ -1,40 +1,36 @@ package base import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/google/uuid" "gorm.io/gorm" ) -func GetPointOfContacts(db *gorm.DB, limit int, page int) ([]models.PointOfContact, *errors.Error) { +func GetPointOfContacts(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.PointOfContact, error) { var pointOfContacts []models.PointOfContact - - offset := (page - 1) * limit - - result := db.Preload("PhotoFile").Limit(limit).Offset(offset).Find(&pointOfContacts) + result := db.Preload("PhotoFile").Scopes(utilities.IntoScope(pageInfo, db)).Find(&pointOfContacts) if result.Error != nil { - if stdliberrors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, &errors.PointOfContactsNotFound - } else { - return nil, &errors.FailedToGetPointOfContacts + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, result.Error } return pointOfContacts, nil } -func GetPointOfContact(db *gorm.DB, id uuid.UUID) (*models.PointOfContact, *errors.Error) { +func GetPointOfContact(db *gorm.DB, id uuid.UUID) (*models.PointOfContact, error) { var pointOfContact models.PointOfContact if err := db.Preload("PhotoFile").First(&pointOfContact, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.PointOfContactNotFound - } else { - return nil, &errors.FailedToGetPointOfContact + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &pointOfContact, nil diff --git a/backend/entities/tags/base/controller.go b/backend/entities/tags/base/controller.go index 405dbbf01..29d63572c 100644 --- a/backend/entities/tags/base/controller.go +++ b/backend/entities/tags/base/controller.go @@ -1,8 +1,9 @@ package base import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -25,17 +26,17 @@ func NewTagController(tagService TagServiceInterface) *TagController { // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.Tag -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /tags [get] func (t *TagController) GetTags(c *fiber.Ctx) error { tags, err := t.tagService.GetTags() if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&tags) + return c.Status(http.StatusOK).JSON(&tags) } // CreateTag godoc @@ -46,26 +47,26 @@ func (t *TagController) GetTags(c *fiber.Ctx) error { // @Tags tag // @Accept json // @Produce json -// @Param tagBody body models.CreateTagRequestBody true "Tag Body" +// @Param tagBody body CreateTagRequestBody true "Tag Body" // @Success 201 {object} models.Tag -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /tags/ [post] func (t *TagController) CreateTag(c *fiber.Ctx) error { - var tagBody models.CreateTagRequestBody + var tagBody CreateTagRequestBody if err := c.BodyParser(&tagBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } dbTag, err := t.tagService.CreateTag(tagBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(&dbTag) + return c.Status(http.StatusCreated).JSON(&dbTag) } // GetTag godoc @@ -77,17 +78,17 @@ func (t *TagController) CreateTag(c *fiber.Ctx) error { // @Produce json // @Param tagID path string true "Tag ID" // @Success 200 {object} models.Tag -// @Failure 400 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /tags/{tagID}/ [get] func (t *TagController) GetTag(c *fiber.Ctx) error { tag, err := t.tagService.GetTag(c.Params("tagID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&tag) + return c.Status(http.StatusOK).JSON(&tag) } // UpdateTag godoc @@ -99,26 +100,26 @@ func (t *TagController) GetTag(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param tagID path string true "Tag ID" -// @Param tag body models.UpdateTagRequestBody true "Tag" +// @Param tag body UpdateTagRequestBody true "Tag" // @Success 200 {object} models.Tag -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /tags/{tagID}/ [patch] func (t *TagController) UpdateTag(c *fiber.Ctx) error { - var tagBody models.UpdateTagRequestBody + var tagBody UpdateTagRequestBody if err := c.BodyParser(&tagBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } tag, err := t.tagService.UpdateTag(c.Params("tagID"), tagBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&tag) + return c.Status(http.StatusOK).JSON(&tag) } // DeleteTag godoc @@ -130,16 +131,16 @@ func (t *TagController) UpdateTag(c *fiber.Ctx) error { // @Produce json // @Param tagID path string true "Tag ID" // @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /tags/{tagID}/ [delete] func (t *TagController) DeleteTag(c *fiber.Ctx) error { err := t.tagService.DeleteTag(c.Params("tagID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/tags/base/models.go b/backend/entities/tags/base/models.go new file mode 100644 index 000000000..ced3bd807 --- /dev/null +++ b/backend/entities/tags/base/models.go @@ -0,0 +1,13 @@ +package base + +import "github.com/google/uuid" + +type CreateTagRequestBody struct { + Name string `json:"name" validate:"required,max=255"` + CategoryID uuid.UUID `json:"category_id" validate:"required,uuid4"` +} + +type UpdateTagRequestBody struct { + Name string `json:"name" validate:"omitempty,max=255"` + CategoryID uuid.UUID `json:"category_id" validate:"omitempty,uuid4"` +} diff --git a/backend/entities/tags/base/service.go b/backend/entities/tags/base/service.go index 6a380c411..6c11a40d6 100644 --- a/backend/entities/tags/base/service.go +++ b/backend/entities/tags/base/service.go @@ -1,19 +1,21 @@ package base import ( + "errors" + "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/tags" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" ) type TagServiceInterface interface { - GetTags() ([]models.Tag, *errors.Error) - CreateTag(tagBody models.CreateTagRequestBody) (*models.Tag, *errors.Error) - GetTag(id string) (*models.Tag, *errors.Error) - UpdateTag(id string, tagBody models.UpdateTagRequestBody) (*models.Tag, *errors.Error) - DeleteTag(id string) *errors.Error + GetTags() ([]models.Tag, error) + CreateTag(tagBody CreateTagRequestBody) (*models.Tag, error) + GetTag(id string) (*models.Tag, error) + UpdateTag(id string, tagBody UpdateTagRequestBody) (*models.Tag, error) + DeleteTag(id string) error } type TagService struct { @@ -24,61 +26,58 @@ func NewTagService(serviceParams types.ServiceParams) TagServiceInterface { return &TagService{serviceParams} } -func (t *TagService) CreateTag(tagBody models.CreateTagRequestBody) (*models.Tag, *errors.Error) { - if err := t.Validate.Struct(tagBody); err != nil { - return nil, &errors.FailedToValidateTag +func (t *TagService) CreateTag(tagBody CreateTagRequestBody) (*models.Tag, error) { + if err := utilities.Validate(t.Validate, tagBody); err != nil { + return nil, err } - tag, err := utilities.MapRequestToModel(tagBody, &models.Tag{}) + tag, err := utilities.MapJsonTags(tagBody, &models.Tag{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } return CreateTag(t.DB, *tag) } -func (t *TagService) GetTags() ([]models.Tag, *errors.Error) { +func (t *TagService) GetTags() ([]models.Tag, error) { return GetTags(t.DB) } -func (t *TagService) GetTag(tagID string) (*models.Tag, *errors.Error) { - tagIDAsUUID, idErr := utilities.ValidateID(tagID) - - if idErr != nil { - return nil, idErr +func (t *TagService) GetTag(tagID string) (*models.Tag, error) { + tagIDAsUUID, err := utilities.ValidateID(tagID) + if err != nil { + return nil, err } return tags.GetTag(t.DB, *tagIDAsUUID) } -func (t *TagService) UpdateTag(tagID string, tagBody models.UpdateTagRequestBody) (*models.Tag, *errors.Error) { - tagIDAsUUID, idErr := utilities.ValidateID(tagID) - - if idErr != nil { - return nil, idErr +func (t *TagService) UpdateTag(tagID string, tagBody UpdateTagRequestBody) (*models.Tag, error) { + tagIDAsUUID, err := utilities.ValidateID(tagID) + if err != nil { + return nil, err } - if utilities.AtLeastOne(tagBody, models.UpdateTagRequestBody{}) { - return nil, &errors.FailedToValidateTag + if utilities.AtLeastOne(tagBody, UpdateTagRequestBody{}) { + return nil, errors.New("at least one field must be present") } - if err := t.Validate.Struct(tagBody); err != nil { - return nil, &errors.FailedToValidateTag + if err := utilities.Validate(t.Validate, tagBody); err != nil { + return nil, err } - tag, err := utilities.MapRequestToModel(tagBody, &models.Tag{}) + tag, err := utilities.MapJsonTags(tagBody, &models.Tag{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } return UpdateTag(t.DB, *tagIDAsUUID, *tag) } -func (t *TagService) DeleteTag(tagID string) *errors.Error { - tagIDAsUUID, idErr := utilities.ValidateID(tagID) - - if idErr != nil { - return idErr +func (t *TagService) DeleteTag(tagID string) error { + tagIDAsUUID, err := utilities.ValidateID(tagID) + if err != nil { + return err } return DeleteTag(t.DB, *tagIDAsUUID) diff --git a/backend/entities/tags/base/transactions.go b/backend/entities/tags/base/transactions.go index bed204b71..b1aa2cd76 100644 --- a/backend/entities/tags/base/transactions.go +++ b/backend/entities/tags/base/transactions.go @@ -1,86 +1,89 @@ package base import ( - stdliberrors "errors" + "errors" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/tags" "gorm.io/gorm" + "gorm.io/gorm/clause" ) -func CreateTag(db *gorm.DB, tag models.Tag) (*models.Tag, *errors.Error) { +func CreateTag(db *gorm.DB, tag models.Tag) (*models.Tag, error) { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var category models.Category if err := tx.Where("id = ?", tag.CategoryID).First(&category).Error; err != nil { - if err == gorm.ErrRecordNotFound { + if errors.Is(err, gorm.ErrRecordNotFound) { tx.Rollback() - return nil, &errors.CategoryNotFound + return nil, utilities.ErrNotFound } else { tx.Rollback() - return nil, &errors.InternalServerError + return nil, err } } if err := tx.Create(&tag).Error; err != nil { tx.Rollback() - return nil, &errors.FailedToCreateTag + return nil, err } - tx.Commit() - - return &tag, nil + return &tag, tx.Commit().Error } -func GetTags(db *gorm.DB) ([]models.Tag, *errors.Error) { +func GetTags(db *gorm.DB) ([]models.Tag, error) { var tags []models.Tag if err := db.Find(&tags).Error; err != nil { - return nil, &errors.FailedToGetTags + return nil, err } return tags, nil } -func UpdateTag(db *gorm.DB, id uuid.UUID, tag models.Tag) (*models.Tag, *errors.Error) { - if err := db.Model(&models.Tag{}).Where("id = ?", id).Updates(tag).First(&tag, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.TagNotFound - } else { - return nil, &errors.FailedToUpdateTag +func UpdateTag(db *gorm.DB, id uuid.UUID, tag models.Tag) (*models.Tag, error) { + var resultingTag models.Tag + if err := db.Model(&resultingTag).Clauses(clause.Returning{}).Where("id = ?", id).Updates(tag).First(&tag, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } - return &tag, nil + return &resultingTag, nil } -func DeleteTag(db *gorm.DB, tagID uuid.UUID) *errors.Error { +func DeleteTag(db *gorm.DB, tagID uuid.UUID) error { if result := db.Where("id = ?", tagID).Delete(&models.Tag{}); result.RowsAffected == 0 { if result.Error == nil { - return &errors.TagNotFound - } else { - return &errors.FailedToDeleteTag + return utilities.ErrNotFound } + return result.Error } return nil } -// Get clubs for a tag -func GetTagClubs(db *gorm.DB, id uuid.UUID) ([]models.Club, *errors.Error) { +func GetTagClubs(db *gorm.DB, id uuid.UUID) ([]models.Club, error) { var clubs []models.Club tag, err := tags.GetTag(db, id) if err != nil { - return nil, &errors.ClubNotFound + return nil, err } if err := db.Model(&tag).Association("Club").Find(&clubs); err != nil { - return nil, &errors.FailedToGetTag + return nil, err } + return clubs, nil } diff --git a/backend/entities/tags/transactions.go b/backend/entities/tags/transactions.go index 447fe7d90..5b795ce47 100644 --- a/backend/entities/tags/transactions.go +++ b/backend/entities/tags/transactions.go @@ -1,32 +1,31 @@ package tags import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" ) -func GetTag(db *gorm.DB, tagID uuid.UUID) (*models.Tag, *errors.Error) { +func GetTag(db *gorm.DB, tagID uuid.UUID) (*models.Tag, error) { var tag models.Tag if err := db.Where("id = ?", tagID).First(&tag).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.TagNotFound - } else { - return nil, &errors.FailedToGetTag + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &tag, nil } -func GetTagsByIDs(db *gorm.DB, selectedTagIDs []uuid.UUID) ([]models.Tag, *errors.Error) { +func GetTagsByIDs(db *gorm.DB, selectedTagIDs []uuid.UUID) ([]models.Tag, error) { if len(selectedTagIDs) != 0 { var tags []models.Tag if err := db.Model(models.Tag{}).Where("id IN ?", selectedTagIDs).Find(&tags).Error; err != nil { - return nil, &errors.FailedToGetTag + return nil, err } return tags, nil diff --git a/backend/entities/users/base/controller.go b/backend/entities/users/base/controller.go index e6f2373d4..2a158273c 100644 --- a/backend/entities/users/base/controller.go +++ b/backend/entities/users/base/controller.go @@ -1,11 +1,12 @@ package base import ( + "net/http" + "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -18,42 +19,6 @@ func NewUserController(userService UserServiceInterface) *UserController { return &UserController{userService: userService} } -// CreateUser godoc -// -// @Summary Create a user -// @Description Creates a user -// @ID create-user -// @Tags user -// @Accept json -// @Produce json -// @Param userBody body models.CreateUserRequestBody true "User Body" -// @Success 201 {object} models.User -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 409 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /users/ [post] -func (u *UserController) CreateUser(c *fiber.Ctx) error { - var userBody models.CreateUserRequestBody - - if err := c.BodyParser(&userBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) - } - - user, tokens, err := u.userService.CreateUser(userBody) - if err != nil { - return err.FiberError(c) - } - - err = auth.SetResponseTokens(c, tokens) - if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusCreated).JSON(user) -} - // GetUsers godoc // // @Summary Retrieve all users @@ -64,17 +29,22 @@ func (u *UserController) CreateUser(c *fiber.Ctx) error { // @Param limit query int false "Limit" // @Param page query int false "Page" // @Success 200 {object} []models.User -// @Failure 401 {object} errors.Error -// @Failure 400 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 401 {object} error +// @Failure 400 {object} error +// @Failure 500 {object} error // @Router /users/ [get] func (u *UserController) GetUsers(c *fiber.Ctx) error { - users, err := u.userService.GetUsers(c.Query("limit", constants.DEFAULT_LIMIT_STRING), c.Query("page", constants.DEFAULT_PAGE_STRING)) + pagination, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPagination + } + + users, err := u.userService.GetUsers(*pagination) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&users) + return c.Status(http.StatusOK).JSON(&users) } // Me godoc @@ -87,23 +57,23 @@ func (u *UserController) GetUsers(c *fiber.Ctx) error { // @Produce json // @Security Bearer // @Success 200 {object} models.User -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /auth/me [get] func (u *UserController) GetMe(c *fiber.Ctx) error { claims, err := auth.From(c) if err != nil { - return err.FiberError(c) + return err } user, err := u.userService.GetMe(claims.Issuer) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(user) + return c.Status(http.StatusOK).JSON(user) } // GetUser godoc @@ -115,18 +85,18 @@ func (u *UserController) GetMe(c *fiber.Ctx) error { // @Produce json // @Param userID path string true "User ID" // @Success 200 {object} models.User -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/ [get] func (u *UserController) GetUser(c *fiber.Ctx) error { user, err := u.userService.GetUser(c.Params("userID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(user) + return c.Status(http.StatusOK).JSON(user) } // UpdateUser godoc @@ -138,26 +108,26 @@ func (u *UserController) GetUser(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param userID path string true "User ID" -// @Param userBody body models.UpdateUserRequestBody true "User Body" +// @Param userBody body UpdateUserRequestBody true "User Body" // @Success 200 {object} models.User -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/ [patch] func (u *UserController) UpdateUser(c *fiber.Ctx) error { - var user models.UpdateUserRequestBody + var user UpdateUserRequestBody if err := c.BodyParser(&user); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } updatedUser, err := u.userService.UpdateUser(c.Params("userID"), user) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(updatedUser) + return c.Status(http.StatusOK).JSON(updatedUser) } // UpdatePassword godoc @@ -169,26 +139,26 @@ func (u *UserController) UpdateUser(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param userID path string true "User ID" -// @Param passwordBody body models.UpdatePasswordRequestBody true "Password Body" +// @Param passwordBody body authEntities.UpdatePasswordRequestBody true "Password Body" // @Success 200 {string} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/password [patch] func (u *UserController) UpdatePassword(c *fiber.Ctx) error { - var passwordBody models.UpdatePasswordRequestBody + var passwordBody authEntities.UpdatePasswordRequestBody if err := c.BodyParser(&passwordBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } err := u.userService.UpdatePassword(c.Params("userID"), passwordBody) if err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusOK, "success") + return utilities.FiberMessage(c, http.StatusOK, "success") } // DeleteUser godoc @@ -200,16 +170,16 @@ func (u *UserController) UpdatePassword(c *fiber.Ctx) error { // @Produce json // @Param userID path string true "User ID" // @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/ [delete] func (u *UserController) DeleteUser(c *fiber.Ctx) error { err := u.userService.DeleteUser(c.Params("userID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/users/base/models.go b/backend/entities/users/base/models.go new file mode 100644 index 000000000..d145e8993 --- /dev/null +++ b/backend/entities/users/base/models.go @@ -0,0 +1,28 @@ +package base + +import "github.com/GenerateNU/sac/backend/entities/models" + +type CreateUserRequestBody struct { + FirstName string `json:"first_name" validate:"required,max=255"` + LastName string `json:"last_name" validate:"required,max=255"` + Email string `json:"email" validate:"required,email,neu_email,max=255"` + Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually + // Optional fields + Major0 models.Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major1 models.Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major2 models.Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + College models.College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` + GraduationCycle models.GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` + GraduationYear int16 `json:"graduation_year" validate:"omitempty"` +} + +type UpdateUserRequestBody struct { + FirstName string `json:"first_name" validate:"omitempty,max=255"` + LastName string `json:"last_name" validate:"omitempty,max=255"` + Major0 models.Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major1 models.Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major2 models.Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + College models.College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` + GraduationCycle models.GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` + GraduationYear int16 `json:"graduation_year" validate:"omitempty"` +} diff --git a/backend/entities/users/base/routes.go b/backend/entities/users/base/routes.go index 2a0a9c67b..898a981ba 100644 --- a/backend/entities/users/base/routes.go +++ b/backend/entities/users/base/routes.go @@ -2,9 +2,9 @@ package base import ( p "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/users/follower" - "github.com/GenerateNU/sac/backend/entities/users/member" - "github.com/GenerateNU/sac/backend/entities/users/tag" + "github.com/GenerateNU/sac/backend/entities/users/followers" + "github.com/GenerateNU/sac/backend/entities/users/members" + "github.com/GenerateNU/sac/backend/entities/users/tags" "github.com/GenerateNU/sac/backend/types" "github.com/gofiber/fiber/v2" @@ -15,9 +15,9 @@ func UserRoutes(userParams types.RouteParams) { userParams.Router = usersRouter - tag.UserTag(userParams) - follower.UserFollower(userParams) - member.UserMember(userParams) + tags.UserTag(userParams) + followers.UserFollower(userParams) + members.UserMember(userParams) } func UsersRouter(userParams types.RouteParams) fiber.Router { @@ -26,8 +26,7 @@ func UsersRouter(userParams types.RouteParams) fiber.Router { // api/v1/users/* users := userParams.Router.Group("/users") - users.Get("/", userParams.AuthMiddleware.Authorize(p.ReadAll), userController.GetUsers) - users.Post("/", userController.CreateUser) + users.Get("/", userParams.AuthMiddleware.Authorize(p.ReadAll), userParams.UtilityMiddleware.Paginator, userController.GetUsers) users.Get("/me", userParams.AuthMiddleware.Authorize(p.UserRead), userController.GetMe) // api/v1/users/:userID/* diff --git a/backend/entities/users/base/service.go b/backend/entities/users/base/service.go index 29f16a3dc..92b03cfa2 100644 --- a/backend/entities/users/base/service.go +++ b/backend/entities/users/base/service.go @@ -1,27 +1,25 @@ package base import ( - "fmt" - "strings" + "errors" "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/auth/base" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" "github.com/GenerateNU/sac/backend/entities/models" + "github.com/garrettladley/fiberpaginate" "github.com/GenerateNU/sac/backend/entities/users" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" ) type UserServiceInterface interface { - GetUsers(limit string, page string) ([]models.User, *errors.Error) - GetMe(id string) (*models.User, *errors.Error) - GetUser(id string) (*models.User, *errors.Error) - CreateUser(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, *errors.Error) - UpdateUser(id string, userBody models.UpdateUserRequestBody) (*models.User, *errors.Error) - UpdatePassword(id string, passwordBody models.UpdatePasswordRequestBody) *errors.Error - DeleteUser(id string) *errors.Error + GetUsers(pageInfo fiberpaginate.PageInfo) ([]models.User, error) + GetMe(id string) (*models.User, error) + GetUser(id string) (*models.User, error) + UpdateUser(id string, userBody UpdateUserRequestBody) (*models.User, error) + UpdatePassword(id string, passwordBody authEntities.UpdatePasswordRequestBody) error + DeleteUser(id string) error } type UserService struct { @@ -32,70 +30,14 @@ func NewUserService(serviceParams types.ServiceParams) UserServiceInterface { return &UserService{serviceParams} } -func (u *UserService) CreateUser(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, *errors.Error) { - if err := u.Validate.Struct(userBody); err != nil { - return nil, nil, &errors.FailedToValidateUser - } - - if pwordValErr := auth.ValidatePassword(userBody.Password); pwordValErr != nil { - return nil, nil, pwordValErr - } - - user, err := utilities.MapRequestToModel(userBody, &models.User{}) - if err != nil { - return nil, nil, &errors.FailedToMapRequestToModel - } - - passwordHash, err := auth.ComputeHash(userBody.Password) - if err != nil { - return nil, nil, &errors.FailedToComputePasswordHash - } - - user.Email = strings.ToLower(userBody.Email) - user.PasswordHash = *passwordHash - - emailErr := u.Integrations.Email.SendWelcomeEmail(fmt.Sprintf("%s %s", user.FirstName, user.LastName), user.Email) - if emailErr != nil { - return nil, nil, &errors.FailedToSendEmail - } - - user, userErr := CreateUser(u.DB, user) - if userErr != nil { - return nil, nil, userErr - } - - authService := base.NewAuthService(u.ServiceParams) - authErr := authService.SendCode(user.Email) - if authErr != nil { - return nil, nil, authErr - } - - _, tokens, authErr := authService.Login(models.LoginUserResponseBody{Email: user.Email, Password: userBody.Password}) - if authErr != nil { - return nil, nil, authErr - } - - return user, tokens, nil +func (u *UserService) GetUsers(pageInfo fiberpaginate.PageInfo) ([]models.User, error) { + return GetUsers(u.DB, pageInfo) } -func (u *UserService) GetUsers(limit string, page string) ([]models.User, *errors.Error) { - limitAsInt, err := utilities.ValidateNonNegative(limit) - if err != nil { - return nil, &errors.FailedToValidateLimit - } - - pageAsInt, err := utilities.ValidateNonNegative(page) +func (u *UserService) GetMe(id string) (*models.User, error) { + idAsUUID, err := utilities.ValidateID(id) if err != nil { - return nil, &errors.FailedToValidatePage - } - - return GetUsers(u.DB, *limitAsInt, *pageAsInt) -} - -func (u *UserService) GetMe(id string) (*models.User, *errors.Error) { - idAsUUID, idErr := utilities.ValidateID(id) - if idErr != nil { - return nil, idErr + return nil, err } user, err := users.GetUser(u.DB, *idAsUUID) @@ -106,53 +48,47 @@ func (u *UserService) GetMe(id string) (*models.User, *errors.Error) { return user, nil } -func (u *UserService) GetUser(id string) (*models.User, *errors.Error) { +func (u *UserService) GetUser(id string) (*models.User, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return users.GetUser(u.DB, *idAsUUID) } -func (u *UserService) UpdateUser(id string, userBody models.UpdateUserRequestBody) (*models.User, *errors.Error) { +func (u *UserService) UpdateUser(id string, userBody UpdateUserRequestBody) (*models.User, error) { idAsUUID, idErr := utilities.ValidateID(id) if idErr != nil { return nil, idErr } - if utilities.AtLeastOne(userBody, models.UpdateUserRequestBody{}) { - return nil, &errors.FailedToValidateUser + if utilities.AtLeastOne(userBody, UpdateUserRequestBody{}) { + return nil, errors.New("no fields to update") } - if err := u.Validate.Struct(userBody); err != nil { - return nil, &errors.FailedToValidateUser + if err := utilities.Validate(u.Validate, userBody); err != nil { + return nil, err } - user, err := utilities.MapRequestToModel(userBody, &models.User{}) + user, err := utilities.MapJsonTags(userBody, &models.User{}) if err != nil { - return nil, &errors.FailedToMapRequestToModel + return nil, err } return UpdateUser(u.DB, *idAsUUID, *user) } -func (u *UserService) UpdatePassword(id string, passwordBody models.UpdatePasswordRequestBody) *errors.Error { - idAsUUID, idErr := utilities.ValidateID(id) - if idErr != nil { - return idErr - } - - if err := u.Validate.Struct(passwordBody); err != nil { - return &errors.FailedToValidateUpdatePasswordBody - } - - if pwordValErr := auth.ValidatePassword(passwordBody.OldPassword); pwordValErr != nil { - return pwordValErr +func (u *UserService) UpdatePassword(id string, passwordBody authEntities.UpdatePasswordRequestBody) error { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return err } - if pwordValErr := auth.ValidatePassword(passwordBody.NewPassword); pwordValErr != nil { - return pwordValErr + if err := utilities.Validate(u.Validate, passwordBody, + *utilities.NewMaybeError("old_password", auth.ValidatePassword(passwordBody.OldPassword)), + *utilities.NewMaybeError("new_password", auth.ValidatePassword(passwordBody.NewPassword))); err != nil { + return err } passwordHash, err := GetUserPasswordHash(u.DB, *idAsUUID) @@ -162,18 +98,18 @@ func (u *UserService) UpdatePassword(id string, passwordBody models.UpdatePasswo correct, passwordErr := auth.CompareHash(passwordBody.OldPassword, *passwordHash) if passwordErr != nil || !correct { - return &errors.FailedToValidateUser + return err } hash, hashErr := auth.ComputeHash(passwordBody.NewPassword) if hashErr != nil { - return &errors.FailedToValidateUser + return err } return users.UpdatePassword(u.DB, *idAsUUID, *hash) } -func (u *UserService) DeleteUser(id string) *errors.Error { +func (u *UserService) DeleteUser(id string) error { idAsUUID, err := utilities.ValidateID(id) if err != nil { return err diff --git a/backend/entities/users/base/transactions.go b/backend/entities/users/base/transactions.go index 27451352e..e3acaf1bb 100644 --- a/backend/entities/users/base/transactions.go +++ b/backend/entities/users/base/transactions.go @@ -1,78 +1,63 @@ package base import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/garrettladley/fiberpaginate" + + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) -func CreateUser(db *gorm.DB, user *models.User) (*models.User, *errors.Error) { - if err := db.Create(user).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrDuplicatedKey) { - return nil, &errors.UserAlreadyExists - } else { - return nil, &errors.FailedToCreateUser - } - } - - return user, nil -} - -func GetUsers(db *gorm.DB, limit int, page int) ([]models.User, *errors.Error) { +func GetUsers(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.User, error) { var users []models.User - - offset := (page - 1) * limit - - if err := db.Omit("password_hash").Limit(limit).Offset(offset).Find(&users).Error; err != nil { - return nil, &errors.FailedToGetUsers + if err := db.Omit("password_hash").Scopes(utilities.IntoScope(pageInfo, db)).Find(&users).Error; err != nil { + return nil, err } return users, nil } -func GetUserPasswordHash(db *gorm.DB, id uuid.UUID) (*string, *errors.Error) { +func GetUserPasswordHash(db *gorm.DB, id uuid.UUID) (*string, error) { var user models.User if err := db.Select("password_hash").First(&user, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.UserNotFound - } else { - return nil, &errors.FailedToGetUser + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &user.PasswordHash, nil } -func UpdateUser(db *gorm.DB, id uuid.UUID, user models.User) (*models.User, *errors.Error) { +func UpdateUser(db *gorm.DB, id uuid.UUID, user models.User) (*models.User, error) { var existingUser models.User err := db.First(&existingUser, id).Error if err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.UserNotFound - } else { - return nil, &errors.FailedToUpdateUser + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } - if err := db.Model(&existingUser).Updates(&user).Error; err != nil { - return nil, &errors.FailedToUpdateUser + if err := db.Model(&existingUser).Clauses(clause.Returning{}).Updates(&user).Error; err != nil { + return nil, err } return &existingUser, nil } -func DeleteUser(db *gorm.DB, id uuid.UUID) *errors.Error { +func DeleteUser(db *gorm.DB, id uuid.UUID) error { if result := db.Delete(&models.User{}, id); result.RowsAffected == 0 { if result.Error == nil { - return &errors.UserNotFound - } else { - return &errors.FailedToDeleteUser + return utilities.ErrNotFound } + return result.Error } return nil } diff --git a/backend/entities/users/follower/controller.go b/backend/entities/users/followers/controller.go similarity index 72% rename from backend/entities/users/follower/controller.go rename to backend/entities/users/followers/controller.go index 4646b20ac..b41741937 100644 --- a/backend/entities/users/follower/controller.go +++ b/backend/entities/users/followers/controller.go @@ -1,6 +1,8 @@ -package follower +package followers import ( + "net/http" + "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -24,16 +26,16 @@ func NewUserFollowerController(userFollowerService UserFollowerServiceInterface) // @Param userID path string true "User ID" // @Param clubID path string true "Club ID" // @Success 201 {object} utilities.SuccessResponse -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/follower/{clubID}/ [post] func (uf *UserFollowerController) CreateFollowing(c *fiber.Ctx) error { err := uf.userFollowerService.CreateFollowing(c.Params("userID"), c.Params("clubID")) if err != nil { - return err.FiberError(c) + return err } - return utilities.FiberMessage(c, fiber.StatusCreated, "Successfully followed club") + return utilities.FiberMessage(c, http.StatusCreated, "Successfully followed club") } // DeleteFollowing godoc @@ -47,16 +49,16 @@ func (uf *UserFollowerController) CreateFollowing(c *fiber.Ctx) error { // @Param userID path string true "User ID" // @Param clubID path string true "Club ID" // @Success 204 {object} utilities.SuccessResponse -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/follower/{clubID}/ [delete] func (uf *UserFollowerController) DeleteFollowing(c *fiber.Ctx) error { err := uf.userFollowerService.DeleteFollowing(c.Params("userID"), c.Params("clubID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } // GetAllFollowing godoc @@ -68,15 +70,15 @@ func (uf *UserFollowerController) DeleteFollowing(c *fiber.Ctx) error { // @Produce json // @Param userID path string true "User ID" // @Success 200 {object} []models.Club -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/follower/ [get] func (uf *UserFollowerController) GetFollowing(c *fiber.Ctx) error { clubs, err := uf.userFollowerService.GetFollowing(c.Params("userID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(clubs) + return c.Status(http.StatusOK).JSON(clubs) } diff --git a/backend/entities/users/follower/routes.go b/backend/entities/users/followers/routes.go similarity index 97% rename from backend/entities/users/follower/routes.go rename to backend/entities/users/followers/routes.go index c01fc1a80..9928f0932 100644 --- a/backend/entities/users/follower/routes.go +++ b/backend/entities/users/followers/routes.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/users/follower/service.go b/backend/entities/users/followers/service.go similarity index 78% rename from backend/entities/users/follower/service.go rename to backend/entities/users/followers/service.go index ea32871c4..2d2af7519 100644 --- a/backend/entities/users/follower/service.go +++ b/backend/entities/users/followers/service.go @@ -1,16 +1,15 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" ) type UserFollowerServiceInterface interface { - CreateFollowing(userId string, clubId string) *errors.Error - DeleteFollowing(userId string, clubId string) *errors.Error - GetFollowing(userId string) ([]models.Club, *errors.Error) + CreateFollowing(userId string, clubId string) error + DeleteFollowing(userId string, clubId string) error + GetFollowing(userId string) ([]models.Club, error) } type UserFollowerService struct { @@ -21,7 +20,7 @@ func NewUserFollowerService(serviceParams types.ServiceParams) UserFollowerServi return &UserFollowerService{serviceParams} } -func (u *UserFollowerService) CreateFollowing(userId string, clubId string) *errors.Error { +func (u *UserFollowerService) CreateFollowing(userId string, clubId string) error { userIdAsUUID, err := utilities.ValidateID(userId) if err != nil { return err @@ -33,7 +32,7 @@ func (u *UserFollowerService) CreateFollowing(userId string, clubId string) *err return CreateFollowing(u.DB, *userIdAsUUID, *clubIdAsUUID) } -func (u *UserFollowerService) DeleteFollowing(userId string, clubId string) *errors.Error { +func (u *UserFollowerService) DeleteFollowing(userId string, clubId string) error { userIdAsUUID, err := utilities.ValidateID(userId) if err != nil { return err @@ -45,7 +44,7 @@ func (u *UserFollowerService) DeleteFollowing(userId string, clubId string) *err return DeleteFollowing(u.DB, *userIdAsUUID, *clubIdAsUUID) } -func (u *UserFollowerService) GetFollowing(userId string) ([]models.Club, *errors.Error) { +func (u *UserFollowerService) GetFollowing(userId string) ([]models.Club, error) { userIdAsUUID, err := utilities.ValidateID(userId) if err != nil { return nil, err diff --git a/backend/entities/users/follower/transactions.go b/backend/entities/users/followers/transactions.go similarity index 81% rename from backend/entities/users/follower/transactions.go rename to backend/entities/users/followers/transactions.go index d318657c8..169f2e9d7 100644 --- a/backend/entities/users/follower/transactions.go +++ b/backend/entities/users/followers/transactions.go @@ -1,16 +1,15 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/entities/clubs" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/users" - "github.com/GenerateNU/sac/backend/errors" "github.com/google/uuid" "gorm.io/gorm" ) -func CreateFollowing(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Error { +func CreateFollowing(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) error { user, err := users.GetUser(db, userID) if err != nil { return err @@ -22,13 +21,13 @@ func CreateFollowing(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Er } if err := db.Model(&user).Association("Follower").Append(club); err != nil { - return &errors.FailedToFollowClub + return err } return nil } -func DeleteFollowing(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Error { +func DeleteFollowing(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) error { user, err := users.GetUser(db, userID) if err != nil { return err @@ -40,13 +39,13 @@ func DeleteFollowing(db *gorm.DB, userID uuid.UUID, clubID uuid.UUID) *errors.Er } if err := db.Model(&user).Association("Follower").Delete(club); err != nil { - return &errors.UserNotFollowingClub + return err } return nil } -func GetClubFollowing(db *gorm.DB, userID uuid.UUID) ([]models.Club, *errors.Error) { +func GetClubFollowing(db *gorm.DB, userID uuid.UUID) ([]models.Club, error) { var clubs []models.Club user, err := users.GetUser(db, userID) @@ -55,7 +54,7 @@ func GetClubFollowing(db *gorm.DB, userID uuid.UUID) ([]models.Club, *errors.Err } if err := db.Model(&user).Association("Follower").Find(&clubs); err != nil { - return nil, &errors.FailedToGetUserFollowing + return nil, err } return clubs, nil diff --git a/backend/entities/users/member/controller.go b/backend/entities/users/member/controller.go deleted file mode 100644 index 221fc76aa..000000000 --- a/backend/entities/users/member/controller.go +++ /dev/null @@ -1,85 +0,0 @@ -package member - -import ( - "github.com/GenerateNU/sac/backend/utilities" - "github.com/gofiber/fiber/v2" -) - -type UserMemberController struct { - clubMemberService UserMemberServiceInterface -} - -func NewUserMemberController(clubMemberService UserMemberServiceInterface) *UserMemberController { - return &UserMemberController{clubMemberService: clubMemberService} -} - -// CreateMembership godoc -// -// @Summary Join a club -// @Description Join a club -// @ID create-membership -// @Tags user-member -// @Accept json -// @Produce json -// @Param userID path string true "User ID" -// @Param clubID path string true "Club ID" -// @Success 201 {object} utilities.SuccessResponse -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /users/{userID}/member/{clubID}/ [post] -func (um *UserMemberController) CreateMembership(c *fiber.Ctx) error { - err := um.clubMemberService.CreateMembership(c.Params("userID"), c.Params("clubID")) - if err != nil { - return err.FiberError(c) - } - - return utilities.FiberMessage(c, fiber.StatusCreated, "Successfully joined club") -} - -// DeleteMembership godoc -// -// @Summary Leave a club -// @Description Leave a club -// @ID delete-membership -// @Tags user-member -// @Accept json -// @Produce json -// @Param userID path string true "User ID" -// @Param clubID path string true "Club ID" -// @Success 204 {object} utilities.SuccessResponse -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /users/{userID}/member/{clubID}/ [delete] -func (um *UserMemberController) DeleteMembership(c *fiber.Ctx) error { - err := um.clubMemberService.DeleteMembership(c.Params("userID"), c.Params("clubID")) - if err != nil { - return err.FiberError(c) - } - - return c.SendStatus(fiber.StatusNoContent) -} - -// GetMembership godoc -// -// @Summary Retrieve all clubs a user is a member of -// @Description Retrieves all clubs a user is a member of -// @ID get-membership -// @Tags user-member -// @Produce json -// @Param userID path string true "User ID" -// @Success 200 {object} []models.Club -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error -// @Router /users/{userID}/member/ [get] -func (um *UserMemberController) GetMembership(c *fiber.Ctx) error { - followers, err := um.clubMemberService.GetMembership(c.Params("userID")) - if err != nil { - return err.FiberError(c) - } - - return c.Status(fiber.StatusOK).JSON(followers) -} diff --git a/backend/entities/users/member/service.go b/backend/entities/users/member/service.go deleted file mode 100644 index 9e5c51b3a..000000000 --- a/backend/entities/users/member/service.go +++ /dev/null @@ -1,57 +0,0 @@ -package member - -import ( - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/GenerateNU/sac/backend/types" - "github.com/GenerateNU/sac/backend/utilities" -) - -type UserMemberServiceInterface interface { - CreateMembership(userID string, clubID string) *errors.Error - DeleteMembership(userID string, clubID string) *errors.Error - GetMembership(userID string) ([]models.Club, *errors.Error) -} - -type UserMemberService struct { - types.ServiceParams -} - -func NewUserMemberService(serviceParams types.ServiceParams) UserMemberServiceInterface { - return &UserMemberService{serviceParams} -} - -func (u *UserMemberService) CreateMembership(userID string, clubID string) *errors.Error { - userIdAsUUID, err := utilities.ValidateID(userID) - if err != nil { - return err - } - clubIdAsUUID, err := utilities.ValidateID(clubID) - if err != nil { - return err - } - - return CreateMember(u.DB, *userIdAsUUID, *clubIdAsUUID) -} - -func (u *UserMemberService) DeleteMembership(userID string, clubID string) *errors.Error { - userIdAsUUID, err := utilities.ValidateID(userID) - if err != nil { - return err - } - - clubIdAsUUID, err := utilities.ValidateID(clubID) - if err != nil { - return err - } - return DeleteMember(u.DB, *userIdAsUUID, *clubIdAsUUID) -} - -func (u *UserMemberService) GetMembership(userID string) ([]models.Club, *errors.Error) { - userIdAsUUID, err := utilities.ValidateID(userID) - if err != nil { - return nil, err - } - - return GetClubMembership(u.DB, *userIdAsUUID) -} diff --git a/backend/entities/users/members/controller.go b/backend/entities/users/members/controller.go new file mode 100644 index 000000000..5fb0ae78c --- /dev/null +++ b/backend/entities/users/members/controller.go @@ -0,0 +1,38 @@ +package members + +import ( + "net/http" + + "github.com/gofiber/fiber/v2" +) + +type UserMemberController struct { + clubMemberService UserMemberServiceInterface +} + +func NewUserMemberController(clubMemberService UserMemberServiceInterface) *UserMemberController { + return &UserMemberController{clubMemberService: clubMemberService} +} + +// GetMembership godoc +// +// @Summary Retrieve all clubs a user is a member of +// @Description Retrieves all clubs a user is a member of +// @ID get-membership +// @Tags user-member +// @Produce json +// @Param userID path string true "User ID" +// @Success 200 {object} []models.Club +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /users/{userID}/member/ [get] +func (um *UserMemberController) GetMembership(c *fiber.Ctx) error { + followers, err := um.clubMemberService.GetMembership(c.Params("userID")) + if err != nil { + return err + } + + return c.Status(http.StatusOK).JSON(followers) +} diff --git a/backend/entities/users/member/routes.go b/backend/entities/users/members/routes.go similarity index 58% rename from backend/entities/users/member/routes.go rename to backend/entities/users/members/routes.go index c1b5fb64b..d3f5bcab5 100644 --- a/backend/entities/users/member/routes.go +++ b/backend/entities/users/members/routes.go @@ -1,4 +1,4 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/types" @@ -11,6 +11,4 @@ func UserMember(userParams types.RouteParams) { userMember := userParams.Router.Group("/member") userMember.Get("/", userMemberController.GetMembership) - userMember.Post("/:clubID", userParams.AuthMiddleware.UserAuthorizeById, userMemberController.CreateMembership) - userMember.Delete("/:clubID", userParams.AuthMiddleware.UserAuthorizeById, userMemberController.DeleteMembership) } diff --git a/backend/entities/users/members/service.go b/backend/entities/users/members/service.go new file mode 100644 index 000000000..2fd30dbd4 --- /dev/null +++ b/backend/entities/users/members/service.go @@ -0,0 +1,28 @@ +package members + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" +) + +type UserMemberServiceInterface interface { + GetMembership(userID string) ([]models.Club, error) +} + +type UserMemberService struct { + types.ServiceParams +} + +func NewUserMemberService(serviceParams types.ServiceParams) UserMemberServiceInterface { + return &UserMemberService{serviceParams} +} + +func (u *UserMemberService) GetMembership(userID string) ([]models.Club, error) { + userIdAsUUID, err := utilities.ValidateID(userID) + if err != nil { + return nil, err + } + + return GetClubMembership(u.DB, *userIdAsUUID) +} diff --git a/backend/entities/users/members/transactions.go b/backend/entities/users/members/transactions.go new file mode 100644 index 000000000..de0679011 --- /dev/null +++ b/backend/entities/users/members/transactions.go @@ -0,0 +1,24 @@ +package members + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/entities/users" + + "github.com/google/uuid" + "gorm.io/gorm" +) + +func GetClubMembership(db *gorm.DB, userID uuid.UUID) ([]models.Club, error) { + var clubs []models.Club + + user, err := users.GetUser(db, userID) + if err != nil { + return nil, err + } + + if err := db.Model(&user).Association("Member").Find(&clubs); err != nil { + return nil, err + } + + return clubs, nil +} diff --git a/backend/entities/users/tag/controller.go b/backend/entities/users/tags/controller.go similarity index 67% rename from backend/entities/users/tag/controller.go rename to backend/entities/users/tags/controller.go index 5b225220e..8d34a9fd2 100644 --- a/backend/entities/users/tag/controller.go +++ b/backend/entities/users/tags/controller.go @@ -1,8 +1,9 @@ -package tag +package tags import ( - "github.com/GenerateNU/sac/backend/errors" + "net/http" + "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -23,18 +24,18 @@ func NewUserTagController(userTagService UserTagServiceInterface) *UserTagContro // @Produce json // @Param userID path string true "User ID" // @Success 200 {object} []models.Tag -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/tags/ [get] func (ut *UserTagController) GetUserTags(c *fiber.Ctx) error { tags, err := ut.userTagService.GetUserTags(c.Params("userID")) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusOK).JSON(&tags) + return c.Status(http.StatusOK).JSON(&tags) } // CreateUserTags godoc @@ -48,24 +49,24 @@ func (ut *UserTagController) GetUserTags(c *fiber.Ctx) error { // @Param userID path string true "User ID" // @Param userTagsBody body CreateUserTagsBody true "User Tags Body" // @Success 201 {object} []models.Tag -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/tags/ [post] func (ut *UserTagController) CreateUserTags(c *fiber.Ctx) error { var requestBody CreateUserTagsBody if err := c.BodyParser(&requestBody); err != nil { - return errors.FailedToParseRequestBody.FiberError(c) + return utilities.InvalidJSON() } tags, err := ut.userTagService.CreateUserTags(c.Params("userID"), requestBody) if err != nil { - return err.FiberError(c) + return err } - return c.Status(fiber.StatusCreated).JSON(&tags) + return c.Status(http.StatusCreated).JSON(&tags) } // DeleteUserTag godoc @@ -78,16 +79,16 @@ func (ut *UserTagController) CreateUserTags(c *fiber.Ctx) error { // @Produce json // @Param userID path string true "User ID" // @Success 201 -// @Failure 400 {object} errors.Error -// @Failure 401 {object} errors.Error -// @Failure 404 {object} errors.Error -// @Failure 500 {object} errors.Error +// @Failure 400 {object} error +// @Failure 401 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error // @Router /users/{userID}/tags/ [delete] func (ut *UserTagController) DeleteUserTag(c *fiber.Ctx) error { err := ut.userTagService.DeleteUserTag(c.Params("userID"), c.Params("tagID")) if err != nil { - return err.FiberError(c) + return err } - return c.SendStatus(fiber.StatusNoContent) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/users/tag/model.go b/backend/entities/users/tags/model.go similarity index 90% rename from backend/entities/users/tag/model.go rename to backend/entities/users/tags/model.go index e70a8d879..155020975 100644 --- a/backend/entities/users/tag/model.go +++ b/backend/entities/users/tags/model.go @@ -1,4 +1,4 @@ -package tag +package tags import "github.com/google/uuid" diff --git a/backend/entities/users/tag/routes.go b/backend/entities/users/tags/routes.go similarity index 97% rename from backend/entities/users/tag/routes.go rename to backend/entities/users/tags/routes.go index 620c58d11..26aaccc6c 100644 --- a/backend/entities/users/tag/routes.go +++ b/backend/entities/users/tags/routes.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/users/tag/service.go b/backend/entities/users/tags/service.go similarity index 75% rename from backend/entities/users/tag/service.go rename to backend/entities/users/tags/service.go index f0f0134c4..fb5dfed8c 100644 --- a/backend/entities/users/tag/service.go +++ b/backend/entities/users/tags/service.go @@ -1,17 +1,16 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/tags" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" ) type UserTagServiceInterface interface { - GetUserTags(id string) ([]models.Tag, *errors.Error) - CreateUserTags(id string, tagIDs CreateUserTagsBody) ([]models.Tag, *errors.Error) - DeleteUserTag(id string, tagID string) *errors.Error + GetUserTags(id string) ([]models.Tag, error) + CreateUserTags(id string, tagIDs CreateUserTagsBody) ([]models.Tag, error) + DeleteUserTag(id string, tagID string) error } type UserTagService struct { @@ -22,7 +21,7 @@ func NewUserTagService(serviceParams types.ServiceParams) UserTagServiceInterfac return &UserTagService{serviceParams} } -func (u *UserTagService) GetUserTags(id string) ([]models.Tag, *errors.Error) { +func (u *UserTagService) GetUserTags(id string) ([]models.Tag, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { return nil, err @@ -31,15 +30,15 @@ func (u *UserTagService) GetUserTags(id string) ([]models.Tag, *errors.Error) { return GetUserTags(u.DB, *idAsUUID) } -func (u *UserTagService) CreateUserTags(id string, tagIDs CreateUserTagsBody) ([]models.Tag, *errors.Error) { +func (u *UserTagService) CreateUserTags(id string, tagIDs CreateUserTagsBody) ([]models.Tag, error) { // Validate the id: idAsUUID, err := utilities.ValidateID(id) if err != nil { return nil, err } - if err := u.Validate.Struct(tagIDs); err != nil { - return nil, &errors.FailedToValidateUserTags + if err := utilities.Validate(u.Validate, tagIDs); err != nil { + return nil, err } // Retrieve a list of valid tags from the ids: @@ -52,7 +51,7 @@ func (u *UserTagService) CreateUserTags(id string, tagIDs CreateUserTagsBody) ([ return CreateUserTags(u.DB, *idAsUUID, tags) } -func (u *UserTagService) DeleteUserTag(id string, tagID string) *errors.Error { +func (u *UserTagService) DeleteUserTag(id string, tagID string) error { // Validate the userID: userIDAsUUID, err := utilities.ValidateID(id) if err != nil { diff --git a/backend/entities/users/tag/transactions.go b/backend/entities/users/tags/transactions.go similarity index 73% rename from backend/entities/users/tag/transactions.go rename to backend/entities/users/tags/transactions.go index e36b9ac6c..5a1945ed4 100644 --- a/backend/entities/users/tag/transactions.go +++ b/backend/entities/users/tags/transactions.go @@ -1,17 +1,16 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/tags" "github.com/GenerateNU/sac/backend/entities/users" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/transactions" "github.com/google/uuid" "gorm.io/gorm" ) -func GetUserTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, *errors.Error) { +func GetUserTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, error) { var tags []models.Tag user, err := users.GetUser(db, id) @@ -20,25 +19,25 @@ func GetUserTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, *errors.Error) { } if err := db.Model(&user).Association("Tag").Find(&tags); err != nil { - return nil, &errors.FailedToGetTag + return nil, err } return tags, nil } -func CreateUserTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, *errors.Error) { +func CreateUserTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, error) { user, err := users.GetUser(db, id, transactions.PreloadTag()) if err != nil { return nil, err } if err := db.Model(&user).Association("Tag").Append(tags); err != nil { - return nil, &errors.FailedToUpdateUser + return nil, err } return tags, nil } -func DeleteUserTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) *errors.Error { +func DeleteUserTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) error { user, err := users.GetUser(db, id, transactions.PreloadTag()) if err != nil { return err @@ -50,7 +49,7 @@ func DeleteUserTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) *errors.Error { } if err := db.Model(&user).Association("Tag").Delete(&tag); err != nil { - return &errors.FailedToUpdateUser + return err } return nil diff --git a/backend/entities/users/transactions.go b/backend/entities/users/transactions.go index fba6f7d09..38b093cc1 100644 --- a/backend/entities/users/transactions.go +++ b/backend/entities/users/transactions.go @@ -1,16 +1,16 @@ package users import ( - stdliberrors "errors" + "errors" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/transactions" + "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" ) -func GetUser(db *gorm.DB, id uuid.UUID, preloads ...transactions.OptionalQuery) (*models.User, *errors.Error) { +func GetUser(db *gorm.DB, id uuid.UUID, preloads ...transactions.OptionalQuery) (*models.User, error) { var user models.User query := db @@ -20,46 +20,46 @@ func GetUser(db *gorm.DB, id uuid.UUID, preloads ...transactions.OptionalQuery) } if err := query.Omit("password_hash").First(&user, id).Error; err != nil { - if stdliberrors.Is(err, gorm.ErrRecordNotFound) { - return nil, &errors.UserNotFound - } else { - return nil, &errors.FailedToGetUser + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound } + return nil, err } return &user, nil } -func GetUserByEmail(db *gorm.DB, email string) (*models.User, *errors.Error) { +func GetUserByEmail(db *gorm.DB, email string) (*models.User, error) { var user models.User if err := db.Where("email = ?", email).First(&user).Error; err != nil { - return nil, &errors.UserNotFound + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err } return &user, nil } -func UpdateEmailVerification(db *gorm.DB, id uuid.UUID) *errors.Error { +func UpdateEmailVerification(db *gorm.DB, id uuid.UUID) error { result := db.Model(&models.User{}).Where("id = ?", id).Update("is_verified", true) if result.RowsAffected == 0 { if result.Error == nil { - return &errors.UserNotFound - } else { - return &errors.FailedToUpdateEmailVerification + return utilities.ErrNotFound } + return result.Error } return nil } -func UpdatePassword(db *gorm.DB, id uuid.UUID, passwordHash string) *errors.Error { +func UpdatePassword(db *gorm.DB, id uuid.UUID, passwordHash string) error { result := db.Model(&models.User{}).Where("id = ?", id).Update("password_hash", passwordHash) if result.RowsAffected == 0 { if result.Error == nil { - return &errors.UserNotFound - } else { - return &errors.FailedToUpdateUser + return utilities.ErrNotFound } + return result.Error } return nil } diff --git a/backend/errors/auth.go b/backend/errors/auth.go deleted file mode 100644 index 83b3c46c4..000000000 --- a/backend/errors/auth.go +++ /dev/null @@ -1,114 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToExtractClaims = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to extract claims", - } - FailedToParseToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to parse token", - } - InvalidTokenType = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "invalid token type", - } - FailedToValidateUpdatePasswordBody = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate update password body", - } - FailedToCastToCustomClaims = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to cast to custom claims", - } - FailedToCreatePasswordReset = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create password reset", - } - FailedToDeletePasswordReset = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete password reset", - } - TokenExpired = Error{ - StatusCode: fiber.StatusUnauthorized, - Message: "token expired", - } - FailedToGetPasswordResetToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get password reset token", - } - FailedToGetToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get token", - } - FailedToDeleteToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete token", - } - FailedToSaveToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to save token", - } - PasswordResetTokenNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "password reset token not found", - } - TokenNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "token not found", - } - EmailAlreadyVerified = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "email already verified", - } - FailedToGenerateOTP = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to generate otp", - } - FailedToSaveOTP = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to save otp", - } - FailedToGetOTP = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get otp", - } - InvalidOTP = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "invalid otp", - } - OTPExpired = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "otp expired", - } - FailedToUpdateEmailVerification = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update email verification", - } - FailedToDeleteOTP = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete otp", - } - FailedToSendCode = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to send code", - } - OTPNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "otp not found", - } - InvalidPasswordNotLongEnough = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "password must be at least 8 characters long", - } - InvalidPasswordNoDigit = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "password must contain at least one digit", - } - InvalidPasswordNoSpecialCharacter = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "password must contain at least one special character", - } -) diff --git a/backend/errors/category.go b/backend/errors/category.go deleted file mode 100644 index cc3d4672c..000000000 --- a/backend/errors/category.go +++ /dev/null @@ -1,38 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToValidateCategory = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate category", - } - FailedToCreateCategory = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create category", - } - FailedToGetCategories = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get categories", - } - FailedToGetCategory = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get category", - } - FailedToUpdateCategory = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update category", - } - FailedToDeleteCategory = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete category", - } - CategoryAlreadyExists = Error{ - StatusCode: fiber.StatusConflict, - Message: "category already exists", - } - CategoryNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "category not found", - } -) diff --git a/backend/errors/club.go b/backend/errors/club.go deleted file mode 100644 index 826c08e4a..000000000 --- a/backend/errors/club.go +++ /dev/null @@ -1,74 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToValidateUserID = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate user id", - } - FailedToValidateClub = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate club", - } - FailedToCreateClub = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create club", - } - FailedToGetClubs = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get clubs", - } - FailedToGetClub = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get club", - } - FailedToDeleteClub = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete club", - } - FailedToUpdateClub = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update club", - } - ClubNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "club not found", - } - FailedToValidateClubTags = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate club tags", - } - FailedToGetMembers = Error{ - StatusCode: fiber.StatusNotFound, - Message: "failed to get members", - } - FailedtoGetAdminIDs = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get admin ids", - } - FailedToVectorizeClub = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to vectorize club", - } - FailedToGetClubFollowers = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get club followers", - } - FailedToGetClubMembers = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get club members", - } - FailedToGetClubEvents = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get club events", - } - FailedToJoinClub = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to join club", - } - AlreadyMemberOfClub = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "already member of club", - } -) diff --git a/backend/errors/common.go b/backend/errors/common.go deleted file mode 100644 index acf9e0906..000000000 --- a/backend/errors/common.go +++ /dev/null @@ -1,82 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToValidateAtLeastOneField = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate at least one field", - } - FailedToParseRequestBody = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "request body is not valid", - } - FailedtoParseQueryParams = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to parse query params", - } - FailedToValidateID = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate id", - } - FailedToValidateNonNegativeValue = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate non-negative value", - } - FailedToMapRequestToModel = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to map request to model", - } - InternalServerError = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "internal server error", - } - FailedToValidateLimit = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate limit", - } - FailedToValidatePage = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate page", - } - Unauthorized = Error{ - StatusCode: fiber.StatusUnauthorized, - Message: "unauthorized", - } - Forbidden = Error{ - StatusCode: fiber.StatusForbidden, - Message: "forbidden", - } - FailedToSignToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to sign token", - } - FailedToCreateAccessToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create access token", - } - FailedToCreateRefreshToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create refresh token", - } - FailedToParseRefreshToken = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to parse refresh token", - } - FailedToParseAccessToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to parse access token", - } - FailedToValidateRefreshToken = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate refresh token", - } - FailedToValidateAccessToken = Error{ - StatusCode: fiber.StatusUnauthorized, - Message: "failed to validate access token", - } - FailedToGenerateToken = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to generate token", - } -) diff --git a/backend/errors/contact.go b/backend/errors/contact.go deleted file mode 100644 index d408a5a37..000000000 --- a/backend/errors/contact.go +++ /dev/null @@ -1,30 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToGetContacts = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get contacts", - } - FailedToGetContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get contact", - } - ContactNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "contact not found", - } - FailedToPutContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to put contact", - } - FailedToDeleteContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete contact", - } - FailedToValidateContact = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate contact", - } -) diff --git a/backend/errors/error.go b/backend/errors/error.go deleted file mode 100644 index ee5035f4e..000000000 --- a/backend/errors/error.go +++ /dev/null @@ -1,18 +0,0 @@ -package errors - -import ( - "github.com/gofiber/fiber/v2" -) - -type Error struct { - StatusCode int - Message string -} - -func (e *Error) FiberError(c *fiber.Ctx) error { - return c.Status(e.StatusCode).JSON(fiber.Map{"error": e.Message}) -} - -func (e *Error) Error() string { - return e.Message -} diff --git a/backend/errors/event.go b/backend/errors/event.go deleted file mode 100644 index e5b11b2a6..000000000 --- a/backend/errors/event.go +++ /dev/null @@ -1,66 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToValidateEvent = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate event", - } - FailedToValidateEventSeries = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate event series", - } - FailedToCreateEvent = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create event", - } - FailedToCreateEventSeries = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create event series", - } - FailedToGetEventSeries = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get event series", - } - FailedToGetEvents = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get events", - } - FailedToGetEvent = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get event", - } - FailedToDeleteEvent = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete event", - } - FailedToDeleteSeries = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete series", - } - FailedToUpdateEvent = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update event", - } - FailedToUpdateSeries = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update series", - } - EventNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "event not found", - } - SeriesNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "series not found", - } - FailedToUpdateEventSeries = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update event series", - } - FailedToGetEventHosts = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get event hosts", - } -) diff --git a/backend/errors/file.go b/backend/errors/file.go deleted file mode 100644 index 00d57d266..000000000 --- a/backend/errors/file.go +++ /dev/null @@ -1,106 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToValidateFileId = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to validate file id", - } - InvalidFileSize = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "file size is greater than 5 MB", - } - InvalidFileType = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "invalid file type", - } - FileNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "file not found", - } - FailedToCreateAWSSession = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create AWS session", - } - FailedToUpdateFile = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update file", - } - FailedToUploadFile = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to upload file", - } - FailedToCreateFileInDB = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create file in database", - } - FailedToCreateFile = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create file", - } - FailedToDeleteFile = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete file", - } - FailedToReadFile = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to read file", - } - FailedToValidateFile = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate file", - } - FailedToGetFiles = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get files", - } - FailedToGetFile = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to get file", - } - FailedToProcessRequest = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to process the request", - } - FailedToValidatedData = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate data", - } - FailedToOpenFile = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to open file", - } - InvalidImageFormat = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "invalid image format", - } - FailedToDownloadFile = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to download the file", - } - InvalidAssociationType = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "invalid association type", - } - FailedToFindAssociationID = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to find association ID", - } - FailedToParseDaysToInt = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to parse days to int", - } - FailedToGetSignedURL = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get signed URL", - } - InvalidFileID = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "invalid file id", - } - CannotFindFile = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "unable to find file", - } -) diff --git a/backend/errors/point_of_contact.go b/backend/errors/point_of_contact.go deleted file mode 100644 index 7ec6596b2..000000000 --- a/backend/errors/point_of_contact.go +++ /dev/null @@ -1,78 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToUpsertPointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update or insert point of contact", - } - FailedToGetAllPointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get all point of contact", - } - FailedToGetClubPointOfContacts = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get club point of contacts", - } - FailedToUpdateClubPointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update club point of contact", - } - FailedToGetClubPointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get club point of contact", - } - FailedToDeleteClubPointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete club point of contact", - } - PointOfContactNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "point of contact not found", - } - PointOfContactsNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "point of contact not found", - } - FailedToDeletePointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete point of contact", - } - PointOfContactAlreadyExists = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "point of contact already exists", - } - FailedToValidatePointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to validate point of contact", - } - FailedToCreatePointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create point of contact", - } - FailedToValidateEmail = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate email", - } - FailedToMapResponseToModel = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to map response to model", - } - FailedToGetAPointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get a point of contact", - } - FailedToGetPointOfContacts = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get point of contacts", - } - FailedToValidatePointOfContactId = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate point of contact id", - } - FailedToGetPointOfContact = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get point of contact", - } -) diff --git a/backend/errors/search.go b/backend/errors/search.go deleted file mode 100644 index a9bb62328..000000000 --- a/backend/errors/search.go +++ /dev/null @@ -1,38 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - ClubSeedingFailed = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to seed pinecone with clubs", - } - FailedToCreateEmbedding = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create embedding from string", - } - FailedToCreateModeration = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create moderation from string", - } - FailedToUpsertToPinecone = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to upsert to pinecone", - } - FailedToDeleteToPinecone = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete from pinecone", - } - ItemsMustHaveSameNamespace = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "items being deleted have differing namespaces", - } - FailedToSearchToPinecone = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to search on pinecone", - } - PotentiallyHarmfulSearch = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "detected potentially harmful content", - } -) diff --git a/backend/errors/tag.go b/backend/errors/tag.go deleted file mode 100644 index 9e67a0a7c..000000000 --- a/backend/errors/tag.go +++ /dev/null @@ -1,34 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToValidateTag = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate tag", - } - FailedToCreateTag = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create tag", - } - FailedToGetTags = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get tags", - } - FailedToGetTag = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get tag", - } - FailedToUpdateTag = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update tag", - } - FailedToDeleteTag = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete tag", - } - TagNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "tag not found", - } -) diff --git a/backend/errors/user.go b/backend/errors/user.go deleted file mode 100644 index bed706f4f..000000000 --- a/backend/errors/user.go +++ /dev/null @@ -1,74 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToValidateUser = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate user", - } - FailedToValidateUserTags = Error{ - StatusCode: fiber.StatusBadRequest, - Message: "failed to validate user tags", - } - FailedToCreateUser = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to create user", - } - FailedToUpdateUser = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update user", - } - FailedToGetUsers = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get users", - } - FailedToGetUser = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get user", - } - FailedToDeleteUser = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to delete user", - } - UserAlreadyExists = Error{ - StatusCode: fiber.StatusConflict, - Message: "user already exists", - } - UserNotFound = Error{ - StatusCode: fiber.StatusNotFound, - Message: "user not found", - } - FailedToComputePasswordHash = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to compute password hash", - } - FailedToFindUsersByEmail = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get users by email", - } - FailedToGetUserMemberships = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get user memberships", - } - UserNotMemberOfClub = Error{ - StatusCode: fiber.StatusNotFound, - Message: "user not member of club", - } - FailedToGetUserFollowing = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get user following", - } - UserNotFollowingClub = Error{ - StatusCode: fiber.StatusNotFound, - Message: "user not following club", - } - FailedToUpdatePassword = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to update password", - } - FailedToFollowClub = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to follow club", - } -) diff --git a/backend/errors/verification.go b/backend/errors/verification.go deleted file mode 100644 index 1b4bfced3..000000000 --- a/backend/errors/verification.go +++ /dev/null @@ -1,14 +0,0 @@ -package errors - -import "github.com/gofiber/fiber/v2" - -var ( - FailedToGetTemplate = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to get template", - } - FailedToSendEmail = Error{ - StatusCode: fiber.StatusInternalServerError, - Message: "failed to send email", - } -) diff --git a/backend/extractors/series.go b/backend/extractors/series.go new file mode 100644 index 000000000..3931149f7 --- /dev/null +++ b/backend/extractors/series.go @@ -0,0 +1,16 @@ +package extractors + +import ( + "github.com/GenerateNU/sac/backend/entities/events" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func GetSeriesHost(db *gorm.DB, seriesID uuid.UUID) (*uuid.UUID, error) { + event, err := events.GetFirstEventInSeries(db, seriesID) + if err != nil { + return nil, err + } + + return event.Host, nil +} diff --git a/backend/go.mod b/backend/go.mod index 9213239be..f3312a02b 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,10 +3,12 @@ module github.com/GenerateNU/sac/backend go 1.22.2 require ( + github.com/a-h/templ v0.2.680 github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 - github.com/aws/aws-sdk-go v1.51.30 + github.com/aws/aws-sdk-go v1.53.0 + github.com/garrettladley/fiberpaginate v1.0.1 github.com/garrettladley/mattress v0.4.0 - github.com/go-playground/validator/v10 v10.19.0 + github.com/go-playground/validator/v10 v10.20.0 github.com/goccy/go-json v0.10.2 github.com/gofiber/fiber/v2 v2.52.4 github.com/gofiber/swagger v1.0.0 @@ -16,14 +18,13 @@ require ( github.com/huandu/go-assert v1.1.6 github.com/joho/godotenv v1.5.1 github.com/mcnijman/go-emailaddress v1.1.1 - github.com/mitchellh/mapstructure v1.5.0 - github.com/redis/go-redis/v9 v9.5.1 github.com/resend/resend-go/v2 v2.6.0 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/viper v1.18.2 github.com/swaggo/swag v1.16.3 - golang.org/x/crypto v0.22.0 - golang.org/x/text v0.14.0 + go.opentelemetry.io/otel/sdk v1.26.0 + golang.org/x/crypto v0.23.0 + golang.org/x/text v0.15.0 gorm.io/driver/postgres v1.5.7 gorm.io/gorm v1.25.10 ) @@ -40,13 +41,17 @@ require ( ) require ( - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/lib/pq v1.10.9 // indirect - go.uber.org/atomic v1.9.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + go.opentelemetry.io/contrib v1.17.0 // indirect + go.opentelemetry.io/otel/metric v1.26.0 // indirect + go.opentelemetry.io/otel/trace v1.26.0 // indirect + go.uber.org/atomic v1.11.0 // indirect ) require ( @@ -61,6 +66,8 @@ require ( github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 + github.com/gofiber/contrib/otelfiber v1.0.10 github.com/golang-migrate/migrate/v4 v4.17.1 github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -91,10 +98,12 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.52.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect + go.opentelemetry.io/otel v1.26.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/tools v0.20.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/backend/go.sum b/backend/go.sum index 3e230ac48..66a022fc6 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -4,6 +4,8 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/a-h/templ v0.2.680 h1:TflYFucxp5rmOxAXB9Xy3+QHTk8s8xG9+nCT/cLzjeE= +github.com/a-h/templ v0.2.680/go.mod h1:NQGQOycaPKBxRB14DmAaeIpcGC1AOBPJEMO4ozS7m90= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= @@ -12,14 +14,8 @@ github.com/awnumar/memcall v0.2.0 h1:sRaogqExTOOkkNwO9pzJsL8jrOV29UuUW7teRMfbqtI github.com/awnumar/memcall v0.2.0/go.mod h1:S911igBPR9CThzd/hYQQmTc9SWNu3ZHIlCGaWsWsoJo= github.com/awnumar/memguard v0.22.5 h1:PH7sbUVERS5DdXh3+mLo8FDcl1eIeVjJVYMnyuYpvuI= github.com/awnumar/memguard v0.22.5/go.mod h1:+APmZGThMBWjnMlKiSM1X7MVpbIVewen2MTkqWkA/zE= -github.com/aws/aws-sdk-go v1.51.30 h1:RVFkjn9P0JMwnuZCVH0TlV5k9zepHzlbc4943eZMhGw= -github.com/aws/aws-sdk-go v1.51.30/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= -github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= -github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/aws/aws-sdk-go v1.53.0 h1:MMo1x1ggPPxDfHMXJnQudTbGXYlD4UigUAud1DJxPVo= +github.com/aws/aws-sdk-go v1.53.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -42,8 +38,15 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/garrettladley/fiberpaginate v1.0.1 h1:Ren6wx8L8KLcPvCKUkgRuaZaxX7CjCCoPhCUytnrGyk= +github.com/garrettladley/fiberpaginate v1.0.1/go.mod h1:MHVWGQkhtnt2kE8F0wkTF5iUQOyqZlRktfcGgBLRBv0= github.com/garrettladley/mattress v0.4.0 h1:ZB3iqyc5q6bqIryNfsh2FMcbMdnV1XEryvqivouceQE= github.com/garrettladley/mattress v0.4.0/go.mod h1:OWKIRc9wC3gtD3Ng/nUuNEiR1TJvRYLmn/KZYw9nl5Q= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -58,10 +61,14 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= -github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gofiber/contrib/otelfiber v1.0.10 h1:Bu28Pi4pfYmGfIc/9+sNaBbFwTHGY/zpSIK5jBxuRtM= +github.com/gofiber/contrib/otelfiber v1.0.10/go.mod h1:jN6AvS1HolDHTQHFURsV+7jSX96FpXYeKH6nmkq8AIw= github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gofiber/swagger v1.0.0 h1:BzUzDS9ZT6fDUa692kxmfOjc1DZiloLiPK/W5z1H1tc= @@ -72,8 +79,8 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4= github.com/golang-migrate/migrate/v4 v4.17.1/go.mod h1:m8hinFyWBn0SA4QKHuKh175Pm9wjmxj3S2Mia7dbXzM= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= @@ -213,12 +220,30 @@ github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7g github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.opentelemetry.io/contrib v1.17.0 h1:lJJdtuNsP++XHD7tXDYEFSpsqIc7DzShuXMR5PwkmzA= +go.opentelemetry.io/contrib v1.17.0/go.mod h1:gIzjwWFoGazJmtCaDgViqOSJPde2mCWzv60o0bWPcZs= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= +go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= +go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 h1:0W5o9SzoR15ocYHEQfvfipzcNog1lBxOLfnex91Hk6s= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0/go.mod h1:zVZ8nz+VSggWmnh6tTsJqXQ7rU4xLwRtna1M4x5jq58= +go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= +go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= +go.opentelemetry.io/otel/oteltest v1.0.0-RC3 h1:MjaeegZTaX0Bv9uB9CrdVjOFM/8slRjReoWoV9xDCpY= +go.opentelemetry.io/otel/oteltest v1.0.0-RC3/go.mod h1:xpzajI9JBRr7gX63nO6kAmImmYIAtuQblZ36Z+LfCjE= +go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= +go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= +go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= +go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= @@ -231,10 +256,10 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/backend/integrations/email/email.go b/backend/integrations/email/email.go index 5ea9ea4b1..b4bcc8601 100644 --- a/backend/integrations/email/email.go +++ b/backend/integrations/email/email.go @@ -1,21 +1,25 @@ package email import ( + "bytes" + "context" "fmt" - "os" "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/templates/emails" + + "github.com/a-h/templ" + "github.com/afex/hystrix-go/hystrix" "github.com/resend/resend-go/v2" ) type EmailClientInterface interface { - SendPasswordResetEmail(name, email, token string) *errors.Error - SendEmailVerification(email, code string) *errors.Error - SendWelcomeEmail(name, email string) *errors.Error - SendPasswordChangedEmail(name, email string) *errors.Error + SendPasswordResetEmail(name string, email string, token string) error + SendEmailVerification(email string, code string) error + SendWelcomeEmail(name string, email string) error + SendPasswordChangedEmail(name string, email string) error } type ResendClient struct { @@ -36,90 +40,59 @@ func NewResendClient(settings config.ResendSettings, dev bool) EmailClientInterf } } -func send(email, subject, html string, client *resend.Client) *errors.Error { +func send(fromEmail string, toEmail string, subject string, template templ.Component, client *resend.Client) error { + buffer := new(bytes.Buffer) + err := template.Render(context.Background(), buffer) + if err != nil { + return fmt.Errorf("failed to render email template: %w", err) + } + params := &resend.SendEmailRequest{ - From: "onboarding" + constants.DOMAIN, - To: []string{email}, + From: fromEmail, + To: []string{toEmail}, Subject: subject, - Html: html, + Html: buffer.String(), } - err := hystrix.Do("send-email", func() error { + err = hystrix.Do("send-email", func() error { _, err := client.Emails.Send(params) return err }, nil) if err != nil { - return &errors.FailedToSendEmail + return fmt.Errorf("failed to send email: %w", err) } return nil } -func (r *ResendClient) SendPasswordResetEmail(name, email, token string) *errors.Error { +func (r *ResendClient) SendPasswordResetEmail(name string, email string, token string) error { if r.Dev { return nil } - template, err := getTemplateString("password_reset") - if err != nil { - return &errors.FailedToGetTemplate - } - - return send(email, "Password Reset", fmt.Sprintf(*template, name, token), r.Client) + return send(constants.DEFAULT_FROM_EMAIL, email, "Password Reset", emails.PasswordReset(name, fmt.Sprintf("https://hipponeu.com/reset/%s", token)), r.Client) } -func (r *ResendClient) SendEmailVerification(email, code string) *errors.Error { +func (r *ResendClient) SendEmailVerification(email string, code string) error { if r.Dev { return nil } - template, err := getTemplateString("email_verification") - if err != nil { - return &errors.FailedToGetTemplate - } - - return send(email, "Email Verification", fmt.Sprintf(*template, code), r.Client) + return send(constants.DEFAULT_FROM_EMAIL, email, "Email Verification", emails.Verification(code), r.Client) } -func (r *ResendClient) SendWelcomeEmail(name, email string) *errors.Error { +func (r *ResendClient) SendWelcomeEmail(name string, email string) error { if r.Dev { return nil } - template, err := getTemplateString("welcome") - if err != nil { - return &errors.FailedToGetTemplate - } - - return send(email, "Welcome to Resend", fmt.Sprintf(*template, name), r.Client) + return send(constants.ONBOARDING_EMAIL, email, "Welcome to Hippo", emails.Welcome(name), r.Client) } -func (r *ResendClient) SendPasswordChangedEmail(name, email string) *errors.Error { +func (r *ResendClient) SendPasswordChangedEmail(name string, email string) error { if r.Dev { return nil } - template, err := getTemplateString("password_change_complete") - if err != nil { - return &errors.FailedToGetTemplate - } - - return send(email, "Password Changed", fmt.Sprintf(*template, name), r.Client) -} - -func getTemplateString(name string) (*string, error) { - // TODO: use default file location - cwd, err := os.Getwd() - if err != nil { - return nil, err - } - - htmlBytes, err := os.ReadFile(fmt.Sprintf("%v/templates/emails/%s.html", cwd, name)) - if err != nil { - return nil, err - } - - htmlString := string(htmlBytes) - - return &htmlString, nil + return send(constants.DEFAULT_FROM_EMAIL, email, "Password Changed", emails.PasswordChangeComplete(name), r.Client) } diff --git a/backend/integrations/file/file.go b/backend/integrations/file/file.go index c9c485289..f47e13f4e 100644 --- a/backend/integrations/file/file.go +++ b/backend/integrations/file/file.go @@ -2,6 +2,7 @@ package file import ( "bytes" + "errors" "fmt" "io" "mime/multipart" @@ -10,7 +11,7 @@ import ( "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/constants" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" @@ -32,8 +33,8 @@ const ( type FileClientInterface interface { GetFileURL(fileURL string) *string - UploadFile(folder string, fileHeader *multipart.FileHeader, allowedTypes []FileType) (*models.FileInfo, *errors.Error) - DeleteFile(fileURL string) *errors.Error + UploadFile(folder string, fileHeader *multipart.FileHeader, allowedTypes []FileType) (*models.FileInfo, error) + DeleteFile(fileURL string) error } type AWSClient struct { @@ -58,23 +59,22 @@ func (aw *AWSClient) GetFileURL(fileURL string) *string { return &fileURL } -func preProcessFile(fileHeader *multipart.FileHeader) (*string, []byte, *errors.Error) { +func preProcessFile(fileHeader *multipart.FileHeader) (*string, []byte, error) { if fileHeader.Size > constants.MAX_FILE_SIZE { - return nil, nil, &errors.InvalidFileSize + return nil, nil, errors.New("file size is too large") } file, err := fileHeader.Open() if err != nil { - return nil, nil, &errors.FailedToOpenFile + return nil, nil, errors.New("failed to open file") } + defer file.Close() fileBytes, err := io.ReadAll(file) if err != nil { - return nil, nil, &errors.FailedToReadFile + return nil, nil, errors.New("failed to read file") } - defer file.Close() - fileName := generateUniqueFileName(fileHeader.Filename) return &fileName, fileBytes, nil @@ -106,10 +106,10 @@ func isFileTypeAllowed(fileType string, allowedTypes []FileType) bool { return false } -func (aw *AWSClient) UploadFile(folder string, fileHeader *multipart.FileHeader, allowedTypes []FileType) (*models.FileInfo, *errors.Error) { +func (aw *AWSClient) UploadFile(folder string, fileHeader *multipart.FileHeader, allowedTypes []FileType) (*models.FileInfo, error) { fileType := fileHeader.Header.Get("Content-Type") if !isFileTypeAllowed(fileType, allowedTypes) { - return nil, &errors.InvalidFileType + return nil, errors.New("file type is not allowed") } fileName, file, err := preProcessFile(fileHeader) @@ -122,26 +122,25 @@ func (aw *AWSClient) UploadFile(folder string, fileHeader *multipart.FileHeader, bucket := aw.Settings.BUCKET_NAME.Expose() key := fmt.Sprintf("%s/%s", folder, *fileName) - _, s3Err := svc.PutObject(&s3.PutObjectInput{ + _, err = svc.PutObject(&s3.PutObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), Body: bytes.NewReader(file), }) - if s3Err != nil { - return nil, &errors.FailedToUploadFile + if err != nil { + return nil, fmt.Errorf("failed to upload file: %s", err) } - fileURL := fmt.Sprintf("https://s3.amazonaws.com/%s/%s", bucket, key) return &models.FileInfo{ FileName: *fileName, FileType: fileHeader.Header.Get("Content-Type"), FileSize: int(fileHeader.Size), - FileURL: fileURL, + FileURL: fmt.Sprintf("https://s3.amazonaws.com/%s/%s", bucket, key), ObjectKey: key, }, nil } -func (aw *AWSClient) DeleteFile(fileURL string) *errors.Error { +func (aw *AWSClient) DeleteFile(fileURL string) error { svc := s3.New(aw.session) bucket := aw.Settings.BUCKET_NAME.Expose() @@ -152,7 +151,7 @@ func (aw *AWSClient) DeleteFile(fileURL string) *errors.Error { Key: aws.String(key), }) if err != nil { - return &errors.FailedToDeleteFile + return fmt.Errorf("failed to delete file: %s", err) } return nil diff --git a/backend/integrations/search/README.md b/backend/integrations/search/README.md index 0e7fe43b5..f6e293b6d 100644 --- a/backend/integrations/search/README.md +++ b/backend/integrations/search/README.md @@ -54,9 +54,9 @@ type Searchable interface { // in backend/src/search/pinecone.go type PineconeClientInterface interface { - Upsert(item Searchable) *errors.Error - Delete(item Searchable) *errors.Error - Search(item Searchable, topK int) ([]string, *errors.Error) + Upsert(item Searchable) error + Delete(item Searchable) error + Search(item Searchable, topK int) ([]string, error) } ``` diff --git a/backend/integrations/search/ai.go b/backend/integrations/search/ai.go index 10d802efe..cc84d26ff 100644 --- a/backend/integrations/search/ai.go +++ b/backend/integrations/search/ai.go @@ -2,19 +2,21 @@ package search import ( "bytes" + "errors" + "fmt" "net/http" "github.com/goccy/go-json" "github.com/GenerateNU/sac/backend/config" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) type AIClientInterface interface { - CreateEmbedding(items []Searchable) ([]Embedding, *errors.Error) - CreateModeration(items []Searchable) ([]ModerationResult, *errors.Error) + CreateEmbedding(items []Searchable) ([]Embedding, error) + CreateModeration(items []Searchable) ([]ModerationResult, error) } type OpenAIClient struct { @@ -38,7 +40,7 @@ type CreateEmbeddingResponseBody struct { Data []Embedding `json:"data"` } -func (c *OpenAIClient) CreateEmbedding(items []Searchable) ([]Embedding, *errors.Error) { +func (c *OpenAIClient) CreateEmbedding(items []Searchable) ([]Embedding, error) { embeddingStrings := make([]string, len(items)) for i, item := range items { embeddingStrings[i] = item.EmbeddingString() @@ -50,14 +52,14 @@ func (c *OpenAIClient) CreateEmbedding(items []Searchable) ([]Embedding, *errors Model: "text-embedding-ada-002", }) if err != nil { - return nil, &errors.FailedToCreateEmbedding + return nil, fmt.Errorf("failed to create embedding request body: %w", err) } req, err := http.NewRequest(fiber.MethodPost, "https://api.openai.com/v1/embeddings", bytes.NewBuffer(embeddingBody)) if err != nil { - return nil, &errors.FailedToCreateEmbedding + return nil, fmt.Errorf("failed to create embedding: %w", err) } req = utilities.ApplyModifiers(req, @@ -67,20 +69,19 @@ func (c *OpenAIClient) CreateEmbedding(items []Searchable) ([]Embedding, *errors resp, err := http.DefaultClient.Do(req) if err != nil { - return nil, &errors.FailedToCreateEmbedding + return nil, fmt.Errorf("failed to create embedding: %w", err) } - defer resp.Body.Close() var embeddingResultBody CreateEmbeddingResponseBody err = json.NewDecoder(resp.Body).Decode(&embeddingResultBody) if err != nil { - return nil, &errors.FailedToCreateEmbedding + return nil, fmt.Errorf("failed to create embedding: %w", err) } if len(embeddingResultBody.Data) < 1 { - return nil, &errors.FailedToCreateEmbedding + return nil, fmt.Errorf("failed to create embedding: %w", err) } return embeddingResultBody.Data, nil @@ -99,7 +100,7 @@ type ModerationResult struct { Flagged bool `json:"flagged"` } -func (c *OpenAIClient) CreateModeration(items []Searchable) ([]ModerationResult, *errors.Error) { +func (c *OpenAIClient) CreateModeration(items []Searchable) ([]ModerationResult, error) { searchStrings := make([]string, len(items)) for i, item := range items { searchStrings[i] = item.EmbeddingString() @@ -111,14 +112,14 @@ func (c *OpenAIClient) CreateModeration(items []Searchable) ([]ModerationResult, Model: "text-moderation-stable", }) if err != nil { - return nil, &errors.FailedToCreateModeration + return nil, fmt.Errorf("failed to create moderation request body: %w", err) } req, err := http.NewRequest(fiber.MethodPost, "https://api.openai.com/v1/moderations", bytes.NewBuffer(moderationBody)) if err != nil { - return nil, &errors.FailedToCreateModeration + return nil, fmt.Errorf("failed to create moderation: %w", err) } req = utilities.ApplyModifiers(req, @@ -128,20 +129,19 @@ func (c *OpenAIClient) CreateModeration(items []Searchable) ([]ModerationResult, resp, err := http.DefaultClient.Do(req) if err != nil { - return nil, &errors.FailedToCreateModeration + return nil, fmt.Errorf("failed to create moderation: %w", err) } - defer resp.Body.Close() var moderationResultBody CreateModerationResponseBody err = json.NewDecoder(resp.Body).Decode(&moderationResultBody) if err != nil { - return nil, &errors.FailedToCreateModeration + return nil, fmt.Errorf("failed to create moderation: %w", err) } if len(moderationResultBody.Results) < 1 { - return nil, &errors.FailedToCreateModeration + return nil, errors.New("failed to create moderation") } return moderationResultBody.Results, nil diff --git a/backend/integrations/search/search.go b/backend/integrations/search/search.go index 07def1017..52ad00f79 100644 --- a/backend/integrations/search/search.go +++ b/backend/integrations/search/search.go @@ -15,15 +15,15 @@ import ( "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/constants" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" + "github.com/GenerateNU/sac/backend/utilities" ) type SearchClientInterface interface { - Seed(db *gorm.DB) *errors.Error - Upsert(items []Searchable) *errors.Error - Delete(items []Searchable) *errors.Error - Search(item Searchable) ([]string, *errors.Error) + Seed(db *gorm.DB) error + Upsert(items []Searchable) error + Delete(items []Searchable) error + Search(item Searchable) ([]string, error) } type PineconeClient struct { @@ -41,11 +41,11 @@ func NewPineconeClient(aiClient AIClientInterface, pineconeSettings config.Pinec } // Seeds the pinecone index with the clubs currently in the database. -func (c *PineconeClient) Seed(db *gorm.DB) *errors.Error { +func (c *PineconeClient) Seed(db *gorm.DB) error { var clubs []models.Club if err := db.Find(&clubs).Error; err != nil { - return &errors.ClubSeedingFailed + return fmt.Errorf("failed to get clubs from database: %w", err) } searchables := make([]Searchable, len(clubs)) @@ -70,7 +70,7 @@ func (c *PineconeClient) Seed(db *gorm.DB) *errors.Error { log.Info("Uploading chunk #%d (of %d) to pinecone...\n", index+1, len(chunks)) err := c.Upsert(chunk) if err != nil { - return &errors.ClubSeedingFailed + return fmt.Errorf("failed to seed pinecone index: %w", err) } } @@ -96,14 +96,14 @@ type PineconeUpsertRequestBody struct { } // Inserts the given list of searchables to the Pinecone index. -func (c *PineconeClient) Upsert(items []Searchable) *errors.Error { +func (c *PineconeClient) Upsert(items []Searchable) error { if len(items) == 0 { return nil } embeddings, embeddingErr := c.aiClient.CreateEmbedding(items) if embeddingErr != nil { - return &errors.FailedToUpsertToPinecone + return fmt.Errorf("failed to create embeddings: %w", embeddingErr) } vectors := []Vector{} @@ -120,26 +120,26 @@ func (c *PineconeClient) Upsert(items []Searchable) *errors.Error { Namespace: items[0].Namespace(), }) if err != nil { - return &errors.FailedToUpsertToPinecone + return fmt.Errorf("failed to marshal upsert body: %w", err) } req, err := http.NewRequest(fiber.MethodPost, fmt.Sprintf("%s/vectors/upsert", c.PineconeSettings.IndexHost.Expose()), bytes.NewBuffer(upsertBody)) if err != nil { - return &errors.FailedToUpsertToPinecone + return fmt.Errorf("failed to create upsert request: %w", err) } req = pineconeRequest(c.PineconeSettings, req) resp, err := http.DefaultClient.Do(req) if err != nil { - return &errors.FailedToUpsertToPinecone + return fmt.Errorf("failed to upsert to pinecone: %w", err) } defer resp.Body.Close() - if resp.StatusCode != fiber.StatusOK { - return &errors.FailedToUpsertToPinecone + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("failed to upsert to pinecone: %s", resp.Status) } return nil @@ -152,7 +152,7 @@ type PineconeDeleteRequestBody struct { } // Deletes the given list of searchables from the Pinecone index. -func (c *PineconeClient) Delete(items []Searchable) *errors.Error { +func (c *PineconeClient) Delete(items []Searchable) error { if len(items) == 0 { return nil } @@ -161,7 +161,7 @@ func (c *PineconeClient) Delete(items []Searchable) *errors.Error { namespace := items[0].Namespace() for _, item := range items { if item.Namespace() != namespace { - return &errors.ItemsMustHaveSameNamespace + return fmt.Errorf("all items must be in the same namespace. item %s is in namespace %s, but expected %s", item.SearchId(), item.Namespace(), namespace) } } @@ -177,25 +177,26 @@ func (c *PineconeClient) Delete(items []Searchable) *errors.Error { DeleteAll: false, }) if err != nil { - return &errors.FailedToDeleteToPinecone + return fmt.Errorf("failed to marshal delete body: %w", err) } req, err := http.NewRequest(fiber.MethodPost, fmt.Sprintf("%s/vectors/delete", c.PineconeSettings.IndexHost.Expose()), bytes.NewBuffer(deleteBody)) if err != nil { - return &errors.FailedToDeleteToPinecone + return fmt.Errorf("failed to create delete request: %w", err) } req = pineconeRequest(c.PineconeSettings, req) resp, err := http.DefaultClient.Do(req) if err != nil { - return &errors.FailedToDeleteToPinecone + return fmt.Errorf("failed to delete from pinecone: %w", err) } + defer resp.Body.Close() - if resp.StatusCode != fiber.StatusOK { - return &errors.FailedToDeleteToPinecone + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("failed to delete from pinecone: %s", resp.Status) } return nil @@ -222,19 +223,19 @@ type PineconeSearchResponseBody struct { // Runs a search on the Pinecone index given a searchable item, and returns the topK most similar // elements' ids. -func (c *PineconeClient) Search(item Searchable) ([]string, *errors.Error) { - moderation, _err := c.aiClient.CreateModeration([]Searchable{item}) - if _err != nil { - return []string{}, _err +func (c *PineconeClient) Search(item Searchable) ([]string, error) { + moderation, err := c.aiClient.CreateModeration([]Searchable{item}) + if err != nil { + return []string{}, err } if moderation[0].Flagged { - return []string{}, &errors.PotentiallyHarmfulSearch + return []string{}, utilities.BadRequest(fmt.Errorf("potentially harmful content detected in item %s", item)) } - values, embeddingErr := c.aiClient.CreateEmbedding([]Searchable{item}) - if embeddingErr != nil { - return []string{}, embeddingErr + values, err := c.aiClient.CreateEmbedding([]Searchable{item}) + if err != nil { + return []string{}, err } searchBody, err := json.Marshal( @@ -247,33 +248,32 @@ func (c *PineconeClient) Search(item Searchable) ([]string, *errors.Error) { Namespace: item.Namespace(), }) if err != nil { - return []string{}, &errors.FailedToSearchToPinecone + return []string{}, fmt.Errorf("failed to marshal search body: %w", err) } req, err := http.NewRequest(fiber.MethodPost, fmt.Sprintf("%s/query", c.PineconeSettings.IndexHost.Expose()), bytes.NewBuffer(searchBody)) if err != nil { - return []string{}, &errors.FailedToSearchToPinecone + return []string{}, fmt.Errorf("failed to create search request: %w", err) } req = pineconeRequest(c.PineconeSettings, req) resp, err := http.DefaultClient.Do(req) if err != nil { - return []string{}, &errors.FailedToSearchToPinecone + return []string{}, fmt.Errorf("failed to search to pinecone: %w", err) } - defer resp.Body.Close() - if resp.StatusCode != fiber.StatusOK { - return []string{}, &errors.FailedToSearchToPinecone + if resp.StatusCode != http.StatusOK { + return []string{}, fmt.Errorf("failed to search to pinecone: %w", err) } var results PineconeSearchResponseBody err = json.NewDecoder(resp.Body).Decode(&results) if err != nil { - return []string{}, &errors.FailedToSearchToPinecone + return []string{}, fmt.Errorf("failed to decode search response: %w", err) } resultsToReturn := []string{} diff --git a/backend/main.go b/backend/main.go index 576ab6feb..87113b713 100644 --- a/backend/main.go +++ b/backend/main.go @@ -1,8 +1,10 @@ package main import ( + "context" "flag" "fmt" + "log/slog" "net" "os" "path/filepath" @@ -15,42 +17,12 @@ import ( "github.com/GenerateNU/sac/backend/integrations/file" "github.com/GenerateNU/sac/backend/integrations/search" "github.com/GenerateNU/sac/backend/server" + "github.com/GenerateNU/sac/backend/telemetry" "github.com/GenerateNU/sac/backend/tests/api/mocks" + "go.opentelemetry.io/otel" ) -func CheckServerRunning(host string, port uint16) error { - address := fmt.Sprintf("%s:%d", host, port) - conn, err := net.Dial("tcp", address) - if err != nil { - return err - } - defer conn.Close() - return nil -} - -func Exit(format string, a ...interface{}) { - fmt.Fprintf(os.Stderr, format, a...) - os.Exit(0) -} - -func configureIntegrations(config *config.Settings, connectToPinecone bool) integrations.Integrations { - openAi := search.NewOpenAIClient(config.OpenAISettings) - var pinecone search.SearchClientInterface - - if connectToPinecone { - pinecone = search.NewPineconeClient(openAi, config.PineconeSettings) - } else { - pinecone = mocks.NewPineconeMockClient() - } - - integrations := integrations.Integrations{ - File: file.NewAWSProvider(config.AWS), - AI: openAi, - Email: email.NewResendClient(config.ResendSettings, true), - Search: pinecone, - } - return integrations -} +var tracer = otel.Tracer("sac") func main() { onlyMigrate := flag.Bool("only-migrate", false, "Specify if you want to only perform the database migration") @@ -63,17 +35,17 @@ func main() { config, err := config.GetConfiguration(*configPath, *useDevDotEnv) if err != nil { - Exit("Error getting configuration: %s", err.Error()) + exit("Error getting configuration: %s", err.Error()) } - err = CheckServerRunning(config.Application.Host, config.Application.Port) + err = checkServerRunning(config.Application.Host, config.Application.Port) if err == nil { - Exit("A server is already running on %s:%d.\n", config.Application.Host, config.Application.Port) + exit("A server is already running on %s:%d.\n", config.Application.Host, config.Application.Port) } db, err := database.ConfigureDB(*config) if err != nil { - Exit("Error migrating database: %s", err.Error()) + exit("Error migrating database: %s", err.Error()) } if *onlyMigrate { @@ -81,27 +53,71 @@ func main() { } if *onlySeedPinecone { - openAi := search.NewOpenAIClient(config.OpenAISettings) - pinecone := search.NewPineconeClient(openAi, config.PineconeSettings) + openAi := search.NewOpenAIClient(config.OpenAI) + pinecone := search.NewPineconeClient(openAi, config.Pinecone) err := pinecone.Seed(db) if err != nil { - Exit("Error seeding PineconeDB: %s\n", err.Error()) + exit("Error seeding PineconeDB: %s\n", err.Error()) } return } err = database.ConnPooling(db) if err != nil { - Exit("Error with connection pooling: %s", err.Error()) + exit("Error with connection pooling: %s", err.Error()) } integrations := configureIntegrations(config, *connectToPinecone) + tp := telemetry.InitTracer() + + slog.Info("appease linter since we aren't tracing anything yet", "tracer", tracer) + + defer func() { + if err := tp.Shutdown(context.Background()); err != nil { + slog.Error("error shutting down tracer", "error", err) + } + }() + app := server.Init(db, integrations, *config) err = app.Listen(fmt.Sprintf("%s:%d", config.Application.Host, config.Application.Port)) if err != nil { - Exit("Error starting server: %s", err.Error()) + exit("Error starting server: %s", err.Error()) + } +} + +func checkServerRunning(host string, port uint16) error { + address := fmt.Sprintf("%s:%d", host, port) + conn, err := net.Dial("tcp", address) + if err != nil { + return err + } + defer conn.Close() + return nil +} + +func exit(format string, a ...interface{}) { + fmt.Fprintf(os.Stderr, format, a...) + os.Exit(0) +} + +func configureIntegrations(config *config.Settings, connectToPinecone bool) integrations.Integrations { + openAi := search.NewOpenAIClient(config.OpenAI) + var pinecone search.SearchClientInterface + + if connectToPinecone { + pinecone = search.NewPineconeClient(openAi, config.Pinecone) + } else { + pinecone = mocks.NewPineconeMockClient() } + + integrations := integrations.Integrations{ + File: file.NewAWSProvider(config.AWS), + AI: openAi, + Email: email.NewResendClient(config.Resend, true), + Search: pinecone, + } + return integrations } diff --git a/backend/middleware/auth.go b/backend/middleware/auth.go deleted file mode 100644 index cf0ab8150..000000000 --- a/backend/middleware/auth.go +++ /dev/null @@ -1,117 +0,0 @@ -package middleware - -import ( - "fmt" - "slices" - "strings" - "time" - - "github.com/GenerateNU/sac/backend/auth" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - - "github.com/golang-jwt/jwt" - - "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/limiter" -) - -func (m *AuthMiddlewareService) IsSuper(c *fiber.Ctx) bool { - claims, err := auth.From(c) - if err != nil { - _ = err.FiberError(c) - return false - } - if claims == nil { - return false - } - return claims.Role == string(models.Super) -} - -func GetAuthroizationToken(c *fiber.Ctx) *string { - accessToken := c.Get("Authorization") - if accessToken == "" { - return nil - } - - token := strings.Split(accessToken, "Bearer ") - if len(token) != 2 { - return nil - } - - return &token[1] -} - -func (m *AuthMiddlewareService) Authenticate(c *fiber.Ctx) error { - accessToken := GetAuthroizationToken(c) - if accessToken == nil { - return errors.Unauthorized.FiberError(c) - } - - token, err := func() (*jwt.Token, error) { - return jwt.ParseWithClaims(*accessToken, &auth.CustomClaims{}, func(token *jwt.Token) (interface{}, error) { - return []byte(m.AuthSettings.AccessKey.Expose()), nil - }) - }() - if err != nil { - return errors.Unauthorized.FiberError(c) - } - - claims, ok := token.Claims.(*auth.CustomClaims) - if !ok || !token.Valid { - return errors.Unauthorized.FiberError(c) - } - - // if auth.IsBlacklisted(*accessToken) { - // return errors.Unauthorized.FiberError(c) - // } - - c.Locals("claims", claims) - - return nil -} - -func (m *AuthMiddlewareService) Authorize(requiredPermissions ...auth.Permission) func(c *fiber.Ctx) error { - return func(c *fiber.Ctx) error { - authErr := m.Authenticate(c) - if authErr != nil { - return errors.Unauthorized.FiberError(c) - } - - claims, fromErr := auth.From(c) - if fromErr != nil { - return fromErr.FiberError(c) - } - - if claims != nil && claims.Role == string(models.Super) { - return c.Next() - } - - userPermissions := auth.GetPermissions(models.UserRole(claims.Role)) - - for _, requiredPermission := range requiredPermissions { - if !slices.Contains(userPermissions, requiredPermission) { - return errors.Forbidden.FiberError(c) - } - } - - return c.Next() - } -} - -// TODO: implement rate limiting with redis -func (m *AuthMiddlewareService) Limiter(rate int, expiration time.Duration) func(c *fiber.Ctx) error { - return limiter.New(limiter.Config{ - Max: rate, - Expiration: expiration, - KeyGenerator: func(c *fiber.Ctx) string { - return fmt.Sprintf("%s-%s", c.IP(), c.Path()) - }, - LimitReached: func(c *fiber.Ctx) error { - return c.Status(fiber.StatusTooManyRequests).JSON(fiber.Map{ - "error": "Too many requests", - }) - }, - }) -} diff --git a/backend/middleware/auth/auth.go b/backend/middleware/auth/auth.go new file mode 100644 index 000000000..1a0962766 --- /dev/null +++ b/backend/middleware/auth/auth.go @@ -0,0 +1,100 @@ +package auth + +import ( + "slices" + "strings" + + "github.com/GenerateNU/sac/backend/auth" + "github.com/GenerateNU/sac/backend/utilities" + + "github.com/GenerateNU/sac/backend/entities/models" + + "github.com/golang-jwt/jwt" + + "github.com/gofiber/fiber/v2" +) + +func (m *AuthMiddlewareService) IsSuper(c *fiber.Ctx) bool { + claims, err := auth.From(c) + if err != nil { + _ = err + return false + } + if claims == nil { + return false + } + return claims.Role == string(models.Super) +} + +func GetAuthroizationToken(c *fiber.Ctx) *string { + accessToken := c.Get("Authorization") + if accessToken == "" { + return nil + } + + token := strings.Split(accessToken, "Bearer ") + if len(token) != 2 { + return nil + } + + return &token[1] +} + +func (m *AuthMiddlewareService) Authenticate(c *fiber.Ctx) error { + return func(c *fiber.Ctx) error { + accessToken := GetAuthroizationToken(c) + if accessToken == nil { + return utilities.Unauthorized() + } + + token, err := func() (*jwt.Token, error) { + return jwt.ParseWithClaims(*accessToken, &auth.CustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return []byte(m.Auth.AccessKey.Expose()), nil + }) + }() + if err != nil { + return utilities.Unauthorized() + } + + claims, ok := token.Claims.(*auth.CustomClaims) + if !ok || !token.Valid { + return utilities.Unauthorized() + } + + // if auth.IsBlacklisted(*accessToken) { + // return errors.Unauthorized.FiberError(c) + // } + + c.Locals("claims", claims) + + return nil + }(c) +} + +func (m *AuthMiddlewareService) Authorize(requiredPermissions ...auth.Permission) func(c *fiber.Ctx) error { + return func(c *fiber.Ctx) error { + authErr := m.Authenticate(c) + if authErr != nil { + return utilities.Unauthorized() + } + + claims, err := auth.From(c) + if err != nil { + return err + } + + if claims != nil && claims.Role == string(models.Super) { + return c.Next() + } + + userPermissions := auth.GetPermissions(models.UserRole(claims.Role)) + + for _, requiredPermission := range requiredPermissions { + if !slices.Contains(userPermissions, requiredPermission) { + return utilities.Forbidden() + } + } + + return c.Next() + } +} diff --git a/backend/middleware/auth/club.go b/backend/middleware/auth/club.go new file mode 100644 index 000000000..5a084fd7b --- /dev/null +++ b/backend/middleware/auth/club.go @@ -0,0 +1,49 @@ +package auth + +import ( + "slices" + + "github.com/GenerateNU/sac/backend/auth" + "github.com/GenerateNU/sac/backend/entities/clubs" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +// Authorizes admins of the specific club to make this request, skips check if super user +func (m *AuthMiddlewareService) ClubAuthorizeById(c *fiber.Ctx, extractor ExtractID) error { + return func(c *fiber.Ctx) error { + if err := m.Authenticate(c); err != nil { + return utilities.Unauthorized() + } + + if m.IsSuper(c) { + return c.Next() + } + + clubUUID, err := extractor(c) + if err != nil { + return err + } + + claims, err := auth.From(c) + if err != nil { + return err + } + + issuerUUID, err := utilities.ValidateID(claims.Issuer) + if err != nil { + return err + } + + clubAdmin, err := clubs.GetAdminIDs(m.DB, *clubUUID) + if err != nil { + return err + } + + if slices.Contains(clubAdmin, *issuerUUID) { + return c.Next() + } + + return utilities.Forbidden() + }(c) +} diff --git a/backend/middleware/auth/event.go b/backend/middleware/auth/event.go new file mode 100644 index 000000000..542f6e7c2 --- /dev/null +++ b/backend/middleware/auth/event.go @@ -0,0 +1,49 @@ +package auth + +import ( + "slices" + + "github.com/GenerateNU/sac/backend/auth" + "github.com/GenerateNU/sac/backend/entities/events" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +// Authorizes admins of the host club of this event to make this request, skips check if super user +func (m *AuthMiddlewareService) EventAuthorizeById(c *fiber.Ctx, extractor ExtractID) error { + return func(c *fiber.Ctx) error { + if err := m.Authenticate(c); err != nil { + return utilities.Unauthorized() + } + + if m.IsSuper(c) { + return c.Next() + } + + eventUUID, err := extractor(c) + if err != nil { + return err + } + + claims, err := auth.From(c) + if err != nil { + return err + } + + issuerUUID, err := utilities.ValidateID(claims.Issuer) + if err != nil { + return err + } + + eventHostAdmin, err := events.GetEventHostAdminIDs(m.DB, *eventUUID) + if err != nil { + return err + } + + if slices.Contains(eventHostAdmin, *issuerUUID) { + return c.Next() + } + + return utilities.Forbidden() + }(c) +} diff --git a/backend/middleware/auth/extractor.go b/backend/middleware/auth/extractor.go new file mode 100644 index 000000000..8b10c29f5 --- /dev/null +++ b/backend/middleware/auth/extractor.go @@ -0,0 +1,81 @@ +package auth + +import ( + "errors" + "fmt" + + go_json "github.com/goccy/go-json" + "gorm.io/gorm" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" +) + +type ExtractID func(*fiber.Ctx) (*uuid.UUID, error) + +func AttachExtractor(middleware func(c *fiber.Ctx, extractor ExtractID) error, extractor ExtractID) fiber.Handler { + return func(c *fiber.Ctx) error { + return middleware(c, extractor) + } +} + +func ExtractFromParams(param string) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + return utilities.ValidateID(c.Params(param)) + } +} + +func ExtractFromBody(key string) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + var bodyMap map[string]string + + bodyBytes := c.BodyRaw() + + if len(bodyBytes) == 0 { + return nil, errors.New("empty request body") + } + + err := go_json.Unmarshal(bodyBytes, &bodyMap) + if err != nil { + return nil, err + } + + id, ok := bodyMap[key] + if !ok { + return nil, fmt.Errorf("missing key %s in request body", key) + } + + return utilities.ValidateID(id) + } +} + +type QueryFn func(*gorm.DB, uuid.UUID) (*uuid.UUID, error) + +func ExtractFromQuery(db *gorm.DB, id uuid.UUID, query QueryFn) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + id, err := query(db, id) + if err != nil { + return nil, err + } + + return id, nil + } +} + +func ExtractFromParamIntoQuery(param string, db *gorm.DB, query QueryFn) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + id, err := ExtractFromParams(param)(c) + if err != nil { + return nil, err + } + + return ExtractFromQuery(db, *id, query)(c) + } +} + +func FromExtractFromParamIntoQuery(param string, db *gorm.DB, query QueryFn) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + return ExtractFromParamIntoQuery(param, db, query)(c) + } +} diff --git a/backend/middleware/auth/middleware.go b/backend/middleware/auth/middleware.go new file mode 100644 index 000000000..97b3cafa5 --- /dev/null +++ b/backend/middleware/auth/middleware.go @@ -0,0 +1,31 @@ +package auth + +import ( + "github.com/GenerateNU/sac/backend/auth" + "github.com/GenerateNU/sac/backend/config" + "github.com/go-playground/validator/v10" + "github.com/gofiber/fiber/v2" + "gorm.io/gorm" +) + +type AuthMiddlewareInterface interface { + ClubAuthorizeById(c *fiber.Ctx) error + UserAuthorizeById(c *fiber.Ctx) error + Authenticate(c *fiber.Ctx) error + Authorize(requiredPermissions ...auth.Permission) fiber.Handler + IsSuper(c *fiber.Ctx) bool +} + +type AuthMiddlewareService struct { + DB *gorm.DB + Validate *validator.Validate + Auth config.AuthSettings +} + +func New(db *gorm.DB, validate *validator.Validate, authSettings config.AuthSettings) *AuthMiddlewareService { + return &AuthMiddlewareService{ + DB: db, + Validate: validate, + Auth: authSettings, + } +} diff --git a/backend/middleware/auth/user.go b/backend/middleware/auth/user.go new file mode 100644 index 000000000..bf489faa2 --- /dev/null +++ b/backend/middleware/auth/user.go @@ -0,0 +1,40 @@ +package auth + +import ( + "github.com/GenerateNU/sac/backend/auth" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +func (m *AuthMiddlewareService) UserAuthorizeById(c *fiber.Ctx) error { + return func(c *fiber.Ctx) error { + if err := m.Authenticate(c); err != nil { + return utilities.Unauthorized() + } + + if m.IsSuper(c) { + return c.Next() + } + + idAsUUID, err := utilities.ValidateID(c.Params("userID")) + if err != nil { + return err + } + + claims, err := auth.From(c) + if err != nil { + return err + } + + issuerIDAsUUID, err := utilities.ValidateID(claims.Issuer) + if err != nil { + return err + } + + if issuerIDAsUUID.String() == idAsUUID.String() { + return c.Next() + } + + return utilities.Forbidden() + }(c) +} diff --git a/backend/middleware/club.go b/backend/middleware/club.go deleted file mode 100644 index d90d041b8..000000000 --- a/backend/middleware/club.go +++ /dev/null @@ -1,49 +0,0 @@ -package middleware - -import ( - "slices" - - "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/clubs" - "github.com/GenerateNU/sac/backend/errors" - "github.com/GenerateNU/sac/backend/utilities" - "github.com/gofiber/fiber/v2" -) - -// Authorizes admins of the specific club to make this request, skips check if super user -func (m *AuthMiddlewareService) ClubAuthorizeById(c *fiber.Ctx) error { - authErr := m.Authenticate(c) - if authErr != nil { - return errors.Unauthorized.FiberError(c) - } - - if m.IsSuper(c) { - return c.Next() - } - - clubUUID, err := utilities.ValidateID(c.Params("clubID")) - if err != nil { - return errors.FailedToValidateID.FiberError(c) - } - - claims, err := auth.From(c) - if err != nil { - return err.FiberError(c) - } - - issuerUUID, issueErr := utilities.ValidateID(claims.Issuer) - if issueErr != nil { - return errors.FailedToParseAccessToken.FiberError(c) - } - - clubAdmin, clubErr := clubs.GetAdminIDs(m.DB, *clubUUID) - if clubErr != nil { - return err - } - - if slices.Contains(clubAdmin, *issuerUUID) { - return c.Next() - } - - return errors.Forbidden.FiberError(c) -} diff --git a/backend/middleware/middleware.go b/backend/middleware/middleware.go deleted file mode 100644 index 2f9689e1d..000000000 --- a/backend/middleware/middleware.go +++ /dev/null @@ -1,35 +0,0 @@ -package middleware - -import ( - "time" - - "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/config" - "github.com/go-playground/validator/v10" - "github.com/gofiber/fiber/v2" - "gorm.io/gorm" -) - -type AuthMiddlewareInterface interface { - ClubAuthorizeById(c *fiber.Ctx) error - UserAuthorizeById(c *fiber.Ctx) error - Authenticate(c *fiber.Ctx) error - Authorize(requiredPermissions ...auth.Permission) func(c *fiber.Ctx) error - Skip(h fiber.Handler) fiber.Handler - IsSuper(c *fiber.Ctx) bool - Limiter(rate int, duration time.Duration) func(c *fiber.Ctx) error -} - -type AuthMiddlewareService struct { - DB *gorm.DB - Validate *validator.Validate - AuthSettings config.AuthSettings -} - -func NewAuthAuthMiddlewareService(db *gorm.DB, validate *validator.Validate, authSettings config.AuthSettings) *AuthMiddlewareService { - return &AuthMiddlewareService{ - DB: db, - Validate: validate, - AuthSettings: authSettings, - } -} diff --git a/backend/middleware/user.go b/backend/middleware/user.go deleted file mode 100644 index 3ffe4ce4e..000000000 --- a/backend/middleware/user.go +++ /dev/null @@ -1,40 +0,0 @@ -package middleware - -import ( - "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/errors" - "github.com/GenerateNU/sac/backend/utilities" - "github.com/gofiber/fiber/v2" -) - -func (m *AuthMiddlewareService) UserAuthorizeById(c *fiber.Ctx) error { - authErr := m.Authenticate(c) - if authErr != nil { - return errors.Unauthorized.FiberError(c) - } - - if m.IsSuper(c) { - return c.Next() - } - - idAsUUID, err := utilities.ValidateID(c.Params("userID")) - if err != nil { - return errors.FailedToValidateID.FiberError(c) - } - - claims, err := auth.From(c) - if err != nil { - return err.FiberError(c) - } - - issuerIDAsUUID, err := utilities.ValidateID(claims.Issuer) - if err != nil { - return errors.FailedToValidateID.FiberError(c) - } - - if issuerIDAsUUID.String() == idAsUUID.String() { - return c.Next() - } - - return errors.Forbidden.FiberError(c) -} diff --git a/backend/middleware/utility/limiter.go b/backend/middleware/utility/limiter.go new file mode 100644 index 000000000..dc6ed2887 --- /dev/null +++ b/backend/middleware/utility/limiter.go @@ -0,0 +1,24 @@ +package utility + +import ( + "errors" + "fmt" + "time" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/limiter" +) + +func (u *UtilityMiddlewareService) Limiter(rate int, expiration time.Duration) func(c *fiber.Ctx) error { + return limiter.New(limiter.Config{ + Max: rate, + Expiration: expiration, + KeyGenerator: func(c *fiber.Ctx) string { + return fmt.Sprintf("%s-%s", c.IP(), c.Path()) + }, + LimitReached: func(c *fiber.Ctx) error { + return utilities.NewAPIError(fiber.StatusTooManyRequests, errors.New("too many requests")) + }, + }) +} diff --git a/backend/middleware/utility/middleware.go b/backend/middleware/utility/middleware.go new file mode 100644 index 000000000..cd940ea93 --- /dev/null +++ b/backend/middleware/utility/middleware.go @@ -0,0 +1,22 @@ +package utility + +import ( + "time" + + "github.com/gofiber/fiber/v2" +) + +type UtilityMiddlewareInterface interface { + Paginator(c *fiber.Ctx) error + Limiter(rate int, duration time.Duration) fiber.Handler +} + +type UtilityMiddlewareService struct { + paginator fiber.Handler +} + +func New(paginator fiber.Handler) *UtilityMiddlewareService { + return &UtilityMiddlewareService{ + paginator: paginator, + } +} diff --git a/backend/middleware/utility/paginator.go b/backend/middleware/utility/paginator.go new file mode 100644 index 000000000..0e2827fda --- /dev/null +++ b/backend/middleware/utility/paginator.go @@ -0,0 +1,9 @@ +package utility + +import ( + "github.com/gofiber/fiber/v2" +) + +func (u *UtilityMiddlewareService) Paginator(c *fiber.Ctx) error { + return u.paginator(c) +} diff --git a/backend/migrations/000001_init.down.sql b/backend/migrations/000001_init.down.sql index 71f9ab58b..53a2ab3b3 100644 --- a/backend/migrations/000001_init.down.sql +++ b/backend/migrations/000001_init.down.sql @@ -18,8 +18,6 @@ DROP TABLE IF EXISTS contacts CASCADE; DROP TABLE IF EXISTS series CASCADE; -DROP TABLE IF EXISTS event_series CASCADE; - DROP TABLE IF EXISTS event_tags CASCADE; DROP TABLE IF EXISTS files CASCADE; @@ -42,4 +40,6 @@ DROP TABLE IF EXISTS user_tags CASCADE; DROP TABLE IF EXISTS verifications CASCADE; -COMMIT; \ No newline at end of file +DROP EXTENSION IF EXISTS "uuid-ossp"; + +COMMIT; diff --git a/backend/migrations/000001_init.up.sql b/backend/migrations/000001_init.up.sql index d85dd8355..a397a8cba 100644 --- a/backend/migrations/000001_init.up.sql +++ b/backend/migrations/000001_init.up.sql @@ -4,8 +4,8 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE TABLE IF NOT EXISTS users( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, role varchar(255) NOT NULL DEFAULT 'student'::character varying, first_name varchar(255) NOT NULL, last_name varchar(255) NOT NULL, @@ -21,10 +21,12 @@ CREATE TABLE IF NOT EXISTS users( PRIMARY KEY(id) ); +CREATE UNIQUE INDEX IF NOT EXISTS uni_users_email ON users USING btree ("email"); + CREATE TABLE IF NOT EXISTS clubs( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, soft_deleted_at timestamp with time zone, name varchar(255) NOT NULL, preview varchar(255) NOT NULL, @@ -41,28 +43,45 @@ CREATE TABLE IF NOT EXISTS clubs( PRIMARY KEY(id) ); +CREATE UNIQUE INDEX IF NOT EXISTS uni_clubs_name ON clubs USING btree ("name"); +CREATE INDEX IF NOT EXISTS idx_clubs_num_members ON clubs USING btree ("num_members"); +CREATE INDEX IF NOT EXISTS idx_clubs_one_word_to_describe_us ON clubs USING btree ("one_word_to_describe_us"); + +CREATE TABLE IF NOT EXISTS series( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY(id) +); + CREATE TABLE IF NOT EXISTS events( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, preview varchar(255) NOT NULL, - content text NOT NULL, + description varchar(255) NOT NULL, + event_type varchar(255) NOT NULL, + location varchar(255), + link varchar(255), + is_public boolean NOT NULL, + is_draft boolean NOT NULL, + is_archived boolean NOT NULL, start_time timestamp with time zone NOT NULL, end_time timestamp with time zone NOT NULL, - location varchar(255) NOT NULL, - event_type varchar(255) NOT NULL DEFAULT 'open'::character varying, - is_recurring boolean NOT NULL DEFAULT false, - meeting_link varchar(255), host uuid NOT NULL, + series_id uuid, PRIMARY KEY(id), - CONSTRAINT fk_clubs_host_event FOREIGN key(host) REFERENCES clubs(id) ON UPDATE CASCADE ON DELETE CASCADE + CONSTRAINT fk_clubs_host_event FOREIGN key(host) REFERENCES clubs(id) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT fk_series_event FOREIGN key(series_id) REFERENCES series(id) ON UPDATE CASCADE ON DELETE CASCADE ); +CREATE INDEX IF NOT EXISTS idx_events_series_id ON events USING btree ("series_id"); + CREATE TABLE IF NOT EXISTS categories( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, PRIMARY KEY(id) ); @@ -72,14 +91,16 @@ CREATE UNIQUE INDEX IF NOT EXISTS uni_categories_name ON categories USING btree CREATE TABLE IF NOT EXISTS tags( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, category_id uuid NOT NULL, PRIMARY KEY(id), CONSTRAINT fk_categories_tag FOREIGN key(category_id) REFERENCES categories(id) ON UPDATE CASCADE ON DELETE CASCADE ); +CREATE INDEX IF NOT EXISTS idx_tags_category_id ON tags USING btree ("category_id"); + CREATE TABLE IF NOT EXISTS club_events( club_id uuid NOT NULL DEFAULT uuid_generate_v4(), event_id uuid NOT NULL DEFAULT uuid_generate_v4(), @@ -98,8 +119,8 @@ CREATE TABLE IF NOT EXISTS club_tags( CREATE TABLE IF NOT EXISTS contacts( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, "type" varchar(255) NOT NULL, content varchar(255) NOT NULL, club_id uuid NOT NULL, @@ -109,22 +130,6 @@ CREATE TABLE IF NOT EXISTS contacts( CREATE UNIQUE INDEX IF NOT EXISTS idx_contact_type ON contacts USING btree ("type","club_id"); -CREATE TABLE IF NOT EXISTS series( - id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - recurring_type varchar(255) NOT NULL DEFAULT 'open'::character varying, - max_occurrences bigint NOT NULL, - PRIMARY KEY(id) -); - -CREATE TABLE IF NOT EXISTS event_series( - event_id uuid NOT NULL, - series_id uuid NOT NULL, - CONSTRAINT fk_event_series_event FOREIGN key(event_id) REFERENCES events(id) ON UPDATE CASCADE ON DELETE CASCADE, - CONSTRAINT fk_event_series_series FOREIGN key(series_id) REFERENCES series(id) ON UPDATE CASCADE ON DELETE CASCADE -); - CREATE TABLE IF NOT EXISTS event_tags( tag_id uuid NOT NULL DEFAULT uuid_generate_v4(), event_id uuid NOT NULL DEFAULT uuid_generate_v4(), @@ -135,8 +140,8 @@ CREATE TABLE IF NOT EXISTS event_tags( CREATE TABLE IF NOT EXISTS files( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, owner_id uuid NOT NULL, owner_type varchar(255) NOT NULL, file_name varchar(255) NOT NULL, @@ -151,8 +156,8 @@ CREATE INDEX IF NOT EXISTS idx_files_owner_id ON files USING btree ("owner_id"); -- CREATE TABLE IF NOT EXISTS notifications( -- id uuid NOT NULL DEFAULT uuid_generate_v4(), --- created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, --- updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, +-- created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, +-- updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, -- send_at timestamp with time zone NOT NULL, -- title varchar(255) NOT NULL, -- content varchar(255) NOT NULL, @@ -165,8 +170,8 @@ CREATE INDEX IF NOT EXISTS idx_files_owner_id ON files USING btree ("owner_id"); CREATE TABLE IF NOT EXISTS point_of_contacts( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, email varchar(255) NOT NULL, position varchar(255) NOT NULL, @@ -174,6 +179,7 @@ CREATE TABLE IF NOT EXISTS point_of_contacts( PRIMARY KEY(id), CONSTRAINT fk_clubs_point_of_contact FOREIGN key(club_id) REFERENCES clubs(id) ON UPDATE CASCADE ON DELETE CASCADE ); + CREATE UNIQUE INDEX IF NOT EXISTS compositeindex ON point_of_contacts USING btree ("email","club_id"); CREATE INDEX IF NOT EXISTS idx_point_of_contacts_club_id ON point_of_contacts USING btree ("club_id"); CREATE INDEX IF NOT EXISTS idx_point_of_contacts_email ON point_of_contacts USING btree ("email"); @@ -233,10 +239,11 @@ CREATE UNIQUE INDEX IF NOT EXISTS uni_users_email ON users USING btree ("email") CREATE TABLE IF NOT EXISTS verifications( user_id uuid NOT NULL, token varchar(255), - expires_at timestamp without time zone NOT NULL, + expires_at timestamp with time zone NOT NULL, "type" varchar(255) NOT NULL, PRIMARY KEY(user_id,expires_at) ); + CREATE UNIQUE INDEX IF NOT EXISTS uni_verifications_token ON verifications USING btree ("token"); -COMMIT; \ No newline at end of file +COMMIT; diff --git a/backend/protos/recurrence.go b/backend/protos/recurrence.go new file mode 100644 index 000000000..4543eb156 --- /dev/null +++ b/backend/protos/recurrence.go @@ -0,0 +1,271 @@ +package protos + +import ( + "errors" + "slices" + "time" +) + +type Cadence int + +const ( + Weekly Cadence = iota + Biweekly + Monthly +) + +type Recurrence struct { + Cadence Cadence + HappensOnMonday bool + HappensOnTuesday bool + HappensOnWednesday bool + HappensOnThursday bool + HappensOnFriday bool + HappensOnSaturday bool + HappensOnSunday bool +} + +func NewRecurrence(cadence Cadence, happensOn ...HappensOn) (*Recurrence, error) { + if len(happensOn) == 0 { + return nil, errors.New("at least one happensOn function must be provided") + } + + var r Recurrence + r.Cadence = cadence + for _, happens := range happensOn { + r = happens(r) + } + + return &r, nil +} + +func (r *Recurrence) HappensOn() []time.Weekday { + var result []time.Weekday + if r.HappensOnMonday { + result = append(result, time.Monday) + } + if r.HappensOnTuesday { + result = append(result, time.Tuesday) + } + if r.HappensOnWednesday { + result = append(result, time.Wednesday) + } + if r.HappensOnThursday { + result = append(result, time.Thursday) + } + if r.HappensOnFriday { + result = append(result, time.Friday) + } + if r.HappensOnSaturday { + result = append(result, time.Saturday) + } + if r.HappensOnSunday { + result = append(result, time.Sunday) + } + + return result +} + +type HappensOn func(Recurrence) Recurrence + +func Monday(r Recurrence) Recurrence { + r.HappensOnMonday = true + return r +} + +func Tuesday(r Recurrence) Recurrence { + r.HappensOnTuesday = true + return r +} + +func Wednesday(r Recurrence) Recurrence { + r.HappensOnWednesday = true + return r +} + +func Thursday(r Recurrence) Recurrence { + r.HappensOnThursday = true + return r +} + +func Friday(r Recurrence) Recurrence { + r.HappensOnFriday = true + return r +} + +func Saturday(r Recurrence) Recurrence { + r.HappensOnSaturday = true + return r +} + +func Sunday(r Recurrence) Recurrence { + r.HappensOnSunday = true + return r +} + +type Occurrence struct { + Start time.Time + End time.Time +} + +func (r *Recurrence) ReccurUntil(start time.Time, end time.Time, termination time.Time) (result []Occurrence, err error) { + if start.After(end) { + return nil, errors.New("start date is after end date") + } + + if start.After(termination) { + return nil, errors.New("start date is after termination date") + } + + if end.After(termination) { + return nil, errors.New("end date is after termination date") + } + + if !slices.Contains(r.HappensOn(), start.Weekday()) { + return nil, errors.New("start date is on a day that the recurrence does not happen on") + } + + var monthIncrement int + switch r.Cadence { + case Weekly: + monthIncrement = 0 + case Biweekly: + monthIncrement = 0 + case Monthly: + monthIncrement = 1 + } + + var dayIncrement int + switch r.Cadence { + case Weekly: + dayIncrement = 7 + case Biweekly: + dayIncrement = 14 + case Monthly: + dayIncrement = 0 + } + + current := start + currentEnd := end + for current.Before(termination) { + if current.After(termination) && currentEnd.After(termination) { + break + } + + result = append(result, Occurrence{current, currentEnd}) + + current = current.AddDate(0, monthIncrement, dayIncrement) + currentEnd = currentEnd.AddDate(0, monthIncrement, dayIncrement) + } + + return result, nil +} + +const ( + // housekeeping + PROTO_VERSION rune = '1' + PROTO_SIZE int = 9 + + // indices + VERSION_INDEX int = 0 + CADENCE_INDEX int = 1 + START_DAYS_OF_WEEK_INDEX int = 2 + END_DAYS_OF_WEEK_INDEX int = 9 +) + +// PROTO v1 +// 0: [proto version] +// 1: [cadence] +// 2: [does this occur on Monday?] +// 3: [does this occur on Tuesday?] +// 4: [does this occur on Wednesday?] +// 5: [does this occur on Thursday?] +// 6: [does this occur on Friday?] +// 7: [does this occur on Saturday?] +// 8: [does this occur on Sunday?] +type StringRecurrence string + +func (r *Recurrence) Into() string { + data := make([]rune, PROTO_SIZE) + + data[VERSION_INDEX] = PROTO_VERSION + + switch r.Cadence { + case Weekly: + data[CADENCE_INDEX] = '0' + case Biweekly: + data[CADENCE_INDEX] = '1' + case Monthly: + data[CADENCE_INDEX] = '2' + } + + if r.HappensOnMonday { + data[START_DAYS_OF_WEEK_INDEX] = '1' + } + if r.HappensOnTuesday { + data[START_DAYS_OF_WEEK_INDEX+1] = '1' + } + if r.HappensOnWednesday { + data[START_DAYS_OF_WEEK_INDEX+2] = '1' + } + if r.HappensOnThursday { + data[START_DAYS_OF_WEEK_INDEX+3] = '1' + } + if r.HappensOnFriday { + data[START_DAYS_OF_WEEK_INDEX+4] = '1' + } + if r.HappensOnSaturday { + data[START_DAYS_OF_WEEK_INDEX+5] = '1' + } + if r.HappensOnSunday { + data[START_DAYS_OF_WEEK_INDEX+6] = '1' + } + + return string(data) +} + +func RecurrenceFrom(raw StringRecurrence) (recurrence *Recurrence, err error) { + runes := []rune(raw) + + if runes[VERSION_INDEX] != PROTO_VERSION { + return nil, errors.New("invalid version") + } + + if len(runes) != PROTO_SIZE { + return nil, errors.New("invalid data length") + } + + if runes[CADENCE_INDEX] != '0' && runes[CADENCE_INDEX] != '1' && runes[CADENCE_INDEX] != '2' { + return nil, errors.New("invalid cadence") + } + + cadence := int(runes[CADENCE_INDEX] - '0') + + var happensOn []HappensOn + if runes[START_DAYS_OF_WEEK_INDEX] == '1' { + happensOn = append(happensOn, Monday) + } + if runes[START_DAYS_OF_WEEK_INDEX+1] == '1' { + happensOn = append(happensOn, Tuesday) + } + if runes[START_DAYS_OF_WEEK_INDEX+2] == '1' { + happensOn = append(happensOn, Wednesday) + } + if runes[START_DAYS_OF_WEEK_INDEX+3] == '1' { + happensOn = append(happensOn, Thursday) + } + if runes[START_DAYS_OF_WEEK_INDEX+4] == '1' { + happensOn = append(happensOn, Friday) + } + if runes[START_DAYS_OF_WEEK_INDEX+5] == '1' { + happensOn = append(happensOn, Saturday) + } + if runes[START_DAYS_OF_WEEK_INDEX+6] == '1' { + happensOn = append(happensOn, Sunday) + } + + return NewRecurrence( + Cadence(cadence), + happensOn..., + ) +} diff --git a/backend/server/server.go b/backend/server/server.go index c0bf0727c..ebb1e8ac7 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -1,12 +1,14 @@ package server import ( - "encoding/json" "fmt" - "github.com/GenerateNU/sac/backend/auth" + "github.com/garrettladley/fiberpaginate" + go_json "github.com/goccy/go-json" + + authenticator "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/config" - authBase "github.com/GenerateNU/sac/backend/entities/auth/base" + auth "github.com/GenerateNU/sac/backend/entities/auth/base" categories "github.com/GenerateNU/sac/backend/entities/categories/base" clubs "github.com/GenerateNU/sac/backend/entities/clubs/base" contacts "github.com/GenerateNU/sac/backend/entities/contacts/base" @@ -16,11 +18,14 @@ import ( tags "github.com/GenerateNU/sac/backend/entities/tags/base" users "github.com/GenerateNU/sac/backend/entities/users/base" "github.com/GenerateNU/sac/backend/integrations" - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + utilityMiddleware "github.com/GenerateNU/sac/backend/middleware/utility" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/contrib/otelfiber" "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/compress" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/fiber/v2/middleware/requestid" @@ -46,22 +51,25 @@ func Init(db *gorm.DB, integrations integrations.Integrations, settings config.S panic(fmt.Sprintf("Error registering custom validators: %s", err)) } - jwt := auth.NewJWTClient(settings.Auth, jwt.SigningMethodHS256) - authMiddleware := middleware.NewAuthAuthMiddlewareService(db, validate, settings.Auth) + jwt := authenticator.NewJWTClient(settings.Auth, jwt.SigningMethodHS256) + authMiddleware := authMiddleware.New(db, validate, settings.Auth) + utilityMiddleware := utilityMiddleware.New(fiberpaginate.New()) apiv1 := app.Group("/api/v1") - routeParams := types.RouteParams{ - Router: apiv1, - AuthMiddleware: authMiddleware, - ServiceParams: types.ServiceParams{ - DB: db, - Validate: validate, - AuthSettings: &settings.Auth, - JWT: jwt, - Integrations: integrations, - }, - } + routeParams := types.NewRouteParams( + apiv1, + authMiddleware, + utilityMiddleware, + types.NewServiceParams( + db, + validate, + &settings.Auth, + jwt, + &settings.Calendar, + integrations, + ), + ) allRoutes(app, routeParams) @@ -70,31 +78,43 @@ func Init(db *gorm.DB, integrations integrations.Integrations, settings config.S func allRoutes(app *fiber.App, routeParams types.RouteParams) { Utility(app) - authBase.Auth(routeParams) + auth.Auth(routeParams) users.UserRoutes(routeParams) clubs.ClubRoutes(routeParams) contacts.Contact(routeParams) pocs.PointOfContact(routeParams) tags.Tag(routeParams) categories.CategoryRoutes(routeParams) - events.Event(routeParams) + events.EventRoutes(routeParams) files.File(routeParams) } func newFiberApp(appSettings config.ApplicationSettings) *fiber.App { app := fiber.New(fiber.Config{ - JSONEncoder: json.Marshal, - JSONDecoder: json.Unmarshal, + JSONEncoder: go_json.Marshal, + JSONDecoder: go_json.Unmarshal, + ErrorHandler: utilities.ErrorHandler, }) app.Use(cors.New(cors.Config{ AllowOrigins: fmt.Sprintf("http://%s:%d", appSettings.Host, appSettings.Port), AllowCredentials: true, + AllowHeaders: "Origin, Content-Type, Accept, Authorization", + AllowMethods: "GET, POST, PUT, DELETE, OPTIONS", + ExposeHeaders: "Authorization, Content-Length, Content-Type", })) + app.Use(requestid.New()) + app.Use(logger.New(logger.Config{ Format: "[${time}] ${ip}:${port} ${pid} ${locals:requestid} ${status} - ${latency} ${method} ${path}\n", })) + app.Use(compress.New(compress.Config{ + Level: compress.LevelBestSpeed, + })) + + app.Use(otelfiber.Middleware()) + return app } diff --git a/backend/telemetry/README.md b/backend/telemetry/README.md new file mode 100644 index 000000000..db0a2ff9a --- /dev/null +++ b/backend/telemetry/README.md @@ -0,0 +1,3 @@ +# tracing + +See this [example](https://github.com/gofiber/contrib/blob/main/otelfiber/README.md) for how to instrument an endpoint. diff --git a/backend/telemetry/telemetry.go b/backend/telemetry/telemetry.go new file mode 100644 index 000000000..842bd0376 --- /dev/null +++ b/backend/telemetry/telemetry.go @@ -0,0 +1,48 @@ +package telemetry + +import ( + "fmt" + "log" + + "github.com/gofiber/fiber/v2" + "go.opentelemetry.io/otel/sdk/resource" + + "go.opentelemetry.io/otel" + stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + + // uncomment the following line to use Jaeger + // "go.opentelemetry.io/otel/exporters/jaeger" + "github.com/gofiber/contrib/otelfiber" + "go.opentelemetry.io/otel/propagation" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" +) + +func InitTracer() *sdktrace.TracerProvider { + exporter, err := stdout.New(stdout.WithPrettyPrint()) + // uncomment the following line to use Jaeger + // exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces"))) + if err != nil { + log.Fatal(err) + } + tp := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithBatcher(exporter), + sdktrace.WithResource( + resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String("sac-service"), + )), + ) + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) + return tp +} + +func Use(app *fiber.App) *fiber.App { + app.Use(otelfiber.Middleware(otelfiber.WithSpanNameFormatter(func(c *fiber.Ctx) string { + return fmt.Sprintf("%s - %s", c.Method(), c.Route().Path) + }))) + + return app +} diff --git a/backend/templates/README.md b/backend/templates/README.md new file mode 100644 index 000000000..a6cb56cfe --- /dev/null +++ b/backend/templates/README.md @@ -0,0 +1,8 @@ +# Templates Using templ + +templ is a HTML templating language for Go that has great developer tooling. + +[See](https://github.com/a-h/templ) for more. + +> [!NOTE] +> When editing the templates, you need to run `templ generate` to see your changes. To download the CLI, run `go install github.com/a-h/templ/cmd/templ@latest`. \ No newline at end of file diff --git a/backend/templates/emails/layouts/base.templ b/backend/templates/emails/layouts/base.templ new file mode 100644 index 000000000..04a097104 --- /dev/null +++ b/backend/templates/emails/layouts/base.templ @@ -0,0 +1,16 @@ +package layouts + +templ Base(title string, styles templ.Component) { + + + + { title } + + + @styles + + + { children... } + + +} diff --git a/backend/templates/emails/layouts/base_templ.go b/backend/templates/emails/layouts/base_templ.go new file mode 100644 index 000000000..3689f140b --- /dev/null +++ b/backend/templates/emails/layouts/base_templ.go @@ -0,0 +1,64 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.639 +package layouts + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +func Base(title string, styles templ.Component) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var2 string + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(title) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/emails/layouts/base.templ`, Line: 7, Col: 17} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = styles.Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templ_7745c5c3_Var1.Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/backend/templates/emails/password_change_complete.html b/backend/templates/emails/password_change_complete.templ similarity index 58% rename from backend/templates/emails/password_change_complete.html rename to backend/templates/emails/password_change_complete.templ index dc6173767..5e21dadde 100644 --- a/backend/templates/emails/password_change_complete.html +++ b/backend/templates/emails/password_change_complete.templ @@ -1,9 +1,30 @@ - +package emails - - - Your Hippo Password Has Been Reset - - - - -
-

Your Password Has Been Reset

-

Hi %s,

-

- This email confirms that your password for your Hippo account has been - successfully reset. -

-

You can now sign in using your new password:

- Sign in to Hippo -

- If you did not request this password reset, please contact our support - team immediately. -

-

Sincerely,

-

The Hippo Team

-
- - - \ No newline at end of file +} diff --git a/backend/templates/emails/password_change_complete_templ.go b/backend/templates/emails/password_change_complete_templ.go new file mode 100644 index 000000000..9dc55bc51 --- /dev/null +++ b/backend/templates/emails/password_change_complete_templ.go @@ -0,0 +1,89 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.639 +package emails + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +import "github.com/GenerateNU/sac/backend/templates/emails/layouts" + +func PasswordChangeComplete(name string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

Your Password Has Been Reset

Hi ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/emails/password_change_complete.templ`, Line: 9, Col: 15} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(",

This email confirms that your password for your Hippo account has been successfully reset.

You can now sign in using your new password:

Sign in to Hippo

If you did not request this password reset, please contact our support team immediately.

Sincerely,

The Hippo Team

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = io.Copy(templ_7745c5c3_W, templ_7745c5c3_Buffer) + } + return templ_7745c5c3_Err + }) + templ_7745c5c3_Err = layouts.Base("Your Hippo Password Has Been Reset", passwordChangeCompleteStyles()).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} + +func passwordChangeCompleteStyles() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var4 := templ.GetChildren(ctx) + if templ_7745c5c3_Var4 == nil { + templ_7745c5c3_Var4 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/backend/templates/emails/password_reset.html b/backend/templates/emails/password_reset.templ similarity index 54% rename from backend/templates/emails/password_reset.html rename to backend/templates/emails/password_reset.templ index f25d9f159..a6e0ed454 100644 --- a/backend/templates/emails/password_reset.html +++ b/backend/templates/emails/password_reset.templ @@ -1,9 +1,32 @@ - - - - - Password Reset Email - - - - -
-

Your Hippo Account Needs a New Key!

-

Hi %s,

-

- Looks like you've misplaced the key to your Hippo account! Don't worry, - we can help you unlock it in no time. Just click the button below to - choose a new password: -

- Reset Your Password -

- Remember, if you didn't request this change, simply disregard this - message and your account remains secure. -

-

See you soon,

-

The Hippo Team

-
- - +} diff --git a/backend/templates/emails/password_reset_templ.go b/backend/templates/emails/password_reset_templ.go new file mode 100644 index 000000000..bc9ca12dd --- /dev/null +++ b/backend/templates/emails/password_reset_templ.go @@ -0,0 +1,100 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.639 +package emails + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +import ( + "github.com/GenerateNU/sac/backend/templates/emails/layouts" +) + +func PasswordReset(name string, resetUrl string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

Your Hippo Account Needs a New Key!

Hi ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/emails/password_reset.templ`, Line: 11, Col: 15} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(",

Looks like you've misplaced the key to your Hippo account! Don't worry, we can help you unlock it in no time. Just click the button below to choose a new password:

Reset Your Password

Remember, if you didn't request this change, simply disregard this message and your account remains secure.

See you soon,

The Hippo Team

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = io.Copy(templ_7745c5c3_W, templ_7745c5c3_Buffer) + } + return templ_7745c5c3_Err + }) + templ_7745c5c3_Err = layouts.Base("Password Reset Email", passwordResetStyles()).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} + +func passwordResetStyles() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var5 := templ.GetChildren(ctx) + if templ_7745c5c3_Var5 == nil { + templ_7745c5c3_Var5 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/backend/templates/emails/email_verification.html b/backend/templates/emails/verification.templ similarity index 54% rename from backend/templates/emails/email_verification.html rename to backend/templates/emails/verification.templ index 101d9f67b..fad4cff02 100644 --- a/backend/templates/emails/email_verification.html +++ b/backend/templates/emails/verification.templ @@ -1,8 +1,31 @@ - - - - Welcome to Hippo! Verify your Email - - - - -
-

Welcome to Hippo

-

- Thank you for signing up! To unlock the full potential of your account - and start enjoying our services, please verify your email address by - typing the following code in the verification page: -

- -

%s

- -

- If you didn't create an account with Hippo, please disregard this email. -

-

We look forward to having you on board!

-

Sincerely,

-

The Hippo Team

-
- - +} diff --git a/backend/templates/emails/verification_templ.go b/backend/templates/emails/verification_templ.go new file mode 100644 index 000000000..25b8af044 --- /dev/null +++ b/backend/templates/emails/verification_templ.go @@ -0,0 +1,91 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.639 +package emails + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +import ( + "github.com/GenerateNU/sac/backend/templates/emails/layouts" +) + +func Verification(otp string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

Welcome to Hippo

Thank you for signing up! To unlock the full potential of your account and start enjoying our services, please verify your email address by typing the following code in the verification page:

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(otp) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/emails/verification.templ`, Line: 16, Col: 19} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

If you didn't create an account with Hippo, please disregard this email.

We look forward to having you on board!

Sincerely,

The Hippo Team

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = io.Copy(templ_7745c5c3_W, templ_7745c5c3_Buffer) + } + return templ_7745c5c3_Err + }) + templ_7745c5c3_Err = layouts.Base("Welcome to Hippo! Verify your Email", verificationStyles()).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} + +func verificationStyles() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var4 := templ.GetChildren(ctx) + if templ_7745c5c3_Var4 == nil { + templ_7745c5c3_Var4 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/backend/templates/emails/welcome.html b/backend/templates/emails/welcome.templ similarity index 50% rename from backend/templates/emails/welcome.html rename to backend/templates/emails/welcome.templ index 52673f0a6..85d1356f6 100644 --- a/backend/templates/emails/welcome.html +++ b/backend/templates/emails/welcome.templ @@ -1,9 +1,40 @@ - +package emails - - - Welcome to Hippo! - - - - -
-

Welcome to Hippo %s!

-

- Thank you for creating an account with us. We're excited to have you on - board! -

-

- Your account is now active, and you can log in using your email address - and password. -

-

- If you haven't already, we recommend that you complete your profile to - get the most out of your Hippo experience. -

-

- To get started, you can visit our website at - hipponeu.com. -

-

- If you have any questions or need assistance, please don't hesitate to - contact us at generatesac@gmail.com. -

-

We look forward to seeing you around!

-

Sincerely,

-

The Hippo Team

-
- - - \ No newline at end of file + +} diff --git a/backend/templates/emails/welcome_templ.go b/backend/templates/emails/welcome_templ.go new file mode 100644 index 000000000..2f3325b90 --- /dev/null +++ b/backend/templates/emails/welcome_templ.go @@ -0,0 +1,89 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.639 +package emails + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +import "github.com/GenerateNU/sac/backend/templates/emails/layouts" + +func Welcome(name string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

Welcome to Hippo ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/emails/welcome.templ`, Line: 8, Col: 30} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("!

Thank you for creating an account with us. We're excited to have you on board!

Your account is now active, and you can log in using your email address and password.

If you haven't already, we recommend that you complete your profile to get the most out of your Hippo experience.

To get started, you can visit our website at hipponeu.com.

If you have any questions or need assistance, please don't hesitate to contact us at generatesac@gmail.com.

We look forward to seeing you around!

Sincerely,

The Hippo Team

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = io.Copy(templ_7745c5c3_W, templ_7745c5c3_Buffer) + } + return templ_7745c5c3_Err + }) + templ_7745c5c3_Err = layouts.Base("Welcome to Hippo!", welcomeStyles()).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} + +func welcomeStyles() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var4 := templ.GetChildren(ctx) + if templ_7745c5c3_Var4 == nil { + templ_7745c5c3_Var4 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/backend/tests/README.md b/backend/tests/README.md index 46e0813a2..25c391caa 100644 --- a/backend/tests/README.md +++ b/backend/tests/README.md @@ -54,7 +54,7 @@ appAssert.TestOnStatus( Role: &models.Super, TestUserIDReplaces: h.StringToPointer(":userID"), }, - fiber.StatusCreated, + http.StatusCreated, ).TestOnStatusAndTester( h.TestRequest{ Method: fiber.MethodDelete, @@ -63,7 +63,7 @@ appAssert.TestOnStatus( TestUserIDReplaces: h.StringToPointer(":userID"), }, h.TesterWithStatus{ - Status: fiber.StatusNoContent, + Status: http.StatusNoContent, Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { var user models.User @@ -134,7 +134,7 @@ Say you want to test hitting the `[APP_ADDRESS]/health` endpoint with a GET requ Method: fiber.MethodGet, Path: "/health", }, - fiber.StatusOK, + http.StatusOK, ).Close() ``` @@ -151,7 +151,7 @@ existingAppAssert.TestOnStatusAndTester( Role: &models.Super, }, h.TesterWithStatus{ - Status: fiber.StatusCreated, + Status: http.StatusCreated, Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { sampleCategoryUUID = AssertSampleCategoryBodyRespDB(eaa, resp) }, @@ -164,7 +164,7 @@ existingAppAssert.TestOnStatusAndTester( Say you want to test a bad request to POST `[APP_ADDRESS]/api/v1/categories/` endpoint returns a `400` status code, the message is `failed to process the request`, and that a category was not created. We can leverage our errors defined in the error package to do this! ```go - h.InitTest(t).TestOnErrorAndTester( + h.InitTest(t).TestOnStatusAndTester( h.TestRequest{ Method: fiber.MethodPost, Path: "/api/v1/categories/", diff --git a/backend/tests/api/category_tag_test.go b/backend/tests/api/category_tag_test.go deleted file mode 100644 index ab40acd23..000000000 --- a/backend/tests/api/category_tag_test.go +++ /dev/null @@ -1,203 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" -) - -func AssertTagsWithBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *[]map[string]interface{}) []uuid.UUID { - var respTags []models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTags) - - eaa.Assert.NilError(err) - - var dbTags []models.Tag - - err = eaa.App.Conn.Find(&dbTags).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(dbTags), len(respTags)) - - for i, dbTag := range dbTags { - eaa.Assert.Equal(dbTag.ID, respTags[i].ID) - eaa.Assert.Equal(dbTag.Name, respTags[i].Name) - eaa.Assert.Equal(dbTag.CategoryID, respTags[i].CategoryID) - } - - tagIDs := make([]uuid.UUID, len(dbTags)) - for i, dbTag := range dbTags { - tagIDs[i] = dbTag.ID - } - - return tagIDs -} - -func TestGetCategoryTagsWorks(t *testing.T) { - appAssert, categoryUUID, tagID := CreateSampleTag(h.InitTest(t)) - - body := SampleTagFactory(categoryUUID) - (*body)["id"] = tagID - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags", categoryUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertTagsWithBodyRespDB(eaa, resp, &[]map[string]interface{}{*body}) - }, - }, - ).Close() -} - -func TestGetCategoryTagsFailsCategoryBadRequest(t *testing.T) { - appAssert, _ := CreateSampleCategory(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags", badRequest), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestGetCategoryTagsFailsCategoryNotFound(t *testing.T) { - appAssert, _ := CreateSampleCategory(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags", uuid), - Role: &models.Super, - }, h.ErrorWithTester{ - Error: errors.CategoryNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var category models.Category - err := eaa.App.Conn.Where("id = ?", uuid).First(&category).Error - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestGetCategoryTagWorks(t *testing.T) { - existingAppAssert, categoryUUID, tagUUID := CreateSampleTag(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags/%s", categoryUUID, tagUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertTagWithBodyRespDB(eaa, resp, SampleTagFactory(categoryUUID)) - }, - }, - ).Close() -} - -func TestGetCategoryTagFailsCategoryBadRequest(t *testing.T) { - appAssert, _, tagUUID := CreateSampleTag(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags/%s", badRequest, tagUUID), - Role: &models.Super, - }, errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestGetCategoryTagFailsTagBadRequest(t *testing.T) { - appAssert, categoryUUID := CreateSampleCategory(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags/%s", categoryUUID, badRequest), - Role: &models.Super, - }, - errors.FailedToValidateID) - } - - appAssert.Close() -} - -func TestGetCategoryTagFailsCategoryNotFound(t *testing.T) { - appAssert, _, tagUUID := CreateSampleTag(h.InitTest(t)) - - appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags/%s", uuid.New(), tagUUID), - Role: &models.Super, - }, - errors.TagNotFound, - ).Close() -} - -func TestGetCategoryTagFailsTagNotFound(t *testing.T) { - appAssert, categoryUUID := CreateSampleCategory(h.InitTest(t)) - - appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s/tags/%s", categoryUUID, uuid.New()), - Role: &models.Super, - }, - errors.TagNotFound, - ).Close() -} diff --git a/backend/tests/api/category_test.go b/backend/tests/api/category_test.go deleted file mode 100644 index 6b2276bee..000000000 --- a/backend/tests/api/category_test.go +++ /dev/null @@ -1,445 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" - - "github.com/goccy/go-json" -) - -func SampleCategoryFactory() *map[string]interface{} { - return &map[string]interface{}{ - "name": "Foo", - } -} - -func AssertCategoryBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respCategory models.Category - - err := json.NewDecoder(resp.Body).Decode(&respCategory) - - eaa.Assert.NilError(err) - - var dbCategories []models.Category - - err = eaa.App.Conn.Find(&dbCategories).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(dbCategories)) - - dbCategory := dbCategories[0] - - eaa.Assert.Equal(dbCategory.ID, respCategory.ID) - eaa.Assert.Equal(dbCategory.Name, respCategory.Name) - - eaa.Assert.Equal((*body)["name"].(string), dbCategory.Name) - - return dbCategory.ID -} - -func AssertCategoryWithBodyRespDBMostRecent(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respCategory models.Category - - err := json.NewDecoder(resp.Body).Decode(&respCategory) - - eaa.Assert.NilError(err) - - var dbCategory models.Category - - err = eaa.App.Conn.Order("created_at desc").First(&dbCategory).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(dbCategory.ID, respCategory.ID) - eaa.Assert.Equal(dbCategory.Name, respCategory.Name) - - eaa.Assert.Equal((*body)["name"].(string), dbCategory.Name) - - return dbCategory.ID -} - -func AssertSampleCategoryBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response) uuid.UUID { - return AssertCategoryBodyRespDB(eaa, resp, SampleCategoryFactory()) -} - -func CreateSampleCategory(existingAppAssert h.ExistingAppAssert) (h.ExistingAppAssert, uuid.UUID) { - var sampleCategoryUUID uuid.UUID - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/categories/", - Body: SampleCategoryFactory(), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - sampleCategoryUUID = AssertSampleCategoryBodyRespDB(eaa, resp) - }, - }, - ) - - return existingAppAssert, sampleCategoryUUID -} - -func TestCreateCategoryWorks(t *testing.T) { - existingAppAssert, _ := CreateSampleCategory(h.InitTest(t)) - existingAppAssert.Close() -} - -func TestCreateCategoryIgnoresid(t *testing.T) { - h.InitTest(t).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/categories/", - Body: &map[string]interface{}{ - "id": 12, - "name": "Foo", - }, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertSampleCategoryBodyRespDB(eaa, resp) - }, - }, - ).Close() -} - -func Assert1Category(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumCategoriesRemainsAtN(eaa, resp, 1) -} - -func AssertNoCategories(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumCategoriesRemainsAtN(eaa, resp, 0) -} - -func AssertNumCategoriesRemainsAtN(eaa h.ExistingAppAssert, resp *http.Response, n int) { - var categories []models.Category - - err := eaa.App.Conn.Find(&categories).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(n, len(categories)) -} - -func TestCreateCategoryFailsIfNameIsNotString(t *testing.T) { - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/categories/", - Body: &map[string]interface{}{ - "name": 1231, - }, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToParseRequestBody, - Tester: AssertNoCategories, - }, - ).Close() -} - -func TestCreateCategoryFailsIfNameIsMissing(t *testing.T) { - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/categories/", - Body: &map[string]interface{}{}, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateCategory, - Tester: AssertNoCategories, - }, - ).Close() -} - -func TestCreateCategoryFailsIfCategoryWithThatNameAlreadyExists(t *testing.T) { - existingAppAssert, _ := CreateSampleCategory(h.InitTest(t)) - - TestNumCategoriesRemainsAt1 := func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumCategoriesRemainsAtN(eaa, resp, 1) - } - - for _, permutation := range h.AllCasingPermutations((*SampleCategoryFactory())["name"].(string)) { - modifiedSampleCategoryBody := *SampleCategoryFactory() - modifiedSampleCategoryBody["name"] = permutation - - existingAppAssert = existingAppAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/categories/", - Body: &modifiedSampleCategoryBody, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.CategoryAlreadyExists, - Tester: TestNumCategoriesRemainsAt1, - }, - ) - } - - existingAppAssert.Close() -} - -func TestGetCategoryWorks(t *testing.T) { - existingAppAssert, uuid := CreateSampleCategory(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s", uuid), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertSampleCategoryBodyRespDB(eaa, resp) - }, - }, - ).Close() -} - -func TestGetCategoryFailsBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s", badRequest), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestGetCategoryFailsNotFound(t *testing.T) { - h.InitTest(t).TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/categories/%s", uuid.New()), - Role: &models.Super, - }, errors.CategoryNotFound, - ).Close() -} - -func TestGetCategoriesWorks(t *testing.T) { - existingAppAssert, _ := CreateSampleCategory(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/categories/", - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var categories []models.Category - - err := eaa.App.Conn.Find(&categories).Error - - eaa.Assert.NilError(err) - - var respCategories []models.Category - - err = json.NewDecoder(resp.Body).Decode(&respCategories) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(respCategories)) - eaa.Assert.Equal(1, len(categories)) - - eaa.Assert.Equal(categories[0].ID, respCategories[0].ID) - - eaa.Assert.Equal(categories[0].Name, respCategories[0].Name) - - eaa.Assert.Equal((*SampleCategoryFactory())["name"].(string), categories[0].Name) - }, - }, - ).Close() -} - -func AssertUpdatedCategoryBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) { - var respCategory models.Category - - err := json.NewDecoder(resp.Body).Decode(&respCategory) - - eaa.Assert.NilError(err) - - var dbCategories []models.Category - - err = eaa.App.Conn.Find(&dbCategories).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(dbCategories)) - - dbCategory := dbCategories[0] - - eaa.Assert.Equal(dbCategory.ID, respCategory.ID) - eaa.Assert.Equal(dbCategory.Name, respCategory.Name) - - eaa.Assert.Equal((*body)["id"].(uuid.UUID), dbCategory.ID) - eaa.Assert.Equal((*body)["name"].(string), dbCategory.Name) -} - -func TestUpdateCategoryWorks(t *testing.T) { - existingAppAssert, uuid := CreateSampleCategory(h.InitTest(t)) - - category := map[string]interface{}{ - "id": uuid, - "name": "Arts & Crafts", - } - - AssertUpdatedCategoryBodyRespDB := func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertUpdatedCategoryBodyRespDB(eaa, resp, &category) - } - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/categories/%s", uuid), - Body: &category, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: AssertUpdatedCategoryBodyRespDB, - }, - ).Close() -} - -func TestUpdateCategoryWorksWithSameDetails(t *testing.T) { - existingAppAssert, uuid := CreateSampleCategory(h.InitTest(t)) - - category := *SampleCategoryFactory() - category["id"] = uuid - - AssertSampleCategoryBodyRespDB := func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertUpdatedCategoryBodyRespDB(eaa, resp, &category) - } - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/categories/%s", uuid), - Body: &category, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: AssertSampleCategoryBodyRespDB, - }, - ).Close() -} - -func TestUpdateCategoryFailsBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/categories/%s", badRequest), - Body: SampleCategoryFactory(), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestDeleteCategoryWorks(t *testing.T) { - existingAppAssert, uuid := CreateSampleCategory(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/categories/%s", uuid), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: AssertNoCategories, - }, - ).Close() -} - -func TestDeleteCategoryFailsBadRequest(t *testing.T) { - existingAppAssert, _ := CreateSampleCategory(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - existingAppAssert = existingAppAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/categories/%s", badRequest), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateID, - Tester: Assert1Category, - }, - ) - } - - existingAppAssert.Close() -} - -func TestDeleteCategoryFailsNotFound(t *testing.T) { - existingAppAssert, _ := CreateSampleCategory(h.InitTest(t)) - - existingAppAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/categories/%s", uuid.New()), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.CategoryNotFound, - Tester: Assert1Category, - }, - ).Close() -} diff --git a/backend/tests/api/club_contact_test.go b/backend/tests/api/club_contact_test.go deleted file mode 100644 index 5cce4c522..000000000 --- a/backend/tests/api/club_contact_test.go +++ /dev/null @@ -1,138 +0,0 @@ -package tests - -import ( - stdliberrors "errors" - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" - "gorm.io/gorm" -) - -func AssertCreateBadContactDataFails(t *testing.T, jsonKey string, badValues []interface{}) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - for _, badValue := range badValues { - sampleContactPermutation := *SampleContactFactory() - sampleContactPermutation[jsonKey] = badValue - - appAssert = appAssert.TestOnErrorAndTester(h.TestRequest{ - Method: fiber.MethodPut, - Path: fmt.Sprintf("/api/v1/clubs/%s/contacts", clubUUID), - Body: &sampleContactPermutation, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateContact, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumContactsRemainsAtN(eaa, resp, 0) - }, - }, - ) - } - appAssert.Close() -} - -func TestCreateContactFailsOnInvalidType(t *testing.T) { - AssertCreateBadContactDataFails(t, - "type", - []interface{}{ - "Not a valid type", - "@#139081#$Ad_Axf", - }, - ) -} - -func TestCreateContactFailsOnInvalidContent(t *testing.T) { - AssertCreateBadContactDataFails(t, - "content", - []interface{}{ - "Not a valid url", - "@#139081#$Ad_Axf", - }, - ) -} - -func TestPutContactFailsOnClubIdNotExist(t *testing.T) { - appAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester(h.TestRequest{ - Method: fiber.MethodPut, - Path: fmt.Sprintf("/api/v1/clubs/%s/contacts", uuid), - Body: SampleContactFactory(), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var club models.Club - - err := eaa.App.Conn.Where("id = ?", uuid).First(&club).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - }, - }, - ).Close() -} - -func TestPutContactUpdatesExistingContact(t *testing.T) { - appAssert, clubUUID, contactUUID := CreateSampleContact(h.InitTest(t)) - - updatedContact := SampleContactFactory() - (*updatedContact)["content"] = "nedFlanders@gmail.com" - - appAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodPut, - Path: fmt.Sprintf("/api/v1/clubs/%s/contacts", clubUUID), - Body: updatedContact, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbContact models.Contact - - err := eaa.App.Conn.Where("id = ?", contactUUID).First(&dbContact).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(dbContact.Content, (*updatedContact)["content"]) - }, - }, - ).Close() -} - -func TestGetClubContacts(t *testing.T) { - appAssert, clubUUID, _ := CreateManyContacts(h.InitTest(t)) - - appAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/clubs/%s/contacts", clubUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respContacts []models.Contact - var dbContacts []models.Contact - err := json.NewDecoder(resp.Body).Decode(&respContacts) - eaa.Assert.NilError(err) - - err = eaa.App.Conn.Where("club_id = ?", clubUUID).Find(&dbContacts).Error - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(respContacts), len(dbContacts)) - }, - }, - ) - - appAssert.Close() -} diff --git a/backend/tests/api/club_follower_test.go b/backend/tests/api/club_follower_test.go deleted file mode 100644 index 278dc637b..000000000 --- a/backend/tests/api/club_follower_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" -) - -func TestClubFollowerWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/clubs/%s/followers", clubUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var followers []models.User - - err := json.NewDecoder(resp.Body).Decode(&followers) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(followers)) - - var club models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).First(&club).Error - - eaa.Assert.NilError(err) - - var dbFollowers []models.User - - err = eaa.App.Conn.Model(&club).Association("Follower").Find(&dbFollowers) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(dbFollowers), len(followers)) - }, - }, - ).Close() -} diff --git a/backend/tests/api/club_member_test.go b/backend/tests/api/club_member_test.go deleted file mode 100644 index aab11d469..000000000 --- a/backend/tests/api/club_member_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" -) - -func TestClubMemberWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/clubs/%s/members", clubUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var members []models.User - - err := json.NewDecoder(resp.Body).Decode(&members) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(members)) - - var club models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).First(&club).Error - - eaa.Assert.NilError(err) - - var dbMembers []models.User - - err = eaa.App.Conn.Model(&club).Association("Member").Find(&dbMembers) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(dbMembers), len(members)) - }, - }, - ).Close() -} diff --git a/backend/tests/api/club_tag_test.go b/backend/tests/api/club_tag_test.go deleted file mode 100644 index c7dc6bbc3..000000000 --- a/backend/tests/api/club_tag_test.go +++ /dev/null @@ -1,269 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" -) - -func AssertClubTagsRespDB(eaa h.ExistingAppAssert, resp *http.Response, id uuid.UUID) { - var respTags []models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTags) - - eaa.Assert.NilError(err) - - var dbClub models.Club - - err = eaa.App.Conn.First(&dbClub, id).Error - - eaa.Assert.NilError(err) - - var dbTags []models.Tag - - err = eaa.App.Conn.Model(&dbClub).Association("Tag").Find(&dbTags) - - eaa.Assert.NilError(err) - - for i, respTag := range respTags { - eaa.Assert.Equal(respTag.ID, dbTags[i].ID) - eaa.Assert.Equal(respTag.Name, dbTags[i].Name) - eaa.Assert.Equal(respTag.CategoryID, dbTags[i].CategoryID) - } -} - -func AssertSampleClubTagsRespDB(eaa h.ExistingAppAssert, resp *http.Response, uuid uuid.UUID) { - AssertClubTagsRespDB(eaa, resp, uuid) -} - -func TestCreateClubTagsFailsOnInvalidDataType(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - invalidTags := []interface{}{ - []string{"1", "2", "34"}, - []models.Tag{{Name: "Test", CategoryID: uuid.UUID{}}, {Name: "Test2", CategoryID: uuid.UUID{}}}, - []float32{1.32, 23.5, 35.1}, - } - - for _, tag := range invalidTags { - malformedTag := *SampleTagIDsFactory(nil) - malformedTag["tags"] = tag - - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", clubUUID), - Body: &malformedTag, - Role: &models.Super, - }, - errors.FailedToParseRequestBody, - ) - } - - appAssert.Close() -} - -func TestCreateClubTagsFailsOnInvalidUserID(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags", badRequest), - Body: SampleTagIDsFactory(nil), - Role: &models.Student, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestCreateClubTagsFailsOnInvalidKey(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - invalidBody := []map[string]interface{}{ - { - "tag": UUIDSlice{uuid.New(), uuid.New()}, - }, - { - "tagIDs": []uint{1, 2, 3}, - }, - } - - for _, body := range invalidBody { - body := body - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", clubUUID), - Body: &body, - Role: &models.Student, - }, - errors.FailedToValidateClubTags, - ) - } - - appAssert.Close() -} - -func TestCreateClubTagsFailsOnNonExistentClub(t *testing.T) { - uuid := uuid.New() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", uuid), - Body: SampleTagIDsFactory(nil), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbClub models.Club - - err := eaa.App.Conn.First(&dbClub, uuid).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestCreateClubTagsWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - tagUUIDs, appAssert := CreateSetOfTags(appAssert) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", clubUUID), - Body: SampleTagIDsFactory(&tagUUIDs), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertSampleClubTagsRespDB(eaa, resp, clubUUID) - }, - }, - ) - - appAssert.Close() -} - -func TestCreateClubTagsNoneAddedIfInvalid(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", clubUUID), - Body: SampleTagIDsFactory(nil), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respTags []models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTags) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(respTags), 0) - }, - }, - ).Close() -} - -func TestGetClubTagsFailsOnNonExistentClub(t *testing.T) { - uuid := uuid.New() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbClub models.Club - - err := eaa.App.Conn.First(&dbClub, uuid).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestGetClubTagsReturnsEmptyListWhenNoneAdded(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", clubUUID), - Role: &models.Student, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respTags []models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTags) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(respTags), 0) - }, - }, - ).Close() -} - -func TestGetClubTagsReturnsCorrectList(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - tagUUIDs, appAssert := CreateSetOfTags(appAssert) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", clubUUID), - Body: SampleTagIDsFactory(&tagUUIDs), - Role: &models.Student, - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/clubs/%s/tags/", clubUUID), - Role: &models.Student, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertSampleClubTagsRespDB(eaa, resp, clubUUID) - }, - }, - ).Close() -} diff --git a/backend/tests/api/club_test.go b/backend/tests/api/club_test.go deleted file mode 100644 index c97f47ed0..000000000 --- a/backend/tests/api/club_test.go +++ /dev/null @@ -1,513 +0,0 @@ -package tests - -import ( - stdliberrors "errors" - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" - "gorm.io/gorm" -) - -func SampleClubFactory(userID *uuid.UUID) *map[string]interface{} { - return &map[string]interface{}{ - "user_id": userID, - "name": "Generate", - "preview": "Generate is Northeastern's premier student-led product development studio.", - "description": "https://s3.amazonaws.com//", - "is_recruiting": true, - "recruitment_cycle": "always", - "recruitment_type": "application", - "weekly_time_commitment": 10, - "one_word_to_describe_us": "muneer", - "application_link": "https://generatenu.com/apply", - "logo": "https://s3.amazonaws.com//", - } -} - -func AssertClubBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respClub models.Club - - err := json.NewDecoder(resp.Body).Decode(&respClub) - - eaa.Assert.NilError(err) - - var dbClubs []models.Club - - err = eaa.App.Conn.Order("created_at desc").Find(&dbClubs).Error - - eaa.Assert.NilError(err) - - dbClub := dbClubs[0] - - eaa.Assert.Equal(dbClub.ID, respClub.ID) - eaa.Assert.Equal(dbClub.Name, respClub.Name) - eaa.Assert.Equal(dbClub.Preview, respClub.Preview) - eaa.Assert.Equal(dbClub.Description, respClub.Description) - eaa.Assert.Equal(dbClub.NumMembers, respClub.NumMembers) - eaa.Assert.Equal(dbClub.IsRecruiting, respClub.IsRecruiting) - eaa.Assert.Equal(dbClub.RecruitmentCycle, respClub.RecruitmentCycle) - eaa.Assert.Equal(dbClub.RecruitmentType, respClub.RecruitmentType) - eaa.Assert.Equal(dbClub.WeeklyTimeCommitment, respClub.WeeklyTimeCommitment) - eaa.Assert.Equal(dbClub.OneWordToDescribeUs, respClub.OneWordToDescribeUs) - eaa.Assert.Equal(dbClub.ApplicationLink, respClub.ApplicationLink) - eaa.Assert.Equal(dbClub.Logo, respClub.Logo) - - var dbAdmins []models.Membership - - err = eaa.App.Conn.Where("club_id = ? AND membership_type = ?", dbClub.ID, models.MembershipTypeAdmin).Find(&dbAdmins).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(dbAdmins)) - - eaa.Assert.Equal(*(*body)["user_id"].(*uuid.UUID), dbAdmins[0].UserID) - eaa.Assert.Equal((*body)["name"].(string), dbClub.Name) - eaa.Assert.Equal((*body)["preview"].(string), dbClub.Preview) - eaa.Assert.Equal((*body)["description"].(string), dbClub.Description) - eaa.Assert.Equal((*body)["is_recruiting"].(bool), dbClub.IsRecruiting) - eaa.Assert.Equal(models.RecruitmentCycle((*body)["recruitment_cycle"].(string)), dbClub.RecruitmentCycle) - eaa.Assert.Equal(models.RecruitmentType((*body)["recruitment_type"].(string)), dbClub.RecruitmentType) - eaa.Assert.Equal((*body)["weekly_time_commitment"].(int), dbClub.WeeklyTimeCommitment) - eaa.Assert.Equal((*body)["one_word_to_describe_us"].(string), dbClub.OneWordToDescribeUs) - eaa.Assert.Equal((*body)["application_link"].(string), dbClub.ApplicationLink) - eaa.Assert.Equal((*body)["logo"].(string), dbClub.Logo) - - return dbClub.ID -} - -func AssertClubWithBodyRespDBMostRecent(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respClub models.Club - - err := json.NewDecoder(resp.Body).Decode(&respClub) - - eaa.Assert.NilError(err) - - var dbClub models.Club - - err = eaa.App.Conn.Order("created_at desc").First(&dbClub).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(dbClub.ID, respClub.ID) - eaa.Assert.Equal(dbClub.Name, respClub.Name) - eaa.Assert.Equal(dbClub.Preview, respClub.Preview) - eaa.Assert.Equal(dbClub.Description, respClub.Description) - eaa.Assert.Equal(dbClub.NumMembers, respClub.NumMembers) - eaa.Assert.Equal(dbClub.IsRecruiting, respClub.IsRecruiting) - eaa.Assert.Equal(dbClub.RecruitmentCycle, respClub.RecruitmentCycle) - eaa.Assert.Equal(dbClub.RecruitmentType, respClub.RecruitmentType) - eaa.Assert.Equal(dbClub.WeeklyTimeCommitment, respClub.WeeklyTimeCommitment) - eaa.Assert.Equal(dbClub.OneWordToDescribeUs, respClub.OneWordToDescribeUs) - eaa.Assert.Equal(dbClub.ApplicationLink, respClub.ApplicationLink) - eaa.Assert.Equal(dbClub.Logo, respClub.Logo) - - var dbAdmins []models.User - - err = eaa.App.Conn.Model(&dbClub).Association("Admins").Find(&dbAdmins) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(dbAdmins)) - - dbAdmin := dbAdmins[0] - - eaa.Assert.Equal((*body)["user_id"].(uuid.UUID), dbAdmin.ID) - eaa.Assert.Equal((*body)["name"].(string), dbClub.Name) - eaa.Assert.Equal((*body)["preview"].(string), dbClub.Preview) - eaa.Assert.Equal((*body)["description"].(string), dbClub.Description) - eaa.Assert.Equal((*body)["num_members"].(int), dbClub.NumMembers) - eaa.Assert.Equal((*body)["is_recruiting"].(bool), dbClub.IsRecruiting) - eaa.Assert.Equal((*body)["recruitment_cycle"].(string), dbClub.RecruitmentCycle) - eaa.Assert.Equal((*body)["recruitment_type"].(string), dbClub.RecruitmentType) - eaa.Assert.Equal((*body)["weekly_time_commitment"].(int), dbClub.WeeklyTimeCommitment) - eaa.Assert.Equal((*body)["one_word_to_describe_us"].(string), dbClub.OneWordToDescribeUs) - eaa.Assert.Equal((*body)["application_link"].(string), dbClub.ApplicationLink) - eaa.Assert.Equal((*body)["logo"].(string), dbClub.Logo) - - return dbClub.ID -} - -func AssertSampleClubBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, userID uuid.UUID) uuid.UUID { - sampleClub := SampleClubFactory(&userID) - return AssertClubBodyRespDB(eaa, resp, sampleClub) -} - -func CreateSampleClub(existingAppAssert h.ExistingAppAssert) (eaa h.ExistingAppAssert, studentUUID uuid.UUID, clubUUID uuid.UUID) { - var sampleClubUUID uuid.UUID - - newAppAssert := existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/clubs/", - Body: SampleClubFactory(nil), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer("user_id"), - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - sampleClubUUID = AssertSampleClubBodyRespDB(eaa, resp, eaa.App.TestUser.UUID) - }, - }, - ) - - return newAppAssert, newAppAssert.App.TestUser.UUID, sampleClubUUID -} - -func TestCreateClubWorks(t *testing.T) { - existingAppAssert, _, _ := CreateSampleClub(h.InitTest(t)) - existingAppAssert.Close() -} - -func TestGetClubsWorks(t *testing.T) { - existingAppAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/clubs/", - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respClubs []models.Club - - err := json.NewDecoder(resp.Body).Decode(&respClubs) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(respClubs)) - - respClub := respClubs[0] - - var dbClubs []models.Club - - err = eaa.App.Conn.Order("created_at desc").Find(&dbClubs).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(dbClubs)) // SAC super club AND the club we just created - - dbClub := dbClubs[0] - - eaa.Assert.Equal(dbClub.ID, respClub.ID) - eaa.Assert.Equal(dbClub.Name, respClub.Name) - eaa.Assert.Equal(dbClub.Preview, respClub.Preview) - eaa.Assert.Equal(dbClub.Description, respClub.Description) - eaa.Assert.Equal(dbClub.NumMembers, respClub.NumMembers) - eaa.Assert.Equal(dbClub.IsRecruiting, respClub.IsRecruiting) - eaa.Assert.Equal(dbClub.RecruitmentCycle, respClub.RecruitmentCycle) - eaa.Assert.Equal(dbClub.RecruitmentType, respClub.RecruitmentType) - eaa.Assert.Equal(dbClub.WeeklyTimeCommitment, respClub.WeeklyTimeCommitment) - eaa.Assert.Equal(dbClub.OneWordToDescribeUs, respClub.OneWordToDescribeUs) - eaa.Assert.Equal(dbClub.ApplicationLink, respClub.ApplicationLink) - eaa.Assert.Equal(dbClub.Logo, respClub.Logo) - }, - }, - ).Close() -} - -func AssertNumClubsRemainsAtN(eaa h.ExistingAppAssert, resp *http.Response, n int) { - var dbClubs []models.Club - - err := eaa.App.Conn.Order("created_at desc").Find(&dbClubs).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(n, len(dbClubs)) -} - -var TestNumClubsRemainsAt1 = func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumClubsRemainsAtN(eaa, resp, 1) -} - -func AssertCreateBadClubDataFails(t *testing.T, jsonKey string, badValues []interface{}) { - appAssert, uuid, _ := CreateSampleStudent(t, nil) - - for _, badValue := range badValues { - sampleClubPermutation := *SampleClubFactory(&uuid) - sampleClubPermutation[jsonKey] = badValue - - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/clubs/", - Body: &sampleClubPermutation, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateClub, - Tester: TestNumClubsRemainsAt1, - }, - ) - } - appAssert.Close() -} - -func TestCreateClubFailsOnInvalidDescription(t *testing.T) { - AssertCreateBadClubDataFails(t, - "description", - []interface{}{ - "Not an URL", - "@#139081#$Ad_Axf", - "https://google.com", - }, - ) -} - -func TestCreateClubFailsOnInvalidRecruitmentCycle(t *testing.T) { - AssertCreateBadClubDataFails(t, - "recruitment_cycle", - []interface{}{ - "1234", - "garbanzo", - "@#139081#$Ad_Axf", - "https://google.com", - }, - ) -} - -func TestCreateClubFailsOnInvalidRecruitmentType(t *testing.T) { - AssertCreateBadClubDataFails(t, - "recruitment_type", - []interface{}{ - "1234", - "garbanzo", - "@#139081#$Ad_Axf", - "https://google.com", - }, - ) -} - -func TestCreateClubFailsOnInvalidWeeklyTimeCommitment(t *testing.T) { - AssertCreateBadClubDataFails(t, - "weekly_time_commitment", - []interface{}{ - 0, - -1, - }, - ) -} - -func TestCreateClubFailsOnInvalidApplicationLink(t *testing.T) { - AssertCreateBadClubDataFails(t, - "application_link", - []interface{}{ - "Not an URL", - "@#139081#$Ad_Axf", - }, - ) -} - -func TestCreateClubFailsOnInvalidLogo(t *testing.T) { - AssertCreateBadClubDataFails(t, - "logo", - []interface{}{ - "Not an URL", - "@#139081#$Ad_Axf", - "https://google.com", - }, - ) -} - -func TestUpdateClubWorks(t *testing.T) { - appAssert, studentUUID, clubUUID := CreateSampleClub(h.InitTest(t)) - - updatedClub := SampleClubFactory(&studentUUID) - (*updatedClub)["name"] = "Updated Name" - (*updatedClub)["preview"] = "Updated Preview" - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/clubs/%s", clubUUID), - Body: updatedClub, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertClubBodyRespDB(eaa, resp, updatedClub) - }, - }, - ).Close() -} - -func TestUpdateClubFailsOnInvalidBody(t *testing.T) { - appAssert, studentUUID, clubUUID := CreateSampleClub(h.InitTest(t)) - - body := SampleClubFactory(&studentUUID) - - for _, invalidData := range []map[string]interface{}{ - {"description": "Not a URL"}, - {"recruitment_cycle": "1234"}, - {"recruitment_type": "ALLLLWAYSSSS"}, - {"application_link": "Not an URL"}, - {"logo": "@12394X_2"}, - } { - invalidData := invalidData - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/clubs/%s", clubUUID), - Body: &invalidData, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateClub, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbClubs []models.Club - - err := eaa.App.Conn.Order("created_at desc").Find(&dbClubs).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(dbClubs)) - - dbClub := dbClubs[0] - - var dbAdmins []models.Membership - - err = eaa.App.Conn.Where("club_id = ? AND membership_type = ?", dbClub.ID, models.MembershipTypeAdmin).Find(&dbAdmins).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(dbAdmins)) - - eaa.Assert.Equal(*(*body)["user_id"].(*uuid.UUID), dbAdmins[0].UserID) - eaa.Assert.Equal((*body)["name"].(string), dbClub.Name) - eaa.Assert.Equal((*body)["preview"].(string), dbClub.Preview) - eaa.Assert.Equal((*body)["description"].(string), dbClub.Description) - eaa.Assert.Equal((*body)["is_recruiting"].(bool), dbClub.IsRecruiting) - eaa.Assert.Equal(models.RecruitmentCycle((*body)["recruitment_cycle"].(string)), dbClub.RecruitmentCycle) - eaa.Assert.Equal(models.RecruitmentType((*body)["recruitment_type"].(string)), dbClub.RecruitmentType) - eaa.Assert.Equal((*body)["application_link"].(string), dbClub.ApplicationLink) - eaa.Assert.Equal((*body)["logo"].(string), dbClub.Logo) - }, - }, - ) - } - appAssert.Close() -} - -func TestUpdateClubFailsBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - sampleStudent, rawPassword := h.SampleStudentFactory() - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/clubs/%s", badRequest), - Body: h.SampleStudentJSONFactory(sampleStudent, rawPassword), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestUpdateClubFailsOnClubIdNotExist(t *testing.T) { - uuid := uuid.New() - - h.InitTest(t).TestOnErrorAndTester(h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/clubs/%s", uuid), - Body: SampleClubFactory(nil), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer("user_id"), - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var club models.Club - - err := eaa.App.Conn.Where("id = ?", uuid).First(&club).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - }, - }, - ).Close() -} - -func TestDeleteClubWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/clubs/%s", clubUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: TestNumClubsRemainsAt1, - }, - ).Close() -} - -func TestDeleteClubNotExist(t *testing.T) { - uuid := uuid.New() - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/clubs/%s", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var club models.Club - - err := eaa.App.Conn.Where("id = ?", uuid).First(&club).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - - AssertNumClubsRemainsAtN(eaa, resp, 1) - }, - }, - ).Close() -} - -func TestDeleteClubBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "hello", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/clubs/%s", badRequest), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} diff --git a/backend/tests/api/contact_test.go b/backend/tests/api/contact_test.go deleted file mode 100644 index 6bc3f70ee..000000000 --- a/backend/tests/api/contact_test.go +++ /dev/null @@ -1,279 +0,0 @@ -package tests - -import ( - stdliberrors "errors" - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" - "gorm.io/gorm" -) - -func SampleContactFactory() *map[string]interface{} { - return &map[string]interface{}{ - "type": "email", - "content": "jermaine@gmail.com", - } -} - -func ManyContactsFactory() map[string](*map[string]interface{}) { - arr := make(map[string]*map[string]interface{}) - - arr["facebook"] = &map[string]interface{}{ - "type": "facebook", - "content": "https://facebook.com/cheeseClub", - } - - arr["instagram"] = &map[string]interface{}{ - "type": "instagram", - "content": "https://instagram.com/cheeseClub", - } - - arr["x"] = &map[string]interface{}{ - "type": "x", - "content": "https://x.com/cheeseClub", - } - - arr["linkedin"] = &map[string]interface{}{ - "type": "linkedin", - "content": "https://linkedin.com/cheeseClub", - } - - arr["youtube"] = &map[string]interface{}{ - "type": "youtube", - "content": "https://youtube.com/cheeseClub", - } - - arr["github"] = &map[string]interface{}{ - "type": "github", - "content": "https://github.com/GeneratNU/sac", - } - - arr["slack"] = &map[string]interface{}{ - "type": "slack", - "content": "https://join.slack.com/cheeseClub", - } - - arr["discord"] = &map[string]interface{}{ - "type": "discord", - "content": "https://discord.gg/cheeseClub", - } - - arr["email"] = &map[string]interface{}{ - "type": "email", - "content": "cheeseClub@gmail.com", - } - - arr["customSite"] = &map[string]interface{}{ - "type": "customSite", - "content": "https://cheeseClub.com", - } - - return arr -} - -func AssertContactBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respContact models.Contact - - err := json.NewDecoder(resp.Body).Decode(&respContact) - - eaa.Assert.NilError(err) - - var dbContacts []models.Contact - - err = eaa.App.Conn.Order("created_at desc").Find(&dbContacts).Error - - eaa.Assert.NilError(err) - - dbContact := dbContacts[0] - - eaa.Assert.Equal(dbContact.ID, respContact.ID) - eaa.Assert.Equal(dbContact.Type, respContact.Type) - eaa.Assert.Equal(dbContact.Content, respContact.Content) - - return dbContact.ID -} - -func CreateSampleContact(existingAppAssert h.ExistingAppAssert) (eaa h.ExistingAppAssert, clubUUID uuid.UUID, contactUUID uuid.UUID) { - appAssert, _, clubUUID := CreateSampleClub(existingAppAssert) - - var sampleContactUUID uuid.UUID - - return appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPut, - Path: fmt.Sprintf("/api/v1/clubs/%s/contacts", clubUUID), - Body: SampleContactFactory(), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - sampleContactUUID = AssertContactBodyRespDB(eaa, resp, SampleContactFactory()) - AssertNumContactsRemainsAtN(eaa, resp, 1) - }, - }, - ), clubUUID, sampleContactUUID -} - -func CreateManyContacts(existingAppAssert h.ExistingAppAssert) (eaa h.ExistingAppAssert, clubUUID uuid.UUID, contactUUIDs map[string]uuid.UUID) { - existingAppAssert, _, clubUUID = CreateSampleClub(existingAppAssert) - - contactUUIDs = make(map[string]uuid.UUID) - - currentLength := 0 - for key, contact := range ManyContactsFactory() { - existingAppAssert = existingAppAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodPut, - Path: fmt.Sprintf("/api/v1/clubs/%s/contacts", clubUUID), - Body: contact, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - contactUUIDs[key] = AssertContactBodyRespDB(eaa, resp, contact) - currentLength++ - AssertNumContactsRemainsAtN(eaa, resp, currentLength) - }, - }, - ) - } - - return existingAppAssert, clubUUID, contactUUIDs -} - -func TestCreateManyContactsWorks(t *testing.T) { - existingAppAssert, _, _ := CreateManyContacts(h.InitTest(t)) - existingAppAssert.Close() -} - -func TestCreateContactWorks(t *testing.T) { - existingAppAssert, _, _ := CreateSampleContact(h.InitTest(t)) - existingAppAssert.Close() -} - -func AssertNumContactsRemainsAtN(eaa h.ExistingAppAssert, resp *http.Response, n int) { - var dbContacts []models.Contact - - err := eaa.App.Conn.Order("created_at desc").Find(&dbContacts).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(n, len(dbContacts)) -} - -func TestGetContactByIdWorks(t *testing.T) { - appAssert, _, contactUUID := CreateSampleContact(h.InitTest(t)) - - appAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/contacts/%s", contactUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respContact models.Contact - - err := json.NewDecoder(resp.Body).Decode(&respContact) - - eaa.Assert.NilError(err) - - var dbContacts []models.Contact - - err = eaa.App.Conn.Order("created_at desc").Find(&dbContacts).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(dbContacts[0].ID, respContact.ID) - eaa.Assert.Equal(dbContacts[0].Type, respContact.Type) - eaa.Assert.Equal(dbContacts[0].Content, respContact.Content) - }, - }, - ).Close() -} - -func TestGetContactFailsOnContactIdNotExist(t *testing.T) { - appAssert, _, _ := CreateSampleContact(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester(h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/contacts/%s", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.ContactNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var contact models.Contact - - err := eaa.App.Conn.Where("id = ?", uuid).First(&contact).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - }, - }, - ).Close() -} - -func TestDeleteContactWorks(t *testing.T) { - appAssert, _, contactUUID := CreateSampleContact(h.InitTest(t)) - - appAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/contacts/%s", contactUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var contact models.Contact - - err := eaa.App.Conn.Where("id = ?", contactUUID).First(&contact).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - }, - }, - ).Close() -} - -func TestDeleteContactFailsOnContactIdNotExist(t *testing.T) { - appAssert, _, _ := CreateSampleContact(h.InitTest(t)) - uuid := uuid.New() - - appAssert.TestOnErrorAndTester(h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/contacts/%s", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.ContactNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var contact models.Contact - err := eaa.App.Conn.Where("id = ?", uuid).First(&contact).Error - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - - AssertNumContactsRemainsAtN(eaa, resp, 1) - }, - }, - ).Close() -} - -// test that the request returns paginated contacts -func TestGetContactsWorks(t *testing.T) { - appAssert, _, _ := CreateManyContacts(h.InitTest(t)) - - appAssert.TestOnStatus(h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/contacts", - Role: &models.Super, - }, fiber.StatusOK, - ).Close() -} diff --git a/backend/tests/api/event_test.go b/backend/tests/api/event_test.go deleted file mode 100644 index 3e397317e..000000000 --- a/backend/tests/api/event_test.go +++ /dev/null @@ -1,660 +0,0 @@ -package tests - -import ( - stdliberrors "errors" - "fmt" - "net/http" - "testing" - "time" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" - "gorm.io/gorm" -) - -type EventFactory func(hostID uuid.UUID) *map[string]interface{} - -func SampleEventFactory(hostID uuid.UUID) *map[string]interface{} { - return &map[string]interface{}{ - "name": "Generate", - "preview": "Generate is Northeastern's premier student-led product development studio.", - "content": "Come join us for Generate's end-of-semester showcase", - "start_time": "2023-12-20T18:00:00Z", - "end_time": "2023-12-20T21:00:00Z", - "location": "Carter Fields", - "event_type": "open", - "is_recurring": false, - "host": hostID, - } -} - -func SampleSeriesFactory(hostID uuid.UUID) *map[string]interface{} { - return CustomSampleSeriesFactory( - hostID, - models.CreateSeriesRequestBody{ - RecurringType: "daily", - MaxOccurrences: 10, - }, - ) -} - -func CustomSampleSeriesFactory(hostID uuid.UUID, series models.CreateSeriesRequestBody) *map[string]interface{} { - return &map[string]interface{}{ - "name": "Software Development", - "preview": "CS4500 at northeastern", - "content": "Software development with ben lerner", - "start_time": "2024-03-20T18:00:00Z", - "end_time": "2024-03-20T21:00:00Z", - "location": "ISEC", - "event_type": "membersOnly", - "is_recurring": true, - "host": hostID, - "series": series, - } -} - -func CompareEventSlices(eaa h.ExistingAppAssert, dbEvents, respEvents []models.Event) { - for i, respEvent := range respEvents { - dbEvent := dbEvents[i] - CompareEvents(eaa, dbEvent, respEvent) - } -} - -func CompareEvents(eaa h.ExistingAppAssert, dbEvent, respEvent models.Event) { - eaa.Assert.Equal(dbEvent.ID, respEvent.ID) - eaa.Assert.Equal(dbEvent.Name, respEvent.Name) - eaa.Assert.Equal(dbEvent.Preview, respEvent.Preview) - eaa.Assert.Equal(dbEvent.Content, respEvent.Content) - eaa.Assert.Equal(dbEvent.StartTime.Compare(respEvent.StartTime), 0) - eaa.Assert.Equal(dbEvent.EndTime.Compare(respEvent.EndTime), 0) - eaa.Assert.Equal(dbEvent.Location, respEvent.Location) - eaa.Assert.Equal(dbEvent.IsRecurring, respEvent.IsRecurring) -} - -func GetRespAndDBEvents(eaa h.ExistingAppAssert, resp *http.Response) ([]models.Event, []models.Event) { - var respEventList []models.Event - - err := json.NewDecoder(resp.Body).Decode(&respEventList) - eaa.Assert.NilError(err) - - var dbEvents []models.Event - - err = eaa.App.Conn.Order("created_at desc").Find(&dbEvents).Error - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(respEventList), len(dbEvents)) - - return respEventList, dbEvents -} - -func AssertEventListBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) []uuid.UUID { - respEvents, dbEvents := GetRespAndDBEvents(eaa, resp) - - uuidList := []uuid.UUID{} - - for i, respEvent := range respEvents { - dbEvent := dbEvents[i] - - CompareEvents(eaa, dbEvent, respEvent) - - uuidList = append(uuidList, dbEvent.ID) - } - - return uuidList -} - -func AssertEventBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respEvent models.Event - - err := json.NewDecoder(resp.Body).Decode(&respEvent) - - eaa.Assert.NilError(err) - - var dbEvents []models.Event - - err = eaa.App.Conn.Order("created_at desc").Find(&dbEvents).Error - - eaa.Assert.NilError(err) - - dbEvent := dbEvents[0] - - CompareEvents(eaa, dbEvent, respEvent) - - bodyStartTime, err := time.Parse(time.RFC3339, (*body)["start_time"].(string)) - eaa.Assert.NilError(err) - bodyEndTime, err := time.Parse(time.RFC3339, (*body)["end_time"].(string)) - eaa.Assert.NilError(err) - - eaa.Assert.Equal((*body)["name"].(string), dbEvent.Name) - eaa.Assert.Equal((*body)["preview"].(string), dbEvent.Preview) - eaa.Assert.Equal((*body)["content"].(string), dbEvent.Content) - eaa.Assert.Equal(bodyStartTime.Compare(dbEvent.StartTime), 0) - eaa.Assert.Equal(bodyEndTime.Compare(dbEvent.EndTime), 0) - eaa.Assert.Equal((*body)["location"].(string), dbEvent.Location) - eaa.Assert.Equal(models.EventType((*body)["event_type"].(string)), dbEvent.EventType) - eaa.Assert.Equal((*body)["is_recurring"].(bool), dbEvent.IsRecurring) - - return dbEvent.ID -} - -func AssertSampleEventBodyRespDB(eaa h.ExistingAppAssert, hostID uuid.UUID, resp *http.Response) []uuid.UUID { - sampleEvent := SampleEventFactory(hostID) - return AssertEventListBodyRespDB(eaa, resp, sampleEvent) -} - -func CreateSampleEvent(existingAppAssert h.ExistingAppAssert, hostID uuid.UUID, factoryFunction EventFactory) (h.ExistingAppAssert, []uuid.UUID) { - var sampleEventUUIDs []uuid.UUID - - newAppAssert := existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/events/", - Body: factoryFunction(hostID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - sampleEventUUIDs = AssertSampleEventBodyRespDB(eaa, hostID, resp) - }, - }, - ) - - return newAppAssert, sampleEventUUIDs -} - -func AssertNumEventsRemainsAtN(eaa h.ExistingAppAssert, resp *http.Response, n int) { - var dbEvents []models.Event - - err := eaa.App.Conn.Order("created_at desc").Find(&dbEvents).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(n, len(dbEvents)) -} - -func AssertNumSeriesRemainsAtN(eaa h.ExistingAppAssert, resp *http.Response, n int) { - var dbSeries []models.Series - - err := eaa.App.Conn.Order("created_at desc").Find(&dbSeries).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(n, len(dbSeries)) -} - -func TestCreateEventWorks(t *testing.T) { - eaa, _, clubID := CreateSampleClub(h.InitTest(t)) - eaa, _ = CreateSampleEvent(eaa, clubID, SampleEventFactory) - eaa.Close() -} - -func TestCreateEventSeriesWorks(t *testing.T) { - eaa, _, clubID := CreateSampleClub(h.InitTest(t)) - eaa, _ = CreateSampleEvent(eaa, clubID, SampleSeriesFactory) - eaa.Close() -} - -func TestGetEventWorks(t *testing.T) { - existingAppAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - existingAppAssert, eventUUID := CreateSampleEvent(existingAppAssert, clubID, SampleEventFactory) - existingAppAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/events/%s", eventUUID[0]), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertEventListBodyRespDB(eaa, resp, SampleEventFactory(clubID)) - }, - }, - ).Close() -} - -func TestGetEventsWorks(t *testing.T) { - existingAppAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - existingAppAssert, _ = CreateSampleEvent(existingAppAssert, clubID, SampleEventFactory) - - existingAppAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/events/", - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - respEvents, dbEvents := GetRespAndDBEvents(eaa, resp) - - respEvent := respEvents[0] - - dbEvent := dbEvents[0] - - CompareEvents(eaa, dbEvent, respEvent) - }, - }, - ).Close() -} - -func TestGetSeriesByEventIDWorks(t *testing.T) { - existingAppAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - existingAppAssert, eventUUIDs := CreateSampleEvent(existingAppAssert, clubID, SampleSeriesFactory) - - existingAppAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/events/%s/series", eventUUIDs[2]), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - respEvents, dbEvents := GetRespAndDBEvents(eaa, resp) - CompareEventSlices(eaa, dbEvents, respEvents) - }, - }, - ).Close() -} - -func AssertCreateBadEventDataFails(t *testing.T, jsonKey string, badValues []interface{}, expectedErr errors.Error) { - appAssert, _, _ := CreateSampleStudent(t, nil) - appAssert, _, clubID := CreateSampleClub(appAssert) - - for _, badValue := range badValues { - sampleEventPermutation := *SampleEventFactory(clubID) - sampleEventPermutation[jsonKey] = badValue - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/events/", - Body: &sampleEventPermutation, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: expectedErr, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumEventsRemainsAtN(eaa, resp, 0) - }, - }, - ) - } - appAssert.Close() -} - -func TestCreateEventFailsOnInvalidStartTime(t *testing.T) { - AssertCreateBadEventDataFails(t, - "start_time", - []interface{}{ - "2023-12-20, 18:00", - }, - errors.FailedToParseRequestBody, - ) -} - -func TestCreateEventFailsOnInvalidEndTime(t *testing.T) { - AssertCreateBadEventDataFails(t, - "end_time", - []interface{}{ - "2023-12-20, 22:00", - }, - errors.FailedToParseRequestBody, - ) -} - -func TestCreateEventFailsOnEndTimeBeforeStartTime(t *testing.T) { - AssertCreateBadEventDataFails(t, - "end_time", - []interface{}{ - "2023-12-20T17:00:00Z", - }, - errors.FailedToValidateEvent, - ) -} - -func TestCreateEventFailsOnInvalidEventType(t *testing.T) { - AssertCreateBadEventDataFails(t, - "event_type", - []interface{}{ - "everyone", - "open membersOnly", - }, - errors.FailedToValidateEvent, - ) -} - -func AssertCreateBadEventSeriesDataFails(t *testing.T, badSeries models.CreateSeriesRequestBody, expectedErr errors.Error) { - appAssert, _, _ := CreateSampleStudent(t, nil) - appAssert, _, clubID := CreateSampleClub(appAssert) - - sampleSeriesPermutation := CustomSampleSeriesFactory(clubID, badSeries) - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/events/", - Body: sampleSeriesPermutation, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: expectedErr, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumEventsRemainsAtN(eaa, resp, 0) - }, - }, - ) - appAssert.Close() -} - -func TestCreateSeriesFailsOnInvalidRecurringType(t *testing.T) { - AssertCreateBadEventSeriesDataFails(t, - models.CreateSeriesRequestBody{ - RecurringType: "annually", - MaxOccurrences: 10, - }, - errors.FailedToValidateEventSeries, - ) -} - -func TestCreateSeriesFailsOnInvalidMaxOccurrences(t *testing.T) { - AssertCreateBadEventSeriesDataFails(t, - models.CreateSeriesRequestBody{ - RecurringType: "weekly", - MaxOccurrences: -1, - }, - errors.FailedToValidateEventSeries, - ) -} - -func TestUpdateEventWorks(t *testing.T) { - appAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - appAssert, eventUUID := CreateSampleEvent(appAssert, clubID, SampleEventFactory) - - updatedEvent := SampleEventFactory(clubID) - (*updatedEvent)["name"] = "Updated Name" - (*updatedEvent)["preview"] = "Updated Preview" - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/events/%s", eventUUID), - Body: updatedEvent, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertEventListBodyRespDB(eaa, resp, updatedEvent) - }, - }, - ).Close() -} - -func TestUpdateEventSeriesWorks(t *testing.T) { - appAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - appAssert, eventUUIDs := CreateSampleEvent(appAssert, clubID, SampleSeriesFactory) - - updatedSeries := &map[string]interface{}{ - "recurring_type": "daily", - "max_occurrences": 5, - "event_details": &map[string]interface{}{ - "name": "eece test", - "preview": "the best class ever", - "content": "EECE2322", - "start_time": "2023-09-20T16:34:50Z", - "end_time": "2023-09-20T18:34:50Z", - "location": "Richards 224", - "event_type": "open", - "is_recurring": true, - "host": clubID, - }, - } - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/events/%s/series", eventUUIDs[0]), - Body: updatedSeries, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertEventListBodyRespDB(eaa, resp, updatedSeries) - }, - }, - ).Close() -} - -func TestUpdateEventFailsOnInvalidBody(t *testing.T) { - appAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - appAssert, eventUUID := CreateSampleEvent(appAssert, clubID, SampleEventFactory) - - body := SampleEventFactory(clubID) - - for _, invalidData := range []map[string]interface{}{ - {"start_time": "Not a datetime"}, - {"end_time": "another non-datetime"}, - } { - invalidData := invalidData - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/events/%s", eventUUID), - Body: &invalidData, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToParseRequestBody, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbEvents []models.Event - - err := eaa.App.Conn.Order("created_at desc").Find(&dbEvents).Error - - eaa.Assert.NilError(err) - - dbEvent := dbEvents[0] - - bodyStartTime, err := time.Parse(time.RFC3339, (*body)["start_time"].(string)) - eaa.Assert.NilError(err) - bodyEndTime, err := time.Parse(time.RFC3339, (*body)["end_time"].(string)) - eaa.Assert.NilError(err) - - eaa.Assert.Equal((*body)["name"].(string), dbEvent.Name) - eaa.Assert.Equal((*body)["preview"].(string), dbEvent.Preview) - eaa.Assert.Equal((*body)["content"].(string), dbEvent.Content) - eaa.Assert.Equal(bodyStartTime.Compare(dbEvent.StartTime), 0) - eaa.Assert.Equal(bodyEndTime.Compare(dbEvent.EndTime), 0) - eaa.Assert.Equal((*body)["location"].(string), dbEvent.Location) - eaa.Assert.Equal(models.EventType((*body)["event_type"].(string)), dbEvent.EventType) - eaa.Assert.Equal((*body)["is_recurring"].(bool), dbEvent.IsRecurring) - }, - }, - ) - } - appAssert.Close() -} - -func TestUpdateEventFailsBadRequest(t *testing.T) { - appAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/events/%s", badRequest), - Body: SampleEventFactory(clubID), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestUpdateEventFailsOnEventIdNotExist(t *testing.T) { - eaa, _, clubID := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - eaa.TestOnErrorAndTester(h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/events/%s", uuid), - Body: SampleEventFactory(clubID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer("user_id"), - }, - h.ErrorWithTester{ - Error: errors.EventNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var event models.Event - - err := eaa.App.Conn.Where("id = ?", uuid).First(&event).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - }, - }, - ).Close() -} - -func TestUpdateSeriesFailsBadRequest(t *testing.T) { - appAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/events/%s/series", badRequest), - Body: SampleEventFactory(clubID), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func AssertDeleteWorks(t *testing.T, factoryFunction EventFactory, requestPath string, tester h.Tester) { - appAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - appAssert, eventUUIDs := CreateSampleEvent(appAssert, clubID, factoryFunction) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf(requestPath, eventUUIDs[0]), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: tester, - }, - ).Close() -} - -func TestDeleteEventWorks(t *testing.T) { - AssertDeleteWorks(t, SampleEventFactory, "/api/v1/events/%s", func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumEventsRemainsAtN(eaa, resp, 0) - }) -} - -func TestDeleteSeriesByEventIDWorks(t *testing.T) { - AssertDeleteWorks(t, SampleEventFactory, "/api/v1/events/%s", func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumEventsRemainsAtN(eaa, resp, 0) - AssertNumSeriesRemainsAtN(eaa, resp, 0) - }) -} - -func AssertDeleteNotExistFails(t *testing.T, factoryFunction EventFactory, requestPath string, tester h.Tester, badUUID uuid.UUID) { - appAssert, _, clubID := CreateSampleClub(h.InitTest(t)) - appAssert, _ = CreateSampleEvent(appAssert, clubID, factoryFunction) - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/events/%s", badUUID), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.EventNotFound, - Tester: tester, - }, - ).Close() -} - -func TestDeleteEventNotExist(t *testing.T) { - uuid := uuid.New() - - AssertDeleteNotExistFails(t, SampleEventFactory, "/api/v1/events/%s", func(eaa h.ExistingAppAssert, resp *http.Response) { - var event []models.Event - err := eaa.App.Conn.Where("id = ?", uuid).First(&event).Error - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - - AssertNumEventsRemainsAtN(eaa, resp, 1) - }, uuid) -} - -func TestDeleteSeriesNotExist(t *testing.T) { - uuid := uuid.New() - - AssertDeleteNotExistFails(t, SampleSeriesFactory, "/api/v1/events/%s/series", func(eaa h.ExistingAppAssert, resp *http.Response) { - var events []models.Event - err := eaa.App.Conn.Where("id = ?", uuid).First(&events).Error - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - - AssertNumSeriesRemainsAtN(eaa, resp, 1) - }, uuid) -} - -func AssertDeleteBadRequestFails(t *testing.T, requestPath string) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "hello", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf(requestPath, badRequest), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestDeleteEventBadRequest(t *testing.T) { - AssertDeleteBadRequestFails(t, "/api/v1/events/%s") -} - -func TestDeleteSeriesBadRequest(t *testing.T) { - AssertDeleteBadRequestFails(t, "/api/v1/events/%s/series") -} diff --git a/backend/tests/api/health_test.go b/backend/tests/api/health_test.go deleted file mode 100644 index 52e51fe9d..000000000 --- a/backend/tests/api/health_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package tests - -import ( - "testing" - - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/gofiber/fiber/v2" -) - -func TestHealthWorks(t *testing.T) { - h.InitTest(t).TestOnStatus( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/health", - }, - fiber.StatusOK, - ).Close() -} diff --git a/backend/tests/api/helpers/requests.go b/backend/tests/api/helpers/requests.go index a7bccc525..fca088662 100644 --- a/backend/tests/api/helpers/requests.go +++ b/backend/tests/api/helpers/requests.go @@ -8,8 +8,6 @@ import ( "strings" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - "github.com/gofiber/fiber/v2" "github.com/goccy/go-json" ) @@ -104,7 +102,7 @@ func (existingAppAssert ExistingAppAssert) TestOnStatus(request TestRequest, sta func (request *TestRequest) testOn(existingAppAssert ExistingAppAssert, status int, key string, value string) (ExistingAppAssert, *http.Response) { appAssert, resp := request.test(existingAppAssert) - if resp.StatusCode == fiber.StatusNoContent { + if resp.StatusCode == http.StatusNoContent { return appAssert, resp } @@ -121,22 +119,11 @@ func (request *TestRequest) testOn(existingAppAssert ExistingAppAssert, status i return appAssert, resp } -func (existingAppAssert ExistingAppAssert) TestOnError(request TestRequest, expectedError errors.Error) ExistingAppAssert { - appAssert, _ := request.testOn(existingAppAssert, expectedError.StatusCode, "error", expectedError.Message) - return appAssert -} - type ErrorWithTester struct { - Error errors.Error + Error error Tester Tester } -func (existingAppAssert ExistingAppAssert) TestOnErrorAndTester(request TestRequest, errorWithTester ErrorWithTester) ExistingAppAssert { - appAssert, resp := request.testOn(existingAppAssert, errorWithTester.Error.StatusCode, "error", errorWithTester.Error.Message) - errorWithTester.Tester(appAssert, resp) - return appAssert -} - func (existingAppAssert ExistingAppAssert) TestOnMessage(request TestRequest, status int, message string) ExistingAppAssert { request.testOn(existingAppAssert, status, "message", message) return existingAppAssert diff --git a/backend/tests/api/mocks/aws_mock.go b/backend/tests/api/mocks/aws_mock.go index 070d16fc9..28d72e690 100644 --- a/backend/tests/api/mocks/aws_mock.go +++ b/backend/tests/api/mocks/aws_mock.go @@ -4,7 +4,6 @@ import ( "mime/multipart" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/integrations/file" ) @@ -14,11 +13,11 @@ func NewAWSMockClient() file.FileClientInterface { return &AWSMockClient{} } -func (c *AWSMockClient) UploadFile(folder string, fileHeader *multipart.FileHeader, allowedTypes []file.FileType) (*models.FileInfo, *errors.Error) { +func (c *AWSMockClient) UploadFile(folder string, fileHeader *multipart.FileHeader, allowedTypes []file.FileType) (*models.FileInfo, error) { return nil, nil } -func (c *AWSMockClient) DeleteFile(fileURL string) *errors.Error { +func (c *AWSMockClient) DeleteFile(fileURL string) error { return nil } diff --git a/backend/tests/api/mocks/jwt_mock.go b/backend/tests/api/mocks/jwt_mock.go index 860da3134..221d3737b 100644 --- a/backend/tests/api/mocks/jwt_mock.go +++ b/backend/tests/api/mocks/jwt_mock.go @@ -2,7 +2,6 @@ package mocks import ( "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/errors" "github.com/golang-jwt/jwt" ) @@ -12,26 +11,26 @@ func NewJWTMockClient() auth.JWTClientInterface { return &JWTMockClient{} } -func (c *JWTMockClient) GenerateTokenPair(accessClaims, refreshClaims auth.Claims) (*auth.Token, *errors.Error) { +func (c *JWTMockClient) GenerateTokenPair(accessClaims, refreshClaims auth.Claims) (*auth.Token, error) { return &auth.Token{}, nil } -func (c *JWTMockClient) GenerateToken(claims auth.Claims, tokenType auth.JWTType) ([]byte, *errors.Error) { +func (c *JWTMockClient) GenerateToken(claims auth.Claims, tokenType auth.JWTType) ([]byte, error) { return []byte{}, nil } -func (c *JWTMockClient) RefreshToken(token, refreshToken string, tokenType auth.JWTType, newClaims jwt.MapClaims) ([]byte, *errors.Error) { +func (c *JWTMockClient) RefreshToken(token, refreshToken string, tokenType auth.JWTType, newClaims jwt.MapClaims) ([]byte, error) { return []byte{}, nil } -func (c *JWTMockClient) ExtractClaims(tokenString string, tokenType auth.JWTType) (jwt.MapClaims, *errors.Error) { +func (c *JWTMockClient) ExtractClaims(tokenString string, tokenType auth.JWTType) (jwt.MapClaims, error) { return jwt.MapClaims{}, nil } -func (c *JWTMockClient) ParseToken(tokenString string, tokenType auth.JWTType) (*jwt.Token, *errors.Error) { +func (c *JWTMockClient) ParseToken(tokenString string, tokenType auth.JWTType) (*jwt.Token, error) { return &jwt.Token{}, nil } -func (c *JWTMockClient) IsTokenValid(tokenString string, tokenType auth.JWTType) (bool, *errors.Error) { +func (c *JWTMockClient) IsTokenValid(tokenString string, tokenType auth.JWTType) (bool, error) { return true, nil } diff --git a/backend/tests/api/mocks/openai_mock.go b/backend/tests/api/mocks/openai_mock.go index 74919925e..cef61a620 100644 --- a/backend/tests/api/mocks/openai_mock.go +++ b/backend/tests/api/mocks/openai_mock.go @@ -1,7 +1,6 @@ package mocks import ( - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/integrations/search" ) @@ -11,10 +10,10 @@ func NewOpenAIMockClient() search.AIClientInterface { return &OpenAIMockClient{} } -func (c *OpenAIMockClient) CreateEmbedding(items []search.Searchable) ([]search.Embedding, *errors.Error) { +func (c *OpenAIMockClient) CreateEmbedding(items []search.Searchable) ([]search.Embedding, error) { return []search.Embedding{}, nil } -func (c *OpenAIMockClient) CreateModeration(items []search.Searchable) ([]search.ModerationResult, *errors.Error) { +func (c *OpenAIMockClient) CreateModeration(items []search.Searchable) ([]search.ModerationResult, error) { return []search.ModerationResult{}, nil } diff --git a/backend/tests/api/mocks/pinecone_mock.go b/backend/tests/api/mocks/pinecone_mock.go index ab6dfa661..36e3dddf1 100644 --- a/backend/tests/api/mocks/pinecone_mock.go +++ b/backend/tests/api/mocks/pinecone_mock.go @@ -1,7 +1,6 @@ package mocks import ( - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/integrations/search" "gorm.io/gorm" ) @@ -13,18 +12,18 @@ func NewPineconeMockClient() search.SearchClientInterface { return &PineconeMockClient{} } -func (c *PineconeMockClient) Upsert(items []search.Searchable) *errors.Error { +func (c *PineconeMockClient) Upsert(items []search.Searchable) error { return nil } -func (c *PineconeMockClient) Delete(items []search.Searchable) *errors.Error { +func (c *PineconeMockClient) Delete(items []search.Searchable) error { return nil } -func (c *PineconeMockClient) Search(item search.Searchable) ([]string, *errors.Error) { +func (c *PineconeMockClient) Search(item search.Searchable) ([]string, error) { return []string{}, nil } -func (c *PineconeMockClient) Seed(db *gorm.DB) *errors.Error { +func (c *PineconeMockClient) Seed(db *gorm.DB) error { return nil } diff --git a/backend/tests/api/mocks/resend_mock.go b/backend/tests/api/mocks/resend_mock.go index ce165e4dc..3482cb382 100644 --- a/backend/tests/api/mocks/resend_mock.go +++ b/backend/tests/api/mocks/resend_mock.go @@ -1,7 +1,6 @@ package mocks import ( - "github.com/GenerateNU/sac/backend/errors" "github.com/GenerateNU/sac/backend/integrations/email" ) @@ -11,18 +10,18 @@ func NewResendMockClient() email.EmailClientInterface { return &ResendMockClient{} } -func (c *ResendMockClient) SendPasswordResetEmail(name, email, token string) *errors.Error { +func (c *ResendMockClient) SendPasswordResetEmail(name, email, token string) error { return nil } -func (c *ResendMockClient) SendEmailVerification(email, code string) *errors.Error { +func (c *ResendMockClient) SendEmailVerification(email, code string) error { return nil } -func (c *ResendMockClient) SendWelcomeEmail(name, email string) *errors.Error { +func (c *ResendMockClient) SendWelcomeEmail(name, email string) error { return nil } -func (c *ResendMockClient) SendPasswordChangedEmail(name, email string) *errors.Error { +func (c *ResendMockClient) SendPasswordChangedEmail(name, email string) error { return nil } diff --git a/backend/tests/api/tag_test.go b/backend/tests/api/tag_test.go deleted file mode 100644 index f2c29fd35..000000000 --- a/backend/tests/api/tag_test.go +++ /dev/null @@ -1,389 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" - - "github.com/goccy/go-json" -) - -func SampleTagFactory(categoryID uuid.UUID) *map[string]interface{} { - return &map[string]interface{}{ - "name": "Generate", - "category_id": categoryID, - } -} - -func AssertTagWithBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respTag models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTag) - - eaa.Assert.NilError(err) - - var dbTag models.Tag - - err = eaa.App.Conn.First(&dbTag).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(dbTag.ID, respTag.ID) - eaa.Assert.Equal(dbTag.Name, respTag.Name) - eaa.Assert.Equal(dbTag.CategoryID, respTag.CategoryID) - - eaa.Assert.Equal((*body)["name"].(string), dbTag.Name) - eaa.Assert.Equal((*body)["category_id"].(uuid.UUID), dbTag.CategoryID) - - return dbTag.ID -} - -func AssertSampleTagBodyRespDB(t *testing.T, eaa h.ExistingAppAssert, resp *http.Response) uuid.UUID { - appAssert, uuid := CreateSampleCategory(eaa) - return AssertTagWithBodyRespDB(appAssert, resp, SampleTagFactory(uuid)) -} - -func CreateSampleTag(appAssert h.ExistingAppAssert) (existingAppAssert h.ExistingAppAssert, categoryUUID uuid.UUID, tagUUID uuid.UUID) { - appAssert, categoryUUID = CreateSampleCategory(appAssert) - - AssertSampleTagBodyRespDB := func(eaa h.ExistingAppAssert, resp *http.Response) { - tagUUID = AssertTagWithBodyRespDB(appAssert, resp, SampleTagFactory(categoryUUID)) - } - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/tags/", - Body: SampleTagFactory(categoryUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: AssertSampleTagBodyRespDB, - }, - ) - - return appAssert, categoryUUID, tagUUID -} - -func TestCreateTagWorks(t *testing.T) { - appAssert, _, _ := CreateSampleTag(h.InitTest(t)) - appAssert.Close() -} - -func AssertNumTagsRemainsAtN(eaa h.ExistingAppAssert, resp *http.Response, n int) { - var tags []models.Tag - - err := eaa.App.Conn.Find(&tags).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(n, len(tags)) -} - -func AssertNoTags(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumTagsRemainsAtN(eaa, resp, 0) -} - -func Assert1Tag(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumTagsRemainsAtN(eaa, resp, 1) -} - -func TestCreateTagFailsBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badBodys := []map[string]interface{}{ - { - "name": "Generate", - "category_id": "1", - }, - { - "name": 1, - "category_id": 1, - }, - } - - for _, badBody := range badBodys { - badBody := badBody - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/tags/", - Body: &badBody, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToParseRequestBody, - Tester: AssertNoTags, - }, - ) - } - - appAssert.Close() -} - -func TestCreateTagFailsValidation(t *testing.T) { - appAssert := h.InitTest(t) - - badBodys := []map[string]interface{}{ - { - "name": "Generate", - }, - { - "category_id": uuid.New(), - }, - {}, - } - - for _, badBody := range badBodys { - badBody := badBody - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/tags/", - Body: &badBody, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateTag, - Tester: AssertNoTags, - }, - ) - } - - appAssert.Close() -} - -func TestGetTagWorks(t *testing.T) { - existingAppAssert, categoryUUID, tagUUID := CreateSampleTag(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/tags/%s", tagUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertTagWithBodyRespDB(eaa, resp, SampleTagFactory(categoryUUID)) - }, - }, - ).Close() -} - -func TestGetTagFailsBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/tags/%s", badRequest), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestGetTagFailsNotFound(t *testing.T) { - h.InitTest(t).TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/tags/%s", uuid.New()), - Role: &models.Super, - }, - errors.TagNotFound, - ).Close() -} - -func TestUpdateTagWorksUpdateName(t *testing.T) { - existingAppAssert, categoryUUID, tagUUID := CreateSampleTag(h.InitTest(t)) - - generateNUTag := *SampleTagFactory(categoryUUID) - generateNUTag["name"] = "GenerateNU" - - AssertUpdatedTagBodyRespDB := func(eaa h.ExistingAppAssert, resp *http.Response) { - tagUUID = AssertTagWithBodyRespDB(eaa, resp, &generateNUTag) - } - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/tags/%s", tagUUID), - Body: &generateNUTag, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: AssertUpdatedTagBodyRespDB, - }, - ).Close() -} - -func TestUpdateTagWorksUpdateCategory(t *testing.T) { - existingAppAssert, _, tagUUID := CreateSampleTag(h.InitTest(t)) - - technologyCategory := *SampleCategoryFactory() - technologyCategory["name"] = "Technology" - - var technologyCategoryUUID uuid.UUID - - AssertNewCategoryBodyRespDB := func(eaa h.ExistingAppAssert, resp *http.Response) { - technologyCategoryUUID = AssertCategoryWithBodyRespDBMostRecent(eaa, resp, &technologyCategory) - } - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/categories/", - Body: &technologyCategory, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: AssertNewCategoryBodyRespDB, - }, - ) - - technologyTag := *SampleTagFactory(technologyCategoryUUID) - - AssertUpdatedTagBodyRespDB := func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertTagWithBodyRespDB(eaa, resp, &technologyTag) - } - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/tags/%s", tagUUID), - Body: &technologyTag, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: AssertUpdatedTagBodyRespDB, - }, - ).Close() -} - -func TestUpdateTagWorksWithSameDetails(t *testing.T) { - existingAppAssert, categoryUUID, tagUUID := CreateSampleTag(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/tags/%s", tagUUID), - Body: SampleTagFactory(categoryUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertTagWithBodyRespDB(eaa, resp, SampleTagFactory(categoryUUID)) - }, - }, - ).Close() -} - -func TestUpdateTagFailsBadRequest(t *testing.T) { - appAssert, uuid := CreateSampleCategory(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/tags/%s", badRequest), - Body: SampleTagFactory(uuid), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestDeleteTagWorks(t *testing.T) { - existingAppAssert, _, tagUUID := CreateSampleTag(h.InitTest(t)) - - existingAppAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/tags/%s", tagUUID), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: AssertNoTags, - }, - ).Close() -} - -func TestDeleteTagFailsBadRequest(t *testing.T) { - appAssert, _, _ := CreateSampleTag(h.InitTest(t)) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/tags/%s", badRequest), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateID, - Tester: Assert1Tag, - }, - ) - } - - appAssert.Close() -} - -func TestDeleteTagFailsNotFound(t *testing.T) { - appAssert, _, _ := CreateSampleTag(h.InitTest(t)) - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/tags/%s", uuid.New()), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.TagNotFound, - Tester: Assert1Tag, - }, - ).Close() -} diff --git a/backend/tests/api/user_follower_test.go b/backend/tests/api/user_follower_test.go deleted file mode 100644 index e860f2ed4..000000000 --- a/backend/tests/api/user_follower_test.go +++ /dev/null @@ -1,298 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/goccy/go-json" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" -) - -func TestCreateFollowingWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Follower").First(&user) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(user.Follower)) - - eaa.Assert.Equal(clubUUID, user.Follower[1].ID) - - var club models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Follower").First(&club) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(club.Follower)) - - eaa.Assert.Equal(eaa.App.TestUser.UUID, club.Follower[0].ID) - }, - }, - ).Close() -} - -func TestCreateFollowingFailsClubIdNotExists(t *testing.T) { - appAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", uuid), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var club models.Club - - err := eaa.App.Conn.Where("id = ?", uuid).First(&club).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestCreateFollowingFailsUserIdNotExists(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/%s/follower/%s", uuid, clubUUID), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestDeleteFollowingWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Follower").First(&user) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(user.Follower)) - - var club models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Follower").First(&club) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(0, len(club.Follower)) - }, - }, - ).Close() -} - -// TODO: test can't work because you become a follower when you create a club -// func TestDeleteFollwerNotFollower(t *testing.T) { -// appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - -// userClubsFollowerBefore, err := transactions.GetClubFollowing(appAssert.App.Conn, appAssert.App.TestUser.UUID) - -// appAssert.Assert.Assert(err == nil) - -// clubUsersFollowerBefore, err := transactions.GetClubFollowers(appAssert.App.Conn, clubUUID, 10, 0) - -// appAssert.Assert.Assert(err == nil) - -// appAssert.TestOnErrorAndTester( -// h.TestRequest{ -// Method: fiber.MethodDelete, -// Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", clubUUID), -// Role: &models.Super, -// TestUserIDReplaces: h.StringToPointer(":userID"), -// }, -// h.ErrorWithTester{ -// Error: errors.UserNotFollowingClub, -// Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { -// var user models.User - -// err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Follower").First(&user) - -// eaa.Assert.NilError(err) - -// eaa.Assert.Equal(userClubsFollowerBefore, user.Follower) - -// var club models.Club - -// err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Follower").First(&club) - -// eaa.Assert.NilError(err) - -// eaa.Assert.Equal(clubUsersFollowerBefore, club.Follower) -// }, -// }, -// ).Close() -// } - -func TestDeleteFollowingFailsClubIdNotExists(t *testing.T) { - appAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", uuid), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var club models.Club - - err := eaa.App.Conn.Where("id = ?", uuid).First(&club).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestDeleteFollowingFailsUserIdNotExists(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/%s/follower/%s", uuid, clubUUID), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestGetFollowingWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/follower/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/users/:userID/follower", - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var clubs []models.Club - - err := json.NewDecoder(resp.Body).Decode(&clubs) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(clubs)) - - var dbClubs []models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Follower").First(&dbClubs).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(clubs)) - }, - }, - ).Close() -} - -func TestGetFollowingFailsUserIdNotExists(t *testing.T) { - appAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/users/%s/follower", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} diff --git a/backend/tests/api/user_member_test.go b/backend/tests/api/user_member_test.go deleted file mode 100644 index 14a1d2180..000000000 --- a/backend/tests/api/user_member_test.go +++ /dev/null @@ -1,298 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/goccy/go-json" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" -) - -func TestCreateMembershipWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Member").First(&user) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(user.Member)) // SAC Super Club and the one just added - - eaa.Assert.Equal(clubUUID, user.Member[1].ID) // second club AKA the one just added - - var club models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Member").First(&club) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(club.Member)) - - eaa.Assert.Equal(eaa.App.TestUser.UUID, club.Member[0].ID) - }, - }, - ).Close() -} - -func TestCreateMembershipFailsClubIdNotExists(t *testing.T) { - appAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", uuid), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var club models.Club - - err := eaa.App.Conn.Where("id = ?", uuid).First(&club).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestCreateMembershipFailsUserIdNotExists(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/%s/member/%s", uuid, clubUUID), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestDeleteMembershipWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Member").First(&user) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(user.Member)) // SAC Super Club - - var club models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Member").First(&club) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(0, len(club.Member)) - }, - }, - ).Close() -} - -// TODO: test can't work because you become a member when you create a club -// func TestDeleteMembershipNotMembership(t *testing.T) { -// appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - -// userClubsMemberBefore, err := transactions.GetClubMembership(appAssert.App.Conn, appAssert.App.TestUser.UUID) - -// appAssert.Assert.Assert(err == nil) - -// clubUsersMemberBefore, err := transactions.GetClubMembers(appAssert.App.Conn, clubUUID, 10, 0) - -// appAssert.Assert.Assert(err == nil) - -// appAssert.TestOnErrorAndTester( -// h.TestRequest{ -// Method: fiber.MethodDelete, -// Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", clubUUID), -// Role: &models.Super, -// TestUserIDReplaces: h.StringToPointer(":userID"), -// }, -// h.ErrorWithTester{ -// Error: errors.UserNotMemberOfClub, -// Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { -// var user models.User - -// err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Member").First(&user) - -// eaa.Assert.NilError(err) - -// eaa.Assert.Equal(userClubsMemberBefore, user.Member) - -// var club models.Club - -// err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Member").First(&club) - -// eaa.Assert.NilError(err) - -// eaa.Assert.Equal(clubUsersMemberBefore, club.Member) -// }, -// }, -// ).Close() -// } - -func TestDeleteMembershipFailsClubIdNotExists(t *testing.T) { - appAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", uuid), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.ErrorWithTester{ - Error: errors.ClubNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var club models.Club - - err := eaa.App.Conn.Where("id = ?", uuid).First(&club).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestDeleteMembershipFailsUserIdNotExists(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/%s/member/%s", uuid, clubUUID), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestGetMembershipWorks(t *testing.T) { - appAssert, _, clubUUID := CreateSampleClub(h.InitTest(t)) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/:userID/member/%s", clubUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/users/:userID/member", - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var clubs []models.Club - - err := json.NewDecoder(resp.Body).Decode(&clubs) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(clubs)) // SAC Super Club and the one just added - - var dbClubs []models.Club - - err = eaa.App.Conn.Where("id = ?", clubUUID).Preload("Member").First(&dbClubs).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(clubs)) // SAC Super Club and the one just added - }, - }, - ).Close() -} - -func TestGetMembershipFailsUserIdNotExists(t *testing.T) { - appAssert, _, _ := CreateSampleClub(h.InitTest(t)) - - uuid := uuid.New() - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/users/%s/member", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} diff --git a/backend/tests/api/user_tag_test.go b/backend/tests/api/user_tag_test.go deleted file mode 100644 index 923659cd4..000000000 --- a/backend/tests/api/user_tag_test.go +++ /dev/null @@ -1,572 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/entities/users/tag" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/goccy/go-json" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" -) - -func SampleCategoriesFactory() *[]map[string]interface{} { - return &[]map[string]interface{}{ - { - "name": "Business", - }, - { - "name": "STEM", - }, - } -} - -func SampleTagsFactory(categoryIDs []uuid.UUID) *[]map[string]interface{} { - lenOfIDs := len(categoryIDs) - - return &[]map[string]interface{}{ - { - "name": "Computer Science", - "category_id": categoryIDs[1%lenOfIDs], - }, - { - "name": "Mechanical Engineering", - "category_id": categoryIDs[1%lenOfIDs], - }, - { - "name": "Finance", - "category_id": categoryIDs[0%lenOfIDs], - }, - } -} - -func SampleTagIDsFactory(tagIDs *[]uuid.UUID) *map[string]interface{} { - tags := tagIDs - - if tags == nil { - tags = &[]uuid.UUID{uuid.New()} - } - - return &map[string]interface{}{ - "tags": tags, - } -} - -func CreateSetOfTags(appAssert h.ExistingAppAssert) ([]uuid.UUID, h.ExistingAppAssert) { - categories := SampleCategoriesFactory() - - categoryIDs := []uuid.UUID{} - for _, category := range *categories { - category := category - appAssert = appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/categories/", - Body: &category, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respCategory models.Category - - err := json.NewDecoder(resp.Body).Decode(&respCategory) - - eaa.Assert.NilError(err) - - categoryIDs = append(categoryIDs, respCategory.ID) - }, - }, - ) - } - - tags := SampleTagsFactory(categoryIDs) - - tagIDs := []uuid.UUID{} - for _, tag := range *tags { - tag := tag - appAssert = appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/tags/", - Body: &tag, - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respTag models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTag) - - eaa.Assert.NilError(err) - - tagIDs = append(tagIDs, respTag.ID) - }, - }, - ) - } - - return tagIDs, appAssert -} - -func AssertUserTagsRespDB(eaa h.ExistingAppAssert, resp *http.Response, id uuid.UUID) { - var respTags []models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTags) - - eaa.Assert.NilError(err) - - var dbUser models.User - - err = eaa.App.Conn.First(&dbUser, id).Error - - eaa.Assert.NilError(err) - - var dbTags []models.Tag - err = eaa.App.Conn.Model(&dbUser).Association("Tag").Find(&dbTags) - - eaa.Assert.NilError(err) - - for i, respTag := range respTags { - eaa.Assert.Equal(respTag.ID, dbTags[i].ID) - eaa.Assert.Equal(respTag.Name, dbTags[i].Name) - eaa.Assert.Equal(respTag.CategoryID, dbTags[i].CategoryID) - } -} - -func AssertSampleUserTagsRespDB(eaa h.ExistingAppAssert, resp *http.Response, uuid uuid.UUID) { - AssertUserTagsRespDB(eaa, resp, uuid) -} - -func TestCreateUserTagsFailsOnInvalidDataType(t *testing.T) { - appAssert := h.InitTest(t) - - invalidTags := []interface{}{ - []string{"1", "2", "34"}, - []models.Tag{{Name: "Test", CategoryID: uuid.UUID{}}, {Name: "Test2", CategoryID: uuid.UUID{}}}, - []float32{1.32, 23.5, 35.1}, - } - - for _, tag := range invalidTags { - malformedTag := *SampleTagIDsFactory(nil) - malformedTag["tags"] = tag - - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/:userID/tags/", - Body: &malformedTag, - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - errors.FailedToParseRequestBody, - ) - } - - appAssert.Close() -} - -func TestCreateUserTagsFailsOnInvalidUserID(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/%s/tags", badRequest), - Body: SampleTagIDsFactory(nil), - Role: &models.Student, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -type UUIDSlice []uuid.UUID - -func TestCreateUserTagsFailsOnInvalidKey(t *testing.T) { - appAssert := h.InitTest(t) - - invalidBody := []map[string]interface{}{ - { - "tag": UUIDSlice{uuid.New(), uuid.New()}, - }, - { - "tagIDs": []uint{1, 2, 3}, - }, - } - - for _, body := range invalidBody { - body := body - - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/:userID/tags/", - Body: &body, - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - errors.FailedToValidateUserTags, - ) - } - - appAssert.Close() -} - -func TestCreateUserTagsFailsOnNonExistentUser(t *testing.T) { - uuid := uuid.New() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: fmt.Sprintf("/api/v1/users/%s/tags/", uuid), - Body: SampleTagIDsFactory(nil), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbUser models.User - err := eaa.App.Conn.First(&dbUser, uuid).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestCreateUserTagsWorks(t *testing.T) { - tagUUIDs, appAssert := CreateSetOfTags(h.InitTest(t)) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/:userID/tags/", - Body: SampleTagIDsFactory(&tagUUIDs), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertSampleUserTagsRespDB(eaa, resp, eaa.App.TestUser.UUID) - }, - }, - ) - - appAssert.Close() -} - -func TestCreateUserTagsNoneAddedIfInvalid(t *testing.T) { - h.InitTest(t).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/:userID/tags/", - Body: SampleTagIDsFactory(nil), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respTags []models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTags) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(respTags), 0) - }, - }, - ).Close() -} - -func TestGetUserTagsFailsOnNonExistentUser(t *testing.T) { - uuid := uuid.New() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/users/%s/tags/", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbUser models.User - - err := eaa.App.Conn.First(&dbUser, uuid).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestGetUserTagsReturnsEmptyListWhenNoneAdded(t *testing.T) { - h.InitTest(t).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/users/:userID/tags/", - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respTags []models.Tag - - err := json.NewDecoder(resp.Body).Decode(&respTags) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(respTags), 0) - }, - }, - ).Close() -} - -func TestGetUserTagsReturnsCorrectList(t *testing.T) { - tagUUIDs, appAssert := CreateSetOfTags(h.InitTest(t)) - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/:userID/tags/", - Body: SampleTagIDsFactory(&tagUUIDs), - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/users/:userID/tags/", - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertSampleUserTagsRespDB(eaa, resp, eaa.App.TestUser.UUID) - }, - }, - ).Close() -} - -func TestDeleteUserTagFailsOnNonExistentUser(t *testing.T) { - userID := uuid.New() - tagID := uuid.New() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/%s/tags/%s/", userID, tagID), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbUser models.User - - err := eaa.App.Conn.First(&dbUser, userID).Error - - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestDeleteUserTagFailsOnNonExistentTag(t *testing.T) { - tagID := uuid.New() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/tags/%s/", tagID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.ErrorWithTester{ - Error: errors.TagNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbTag models.Tag - - err := eaa.App.Conn.First(&dbTag, tagID).Error - eaa.Assert.Assert(err != nil) - }, - }, - ).Close() -} - -func TestDeleteUserTagFailsOnInvalidUserUUID(t *testing.T) { - appAssert := h.InitTest(t) - - badUserUUIDs := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badUserUUID := range badUserUUIDs { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/%s/tags/%s/", badUserUUID, uuid.New()), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestDeleteUserTagFailsOnInvalidTagUUID(t *testing.T) { - appAssert := h.InitTest(t) - - badTagUUIDs := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badTagUUID := range badTagUUIDs { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/tags/%s/", badTagUUID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestDeleteUserTagDoesNotAlterTagListOnNonAssociation(t *testing.T) { - tagUUIDs, appAssert := CreateSetOfTags(h.InitTest(t)) - appAssert.Assert.Assert(len(tagUUIDs) > 1) - - // Tag to be queried: - tagID := tagUUIDs[0] - - // Tags to be added to the user: - tagUUIDs = tagUUIDs[1:] - - appAssert.TestOnStatus( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/:userID/tags/", - Body: SampleTagIDsFactory(&tagUUIDs), - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - fiber.StatusCreated, - ) - - userTagsBeforeDeletion, err := tag.GetUserTags(appAssert.App.Conn, appAssert.App.TestUser.UUID) - appAssert.Assert.NilError(&err) - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/tags/%s/", tagID), - Role: &models.Super, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbUser models.User - - err := eaa.App.Conn.Where("id = ?", appAssert.App.TestUser.UUID).Preload("Tag").First(&dbUser).Error - eaa.Assert.NilError(err) - - eaa.Assert.Equal(dbUser.Tag, userTagsBeforeDeletion) - }, - }, - ).Close() -} - -func TestDeleteUserTagRemovesTagFromUser(t *testing.T) { - tagUUIDs, appAssert := CreateSetOfTags(h.InitTest(t)) - appAssert.Assert.Assert(len(tagUUIDs) > 1) - - tagID := tagUUIDs[0] - - appAssert.TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/:userID/tags/", - Body: SampleTagIDsFactory(&tagUUIDs), - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbUser models.User - - err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Tag").First(&dbUser) - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(dbUser.Tag), len(tagUUIDs)) - - var dbTag models.Tag - - err = eaa.App.Conn.Where("id = ?", tagID).Preload("User").First(&dbTag) - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(dbTag.User), 1) - }, - }, - ).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/:userID/tags/%s/", tagID), - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var dbUser models.User - - err := eaa.App.Conn.Where("id = ?", eaa.App.TestUser.UUID).Preload("Tag").First(&dbUser) - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(dbUser.Tag), len(tagUUIDs)-1) - - var dbTag models.Tag - - err = eaa.App.Conn.Where("id = ?", tagID).Preload("User").First(&dbTag) - eaa.Assert.NilError(err) - - eaa.Assert.Equal(len(dbTag.User), 0) - }, - }, - ) -} diff --git a/backend/tests/api/user_test.go b/backend/tests/api/user_test.go deleted file mode 100644 index 1179dc64b..000000000 --- a/backend/tests/api/user_test.go +++ /dev/null @@ -1,589 +0,0 @@ -package tests - -import ( - "fmt" - "net/http" - "testing" - - stdliberrors "errors" - - "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/entities/users" - usersBase "github.com/GenerateNU/sac/backend/entities/users/base" - "github.com/GenerateNU/sac/backend/errors" - h "github.com/GenerateNU/sac/backend/tests/api/helpers" - "github.com/gofiber/fiber/v2" - "github.com/google/uuid" - "gorm.io/gorm" - - "github.com/goccy/go-json" -) - -func TestGetUsersWorksForSuper(t *testing.T) { - h.InitTest(t).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/users/", - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var users []models.User - - err := json.NewDecoder(resp.Body).Decode(&users) - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(1, len(users)) - - respUser := users[0] - - eaa.Assert.Equal("SAC", respUser.FirstName) - eaa.Assert.Equal("Super", respUser.LastName) - eaa.Assert.Equal("generatesac@gmail.com", respUser.Email) - eaa.Assert.Equal(models.ComputerScience, respUser.Major0) - eaa.Assert.Equal(models.Major(""), respUser.Major1) - eaa.Assert.Equal(models.Major(""), respUser.Major2) - eaa.Assert.Equal(models.KCCS, respUser.College) - eaa.Assert.Equal(models.May, respUser.GraduationCycle) - eaa.Assert.Equal(int16(2025), respUser.GraduationYear) - - dbUsers, err := usersBase.GetUsers(eaa.App.Conn, 1, 1) - - eaa.Assert.NilError(&err) - - eaa.Assert.Equal(1, len(dbUsers)) - - dbUser := dbUsers[0] - - eaa.Assert.Equal(dbUser, respUser) - }, - }, - ).Close() -} - -func TestGetUsersFailsForStudent(t *testing.T) { - h.InitTest(t).TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/users/", - Role: &models.Student, - }, - errors.Forbidden, - ).Close() -} - -func TestGetUserWorks(t *testing.T) { - h.InitTest(t).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: "/api/v1/users/:userID", - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respUser models.User - - err := json.NewDecoder(resp.Body).Decode(&respUser) - - eaa.Assert.NilError(err) - - sampleStudent, rawPassword := h.SampleStudentFactory() - - sampleUser := *h.SampleStudentJSONFactory(sampleStudent, rawPassword) - - eaa.Assert.Equal(sampleUser["first_name"].(string), respUser.FirstName) - eaa.Assert.Equal(sampleUser["last_name"].(string), respUser.LastName) - eaa.Assert.Equal(sampleUser["email"].(string), respUser.Email) - eaa.Assert.Equal(models.Major(sampleUser["major0"].(string)), respUser.Major0) - eaa.Assert.Equal(models.Major(sampleUser["major1"].(string)), respUser.Major1) - eaa.Assert.Equal(models.Major(sampleUser["major2"].(string)), respUser.Major2) - eaa.Assert.Equal(models.College(sampleUser["college"].(string)), respUser.College) - eaa.Assert.Equal(models.GraduationCycle(sampleUser["graduation_cycle"].(string)), respUser.GraduationCycle) - eaa.Assert.Equal(int16(sampleUser["graduation_year"].(int)), respUser.GraduationYear) - - dbUser, err := users.GetUser(eaa.App.Conn, eaa.App.TestUser.UUID) - - eaa.Assert.NilError(&err) - - eaa.Assert.Equal(dbUser, &respUser) - }, - }, - ).Close() -} - -func TestGetUserFailsBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnError( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/users/%s", badRequest), - Role: &models.Super, - }, - errors.FailedToValidateID, - ) - } - - appAssert.Close() -} - -func TestGetUserFailsNotExist(t *testing.T) { - uuid := uuid.New() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodGet, - Path: fmt.Sprintf("/api/v1/users/%s", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - }, - }, - ).Close() -} - -func TestUpdateUserWorks(t *testing.T) { - newFirstName := "Michael" - newLastName := "Brennan" - - h.InitTest(t).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: "/api/v1/users/:userID", - Body: &map[string]interface{}{ - "first_name": newFirstName, - "last_name": newLastName, - }, - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusOK, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var respUser models.User - - err := json.NewDecoder(resp.Body).Decode(&respUser) - - eaa.Assert.NilError(err) - - sampleStudent, rawPassword := h.SampleStudentFactory() - - sampleStudentJSON := *h.SampleStudentJSONFactory(sampleStudent, rawPassword) - - eaa.Assert.Equal(newFirstName, respUser.FirstName) - eaa.Assert.Equal(newLastName, respUser.LastName) - eaa.Assert.Equal((sampleStudentJSON)["email"].(string), respUser.Email) - eaa.Assert.Equal(models.Major((sampleStudentJSON)["major0"].(string)), respUser.Major0) - eaa.Assert.Equal(models.Major((sampleStudentJSON)["major1"].(string)), respUser.Major1) - eaa.Assert.Equal(models.Major((sampleStudentJSON)["major2"].(string)), respUser.Major2) - eaa.Assert.Equal(models.College((sampleStudentJSON)["college"].(string)), respUser.College) - eaa.Assert.Equal(models.GraduationCycle(sampleStudentJSON["graduation_cycle"].(string)), respUser.GraduationCycle) - eaa.Assert.Equal(int16(sampleStudentJSON["graduation_year"].(int)), respUser.GraduationYear) - var dbUser models.User - - err = eaa.App.Conn.First(&dbUser, eaa.App.TestUser.UUID).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(dbUser.FirstName, respUser.FirstName) - eaa.Assert.Equal(dbUser.LastName, respUser.LastName) - eaa.Assert.Equal(dbUser.Email, respUser.Email) - eaa.Assert.Equal(dbUser.Major0, respUser.Major0) - eaa.Assert.Equal(dbUser.Major1, respUser.Major1) - eaa.Assert.Equal(dbUser.Major2, respUser.Major2) - eaa.Assert.Equal(dbUser.College, respUser.College) - eaa.Assert.Equal(dbUser.GraduationCycle, respUser.GraduationCycle) - eaa.Assert.Equal(dbUser.GraduationYear, respUser.GraduationYear) - }, - }, - ).Close() -} - -func TestUpdateUserFailsOnInvalidBody(t *testing.T) { - for _, invalidData := range []map[string]interface{}{ - {"email": "not.northeastern@gmail.com"}, - {"year": 1963}, - {"college": "UT-Austin"}, - } { - invalidData := invalidData - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: "/api/v1/users/:userID", - Body: &invalidData, - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateUser, - Tester: TestNumUsersRemainsAt2, - }, - ).Close() - } -} - -func TestUpdateUserFailsBadRequest(t *testing.T) { - badRequests := []string{ - "0", - "-1", - "1.1", - "foo", - "null", - } - - sampleStudent, rawPassword := h.SampleStudentFactory() - slightlyDifferentSampleStudentJSON := h.SampleStudentJSONFactory(sampleStudent, rawPassword) - (*slightlyDifferentSampleStudentJSON)["first_name"] = "John" - - for _, badRequest := range badRequests { - h.InitTest(t).TestOnError(h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/users/%s", badRequest), - Body: slightlyDifferentSampleStudentJSON, - Role: &models.Student, - }, - errors.FailedToValidateID, - ).Close() - } -} - -func TestUpdateUserFailsOnIdNotExist(t *testing.T) { - uuid := uuid.New() - - sampleStudent, rawPassword := h.SampleStudentFactory() - - h.InitTest(t).TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPatch, - Path: fmt.Sprintf("/api/v1/users/%s", uuid), - Body: h.SampleStudentJSONFactory(sampleStudent, rawPassword), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - }, - }, - ).Close() -} - -func TestDeleteUserWorks(t *testing.T) { - h.InitTest(t).TestOnStatusAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: "/api/v1/users/:userID", - Role: &models.Student, - TestUserIDReplaces: h.StringToPointer(":userID"), - }, - h.TesterWithStatus{ - Status: fiber.StatusNoContent, - Tester: TestNumUsersRemainsAt1, - }, - ).Close() -} - -func TestDeleteUserNotExist(t *testing.T) { - uuid := uuid.New() - - h.InitTest(t).TestOnErrorAndTester(h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/%s", uuid), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserNotFound, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - var user models.User - - err := eaa.App.Conn.Where("id = ?", uuid).First(&user).Error - - eaa.Assert.Assert(stdliberrors.Is(err, gorm.ErrRecordNotFound)) - - TestNumUsersRemainsAt1(eaa, resp) - }, - }, - ).Close() -} - -func TestDeleteUserBadRequest(t *testing.T) { - appAssert := h.InitTest(t) - - badRequests := []string{ - "0", - "-1", - "1.1", - "hello", - "null", - } - - for _, badRequest := range badRequests { - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodDelete, - Path: fmt.Sprintf("/api/v1/users/%s", badRequest), - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateID, - Tester: TestNumUsersRemainsAt1, - }, - ) - } - - appAssert.Close() -} - -func AssertUserWithIDBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response, body *map[string]interface{}) uuid.UUID { - var respUser models.User - - err := json.NewDecoder(resp.Body).Decode(&respUser) - - eaa.Assert.NilError(err) - - var dbUsers []models.User - - err = eaa.App.Conn.Find(&dbUsers).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(2, len(dbUsers)) - - dbUser := dbUsers[1] - - eaa.Assert.Equal(dbUser.FirstName, respUser.FirstName) - eaa.Assert.Equal(dbUser.LastName, respUser.LastName) - eaa.Assert.Equal(dbUser.Email, respUser.Email) - eaa.Assert.Equal(dbUser.Major0, respUser.Major0) - eaa.Assert.Equal(dbUser.Major1, respUser.Major1) - eaa.Assert.Equal(dbUser.Major2, respUser.Major2) - eaa.Assert.Equal(dbUser.College, respUser.College) - eaa.Assert.Equal(dbUser.GraduationCycle, respUser.GraduationCycle) - eaa.Assert.Equal(dbUser.GraduationYear, respUser.GraduationYear) - - match, err := auth.CompareHash((*body)["password"].(string), dbUser.PasswordHash) - - eaa.Assert.NilError(err) - - eaa.Assert.Assert(match) - - eaa.Assert.Equal((*body)["first_name"].(string), dbUser.FirstName) - eaa.Assert.Equal((*body)["last_name"].(string), dbUser.LastName) - eaa.Assert.Equal((*body)["email"].(string), dbUser.Email) - eaa.Assert.Equal(models.Major((*body)["major0"].(string)), dbUser.Major0) - eaa.Assert.Equal(models.Major((*body)["major1"].(string)), dbUser.Major1) - eaa.Assert.Equal(models.Major((*body)["major2"].(string)), dbUser.Major2) - eaa.Assert.Equal(models.College((*body)["college"].(string)), dbUser.College) - eaa.Assert.Equal(models.GraduationCycle((*body)["graduation_cycle"].(string)), dbUser.GraduationCycle) - eaa.Assert.Equal(int16((*body)["graduation_year"].(int)), dbUser.GraduationYear) - - return dbUser.ID -} - -func AssertSampleUserBodyRespDB(eaa h.ExistingAppAssert, resp *http.Response) uuid.UUID { - sampleStudent, rawPassword := h.SampleStudentFactory() - - return AssertUserWithIDBodyRespDB(eaa, resp, h.SampleStudentJSONFactory(sampleStudent, rawPassword)) -} - -func CreateSampleStudent(t *testing.T, existingAppAssert *h.ExistingAppAssert) (h.ExistingAppAssert, uuid.UUID, *map[string]interface{}) { - if existingAppAssert == nil { - newAppAssert := h.InitTest(t) - existingAppAssert = &newAppAssert - } - - var uuid uuid.UUID - - sampleStudent, rawPassword := h.SampleStudentFactory() - - existingAppAssert.TestOnStatusAndTester(h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/", - Body: h.SampleStudentJSONFactory(sampleStudent, rawPassword), - Role: &models.Super, - }, - h.TesterWithStatus{ - Status: fiber.StatusCreated, - Tester: func(eaa h.ExistingAppAssert, resp *http.Response) { - uuid = AssertSampleUserBodyRespDB(eaa, resp) - }, - }, - ) - - return *existingAppAssert, uuid, h.SampleStudentJSONFactory(sampleStudent, rawPassword) -} - -func AssertNumUsersRemainsAtN(eaa h.ExistingAppAssert, resp *http.Response, n int) { - var users []models.User - - err := eaa.App.Conn.Find(&users).Error - - eaa.Assert.NilError(err) - - eaa.Assert.Equal(n, len(users)) -} - -var TestNumUsersRemainsAt1 = func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumUsersRemainsAtN(eaa, resp, 1) -} - -var TestNumUsersRemainsAt2 = func(eaa h.ExistingAppAssert, resp *http.Response) { - AssertNumUsersRemainsAtN(eaa, resp, 2) -} - -func TestCreateUserWorks(t *testing.T) { - appAssert, _, _ := CreateSampleStudent(t, nil) - appAssert.Close() -} - -func TestCreateUserFailsIfUserWithEmailAlreadyExists(t *testing.T) { - appAssert, studentUUID, body := CreateSampleStudent(t, nil) - - (*body)["id"] = studentUUID - - appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/", - Body: body, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.UserAlreadyExists, - Tester: TestNumUsersRemainsAt2, - }, - ).Close() -} - -func AssertCreateBadDataFails(t *testing.T, jsonKey string, badValues []interface{}) { - appAssert := h.InitTest(t) - - sampleStudent, rawPassword := h.SampleStudentFactory() - - for _, badValue := range badValues { - sampleUserPermutation := *h.SampleStudentJSONFactory(sampleStudent, rawPassword) - sampleUserPermutation[jsonKey] = badValue - - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/", - Body: &sampleUserPermutation, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateUser, - Tester: TestNumUsersRemainsAt1, - }, - ) - } - - appAssert.Close() -} - -func TestCreateUserFailsOnInvalidEmail(t *testing.T) { - AssertCreateBadDataFails(t, - "email", - []interface{}{ - "doe.jane@northeastern", - "doe.jane", - "doe.jane@", - "doe.jane@northeastern.", - "doe.jane@northeastern.e", - "", - }) -} - -func TestCreateUserFailsOnInvalidPassword(t *testing.T) { - appAssert := h.InitTest(t) - - sampleStudent, rawPassword := h.SampleStudentFactory() - - inputsWithDesiredErr := []struct { - Password string - Error errors.Error - }{ - {"0", errors.InvalidPasswordNotLongEnough}, - {"foo", errors.InvalidPasswordNotLongEnough}, - {"abcdefgh", errors.InvalidPasswordNoDigit}, - {"abcdefg0", errors.InvalidPasswordNoSpecialCharacter}, - {"abcdefg@", errors.InvalidPasswordNoDigit}, - } - - for _, inputWithDesiredErr := range inputsWithDesiredErr { - sampleUserPermutation := *h.SampleStudentJSONFactory(sampleStudent, rawPassword) - sampleUserPermutation["password"] = inputWithDesiredErr.Password - - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/", - Body: &sampleUserPermutation, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: inputWithDesiredErr.Error, - Tester: TestNumUsersRemainsAt1, - }, - ) - } - - appAssert.Close() -} - -func TestCreateUserFailsOnMissingFields(t *testing.T) { - appAssert, _, _ := CreateSampleStudent(t, nil) - - sampleStudent, rawPassword := h.SampleStudentFactory() - - for _, missingField := range []string{ - "first_name", - "last_name", - "email", - "password", - } { - sampleUserPermutation := *h.SampleStudentJSONFactory(sampleStudent, rawPassword) - delete(sampleUserPermutation, missingField) - - appAssert = appAssert.TestOnErrorAndTester( - h.TestRequest{ - Method: fiber.MethodPost, - Path: "/api/v1/users/", - Body: &sampleUserPermutation, - Role: &models.Super, - }, - h.ErrorWithTester{ - Error: errors.FailedToValidateUser, - Tester: TestNumUsersRemainsAt2, - }, - ) - } - - appAssert.Close() -} diff --git a/backend/tests/domain/recurrence_test.go b/backend/tests/domain/recurrence_test.go new file mode 100644 index 000000000..a5584658e --- /dev/null +++ b/backend/tests/domain/recurrence_test.go @@ -0,0 +1,95 @@ +package tests + +import ( + "testing" + "time" + + "github.com/GenerateNU/sac/backend/protos" +) + +func TestRecurrenceUntilWeekly(t *testing.T) { + t.Parallel() + + recurrence, err := protos.NewRecurrence(protos.Weekly, protos.Wednesday) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) + end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) + termination := time.Date(2024, 2, 1, 0, 0, 0, 0, time.UTC) + + expected := []protos.Occurrence{ + {Start: start, End: end}, + {Start: time.Date(2024, 1, 10, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 10, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 17, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 17, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 24, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 24, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 31, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 31, 9, 0, 0, 0, time.UTC)}, + } + + validateOccurrences(t, recurrence, start, end, termination, expected) +} + +func TestRecurrenceUntilBiweekly(t *testing.T) { + t.Parallel() + + recurrence, err := protos.NewRecurrence(protos.Biweekly, protos.Wednesday) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) + end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) + termination := time.Date(2024, 3, 1, 0, 0, 0, 0, time.UTC) + + expected := []protos.Occurrence{ + {Start: start, End: end}, + {Start: time.Date(2024, 1, 17, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 17, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 31, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 31, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 2, 14, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 2, 14, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 2, 28, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 2, 28, 9, 0, 0, 0, time.UTC)}, + } + + validateOccurrences(t, recurrence, start, end, termination, expected) +} + +func TestRecurrenceUntilMonthly(t *testing.T) { + t.Parallel() + + recurrence, err := protos.NewRecurrence(protos.Monthly, protos.Wednesday) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) + end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) + termination := time.Date(2024, 4, 1, 0, 0, 0, 0, time.UTC) + + expected := []protos.Occurrence{ + {Start: start, End: end}, + {Start: time.Date(2024, 2, 3, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 2, 3, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 3, 3, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 3, 3, 9, 0, 0, 0, time.UTC)}, + } + + validateOccurrences(t, recurrence, start, end, termination, expected) +} + +func validateOccurrences(t *testing.T, recurrence *protos.Recurrence, start, end, termination time.Time, expected []protos.Occurrence) { + events, err := recurrence.ReccurUntil(start, end, termination) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if len(events) != len(expected) { + t.Errorf("expected %d events, got %d", len(expected), len(events)) + } + + for i, event := range events { + if event.Start != expected[i].Start { + t.Errorf("expected start time %v, got %v", expected[i].Start, event.Start) + } + if event.End != expected[i].End { + t.Errorf("expected end time %v, got %v", expected[i].End, event.End) + } + } +} diff --git a/backend/types/params.go b/backend/types/params.go index 6144d6c35..47a65a348 100644 --- a/backend/types/params.go +++ b/backend/types/params.go @@ -4,22 +4,45 @@ import ( "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/integrations" - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + utilityMiddleware "github.com/GenerateNU/sac/backend/middleware/utility" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) type RouteParams struct { - Router fiber.Router - AuthMiddleware *middleware.AuthMiddlewareService - ServiceParams ServiceParams + Router fiber.Router + AuthMiddleware *authMiddleware.AuthMiddlewareService + UtilityMiddleware *utilityMiddleware.UtilityMiddlewareService + ServiceParams ServiceParams +} + +func NewRouteParams(router fiber.Router, authMiddleware *authMiddleware.AuthMiddlewareService, utilityMiddleware *utilityMiddleware.UtilityMiddlewareService, serviceParams ServiceParams) RouteParams { + return RouteParams{ + Router: router, + AuthMiddleware: authMiddleware, + UtilityMiddleware: utilityMiddleware, + ServiceParams: serviceParams, + } } type ServiceParams struct { DB *gorm.DB Validate *validator.Validate - AuthSettings *config.AuthSettings + Auth *config.AuthSettings JWT auth.JWTClientInterface + Calendar *config.CalendarSettings Integrations integrations.Integrations } + +func NewServiceParams(db *gorm.DB, validate *validator.Validate, auth *config.AuthSettings, jwt auth.JWTClientInterface, calendar *config.CalendarSettings, integrations integrations.Integrations) ServiceParams { + return ServiceParams{ + DB: db, + Validate: validate, + Auth: auth, + JWT: jwt, + Calendar: calendar, + Integrations: integrations, + } +} diff --git a/backend/utilities/api_error.go b/backend/utilities/api_error.go new file mode 100644 index 000000000..7600ff9c3 --- /dev/null +++ b/backend/utilities/api_error.go @@ -0,0 +1,98 @@ +package utilities + +import ( + "errors" + "fmt" + "log/slog" + "net/http" + + "github.com/gofiber/fiber/v2" +) + +var ( + ErrNotFound = errors.New("not found") + ErrDuplicate = errors.New("duplicate") + ErrExpectedPagination = errors.New("expected pagination. make sure to use the fiberpaginate middleware") +) + +func IsNotFound(err error) bool { + return errors.Is(err, ErrNotFound) +} + +func IsDuplicate(err error) bool { + return errors.Is(err, ErrDuplicate) +} + +func IsExpectedPagination(err error) bool { + return errors.Is(err, ErrExpectedPagination) +} + +type APIError struct { + StatusCode int `json:"statusCode"` + Message any `json:"msg"` +} + +func (e APIError) Error() string { + return fmt.Sprintf("api error: %d", e.StatusCode) +} + +func NewAPIError(statusCode int, err error) APIError { + return APIError{ + StatusCode: statusCode, + Message: err.Error(), + } +} + +func InvalidRequestData(errors map[string]string) APIError { + return APIError{ + StatusCode: http.StatusUnprocessableEntity, + Message: errors, + } +} + +func BadRequest(err error) APIError { + return NewAPIError(http.StatusBadRequest, err) +} + +func InvalidJSON() APIError { + return NewAPIError(http.StatusBadRequest, fmt.Errorf("invalid JSON request data")) +} + +func Unauthorized() APIError { + return NewAPIError(http.StatusUnauthorized, fmt.Errorf("unauthorized")) +} + +func Forbidden() APIError { + return NewAPIError(http.StatusForbidden, fmt.Errorf("forbidden")) +} + +func Conflict() APIError { + return NewAPIError(http.StatusConflict, fmt.Errorf("conflict")) +} + +func InternalServerError() APIError { + return NewAPIError(http.StatusInternalServerError, fmt.Errorf("internal server error")) +} + +func ErrorHandler(c *fiber.Ctx, err error) error { + var apiErr APIError + + switch err { + case ErrNotFound: + apiErr = NewAPIError(http.StatusNotFound, err) + case ErrDuplicate: + apiErr = NewAPIError(http.StatusConflict, err) + case ErrExpectedPagination: + apiErr = NewAPIError(http.StatusInternalServerError, err) + default: + if castedErr, ok := err.(APIError); ok { + apiErr = castedErr + } else { + apiErr = InternalServerError() + } + } + + slog.Error("HTTP API error", "err", err.Error(), "method", c.Method(), "path", c.Path()) + + return c.Status(apiErr.StatusCode).JSON(apiErr) +} diff --git a/backend/utilities/manipulator.go b/backend/utilities/manipulator.go index ff0a1d791..9d37e0764 100644 --- a/backend/utilities/manipulator.go +++ b/backend/utilities/manipulator.go @@ -1,25 +1,36 @@ package utilities import ( - "github.com/mitchellh/mapstructure" + "fmt" + "strings" + + "github.com/go-viper/mapstructure/v2" ) -// MapRequestToModel maps request data to a target model using mapstructure -func MapRequestToModel[T any, U any](responseData T, targetModel *U) (*U, error) { +// MapJsonTags maps request data to a target model using mapstructure +// NOTE: this function does not correctly map time.Time fields from from to time.Time fields in intoType +// see the following GitHub issues: +// https://github.com/mitchellh/mapstructure/issues/334 +// https://github.com/go-viper/mapstructure/issues/20 +func MapJsonTags[From any, Into any](from From, intoType *Into) (*Into, error) { config := &mapstructure.DecoderConfig{ - Result: targetModel, + Result: intoType, TagName: "json", } decoder, err := mapstructure.NewDecoder(config) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to create decoder: %w", err) } - err = decoder.Decode(responseData) + err = decoder.Decode(from) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decode data: %w", err) } - return targetModel, nil + return intoType, nil +} + +func NormalizeEmail(email string) string { + return strings.ToLower(email) } diff --git a/backend/utilities/map.go b/backend/utilities/map.go new file mode 100644 index 000000000..653cc6182 --- /dev/null +++ b/backend/utilities/map.go @@ -0,0 +1,15 @@ +package utilities + +// MergeMaps merges multiple maps into a single map. +// The keys of maps earlier in the list will take precedence over keys in later maps. +func MergeMaps[K comparable, V any](maps ...map[K]V) map[K]V { + merged := make(map[K]V) + + for index := len(maps) - 1; index >= 0; index-- { + for k, v := range maps[index] { + merged[k] = v + } + } + + return merged +} diff --git a/backend/utilities/maybe_error.go b/backend/utilities/maybe_error.go new file mode 100644 index 000000000..a71fcce6b --- /dev/null +++ b/backend/utilities/maybe_error.go @@ -0,0 +1,21 @@ +package utilities + +type MaybeError struct { + Name string + Err error +} + +func NewMaybeError(name string, err error) *MaybeError { + return &MaybeError{ + Name: name, + Err: err, + } +} + +func (me *MaybeError) Unwrap() error { + return me.Err +} + +func (me *MaybeError) IsError() bool { + return me.Err != nil +} diff --git a/backend/utilities/pagination.go b/backend/utilities/pagination.go new file mode 100644 index 000000000..462d412db --- /dev/null +++ b/backend/utilities/pagination.go @@ -0,0 +1,12 @@ +package utilities + +import ( + "github.com/garrettladley/fiberpaginate" + "gorm.io/gorm" +) + +func IntoScope(p fiberpaginate.PageInfo, db *gorm.DB) func(db *gorm.DB) *gorm.DB { + return func(db *gorm.DB) *gorm.DB { + return db.Offset(p.Start()).Limit(p.Limit) + } +} diff --git a/backend/utilities/string.go b/backend/utilities/string.go new file mode 100644 index 000000000..4ac51703b --- /dev/null +++ b/backend/utilities/string.go @@ -0,0 +1,20 @@ +package utilities + +import ( + "strings" + "unicode" +) + +func ToSnakeCase(s string) string { + var builder strings.Builder + builder.Grow(len(s) * 2) // Preallocate space for efficiency + + for i, c := range s { + if i > 0 && unicode.IsUpper(c) { + builder.WriteRune('_') + } + builder.WriteRune(unicode.ToLower(c)) + } + + return builder.String() +} diff --git a/backend/utilities/validator.go b/backend/utilities/validator.go index b4cb1b611..22edbf8a9 100644 --- a/backend/utilities/validator.go +++ b/backend/utilities/validator.go @@ -1,12 +1,11 @@ package utilities import ( + "fmt" "reflect" - "strconv" "strings" "github.com/GenerateNU/sac/backend/entities/models" - "github.com/GenerateNU/sac/backend/errors" "github.com/google/uuid" "github.com/mcnijman/go-emailaddress" @@ -60,7 +59,10 @@ func validateS3URL(fl validator.FieldLevel) bool { } func validateContactPointer(validate *validator.Validate, fl validator.FieldLevel) bool { - contact, ok := fl.Parent().Interface().(models.PutContactRequestBody) + contact, ok := fl.Parent().Interface().(struct { + Type models.ContactType + Content string + }) if !ok { return false } @@ -93,21 +95,48 @@ func validateNotEqualIfNotEmpty(fl validator.FieldLevel) bool { return field == "" || field != otherField } -func ValidateID(id string) (*uuid.UUID, *errors.Error) { +func ValidateID(id string) (*uuid.UUID, error) { idAsUUID, err := uuid.Parse(id) if err != nil { - return nil, &errors.FailedToValidateID + return nil, err } return &idAsUUID, nil } -func ValidateNonNegative(value string) (*int, *errors.Error) { - valueAsInt, err := strconv.Atoi(value) +func Validate(validate *validator.Validate, s any, maybeErrs ...MaybeError) error { + hasErrors := false + var maybeErrors map[string]string + + for _, maybeErr := range maybeErrs { + if maybeErr.Err != nil { + if !hasErrors { + maybeErrors = make(map[string]string) + hasErrors = true + } + maybeErrors[ToSnakeCase(maybeErr.Name)] = maybeErr.Err.Error() + } + } + + var validationErrors map[string]string + if err := validate.Struct(s); err != nil { + validationErrs, ok := err.(validator.ValidationErrors) + if ok { + if !hasErrors { + validationErrors = make(map[string]string) + hasErrors = true + } + for _, validationErr := range validationErrs { + validationErrors[ToSnakeCase(validationErr.Field())] = fmt.Sprintf("%s failed %s", validationErr.Field(), validationErr.Tag()) + } + } else { + return fmt.Errorf("failed to validate struct: %w", err) + } + } - if err != nil || valueAsInt < 0 { - return nil, &errors.FailedToValidateNonNegativeValue + if hasErrors { + return InvalidRequestData(MergeMaps(maybeErrors, validationErrors)) } - return &valueAsInt, nil + return nil } diff --git a/cli/cmd/lint.go b/cli/cmd/lint.go index b97d87078..c1115ce4f 100644 --- a/cli/cmd/lint.go +++ b/cli/cmd/lint.go @@ -102,7 +102,7 @@ var lintBackendCmd = &cobra.Command{ os.Exit(1) } - err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix"), helpers.BACKEND_DIR) + err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix", "--timeout=1m"), helpers.BACKEND_DIR) if err != nil { fmt.Println(err) os.Exit(1) @@ -122,7 +122,7 @@ var lintCliCmd = &cobra.Command{ os.Exit(1) } - err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix"), helpers.CLI_DIR) + err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix", "--timeout=1m"), helpers.CLI_DIR) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/cli/cmd/pinecone.go b/cli/cmd/pinecone.go new file mode 100644 index 000000000..768571e00 --- /dev/null +++ b/cli/cmd/pinecone.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "fmt" + "os" + "os/exec" + + "github.com/GenerateNU/sac/cli/helpers" + "github.com/spf13/cobra" +) + +var seedPineconeCmd = &cobra.Command{ + Use: "seed-pinecone", + Short: "Seed Pinecone", + Run: func(cmd *cobra.Command, args []string) { + err := helpers.Execute(exec.Command("go", "run", "main.go", "seed-pinecone"), helpers.BACKEND_DIR) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + }, +} + +func init() { + rootCmd.AddCommand(seedPineconeCmd) +} diff --git a/cli/cmd/run.go b/cli/cmd/run.go index a406a99b6..4a125873f 100644 --- a/cli/cmd/run.go +++ b/cli/cmd/run.go @@ -19,6 +19,9 @@ func init() { rootCmd.AddCommand(runCmd) runCmd.AddCommand(runFeCmd) runCmd.AddCommand(runBeCmd) + runBeCmd.Flags().BoolP("migrate", "m", false, "Specify if you want to only perform the database migration") + runBeCmd.Flags().BoolP("seed-pinecone", "s", false, "Specify if you want to only perform the pinecone database seeding") + runBeCmd.Flags().BoolP("connect-to-pinecone", "c", false, "Connect to a real Pinecone instance instead of mock") runFeCmd.AddCommand(runWebCmd) runFeCmd.AddCommand(runMobileCmd) @@ -34,10 +37,40 @@ var runBeCmd = &cobra.Command{ Aliases: []string{"be"}, Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - err := helpers.Execute(exec.Command("go", "run", "main.go"), helpers.BACKEND_DIR) - if err != nil { - fmt.Println(err) - os.Exit(1) + migrate, _ := cmd.Flags().GetBool("migrate") + seedPinecone, _ := cmd.Flags().GetBool("seed-pinecone") + connectToPinecone, _ := cmd.Flags().GetBool("connect-to-pinecone") + + if migrate { + err := helpers.Execute(exec.Command("go", "run", "main.go", "--only-migrate"), helpers.BACKEND_DIR) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } + + if seedPinecone { + err := helpers.Execute(exec.Command("go", "run", "main.go", "--seed-pinecone"), helpers.BACKEND_DIR) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } + + if connectToPinecone { + err := helpers.Execute(exec.Command("go", "run", "main.go", "--connect-to-pinecone"), helpers.BACKEND_DIR) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } + + if !migrate && !seedPinecone && !connectToPinecone { + err := helpers.Execute(exec.Command("go", "run", "main.go"), helpers.BACKEND_DIR) + if err != nil { + fmt.Println(err) + os.Exit(1) + } } }, } @@ -72,7 +105,13 @@ var runMobileCmd = &cobra.Command{ platform = "run:" + platform - err := helpers.Execute(exec.Command("npx", "expo", platform), helpers.MOBILE_DIR) + output := exec.Command("npx", "expo", platform) + output.Dir = helpers.MOBILE_DIR + output.Stdout = os.Stdout + output.Stderr = os.Stderr + output.Stdin = os.Stdin + + err := helpers.Execute(output, helpers.MOBILE_DIR) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/cli/go.mod b/cli/go.mod index 699160ebc..720759964 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -13,6 +13,7 @@ require ( github.com/awnumar/memguard v0.22.5 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/garrettladley/mattress v0.4.0 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/joho/godotenv v1.5.1 // indirect @@ -28,10 +29,11 @@ require ( github.com/spf13/viper v1.18.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.23.0 // indirect golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/cli/go.sum b/cli/go.sum index acccd3ded..b1cae943d 100644 --- a/cli/go.sum +++ b/cli/go.sum @@ -15,16 +15,19 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/garrettladley/mattress v0.4.0 h1:ZB3iqyc5q6bqIryNfsh2FMcbMdnV1XEryvqivouceQE= github.com/garrettladley/mattress v0.4.0/go.mod h1:OWKIRc9wC3gtD3Ng/nUuNEiR1TJvRYLmn/KZYw9nl5Q= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -70,18 +73,18 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/config/local.yml b/config/local.yml index 8a88af9b2..2b1afe5fa 100644 --- a/config/local.yml +++ b/config/local.yml @@ -13,4 +13,6 @@ superuser: password: Password#!1 auth: accesskey: g(r|##*?>\Qp}h37e+,T2 - refreshkey: amk*2!gG}1i"8D9RwJS$p \ No newline at end of file + refreshkey: amk*2!gG}1i"8D9RwJS$p +calendar: + maxterminationdate: 12-31-2024 diff --git a/frontend/.gitignore b/frontend/.gitignore deleted file mode 100644 index 2187e0dce..000000000 --- a/frontend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.expo/ \ No newline at end of file diff --git a/frontend/dashboard/components.json b/frontend/dashboard/components.json new file mode 100644 index 000000000..8c574b77e --- /dev/null +++ b/frontend/dashboard/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/frontend/dashboard/lib/utils.ts b/frontend/dashboard/lib/utils.ts new file mode 100644 index 000000000..d084ccade --- /dev/null +++ b/frontend/dashboard/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/frontend/dashboard/package.json b/frontend/dashboard/package.json index f37b2d22e..a7cb2c850 100644 --- a/frontend/dashboard/package.json +++ b/frontend/dashboard/package.json @@ -8,30 +8,42 @@ "start": "next start", "lint": "next lint", "format": "prettier --write .", - "test": "echo \"Woah there, we have no frontend tests as of right now. Let's just say we're passing.\" && exit 0" + "test": "jest" }, "dependencies": { - "@reduxjs/toolkit": "^2.2.3", + "@generatesac/lib": "^0.0.1", + "@radix-ui/react-slot": "^1.0.2", + "@reduxjs/toolkit": "^2.2.4", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "lucide-react": "^0.378.0", "next": "14.2.3", "react": "^18", "react-dom": "^18", "react-redux": "^9.1.1", - "@sac/lib": "*", - "zod": "^3.23.4" + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "jest": { + "preset": "ts-jest", + "testEnvironment": "node" }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/jest": "^29.5.12", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.4.19", "eslint": "^8", "eslint-config-next": "14.2.3", - "jest": "^29.2.1", + "eslint-plugin-prettier": "^5.1.3", + "jest": "^29.7.0", "postcss": "^8", + "prettier": "^3.2.4", "tailwindcss": "^3.4.1", - "typescript": "^5", - "@trivago/prettier-plugin-sort-imports": "^4.3.0", - "eslint-plugin-prettier": "^5.1.3", - "prettier": "^3.2.4" + "ts-jest": "^29.1.2", + "typescript": "5.4.5" } } diff --git a/frontend/dashboard/src/app/globals.css b/frontend/dashboard/src/app/globals.css index 875c01e81..b0e6fff59 100644 --- a/frontend/dashboard/src/app/globals.css +++ b/frontend/dashboard/src/app/globals.css @@ -1,33 +1,76 @@ @tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} - -@layer utilities { - .text-balance { - text-wrap: balance; + @tailwind components; + @tailwind utilities; + + @layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } } -} + + @layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } + } \ No newline at end of file diff --git a/frontend/dashboard/src/app/layout.tsx b/frontend/dashboard/src/app/layout.tsx index a8d3cca5b..f4e2e85de 100644 --- a/frontend/dashboard/src/app/layout.tsx +++ b/frontend/dashboard/src/app/layout.tsx @@ -1,9 +1,13 @@ import type { Metadata } from "next"; -import { Inter } from "next/font/google"; +import { Inter as FontSans } from "next/font/google" import "./globals.css"; import StoreProvider from "../store/StoreProvider"; +import { cn } from "@/lib/utils" -const inter = Inter({ subsets: ["latin"] }); +const fontSans = FontSans({ + subsets: ["latin"], + variable: "--font-sans", +}) export const metadata: Metadata = { title: "Create Next App", @@ -18,7 +22,12 @@ export default function RootLayout({ return ( - {children} + {children} ); diff --git a/frontend/dashboard/src/app/page.tsx b/frontend/dashboard/src/app/page.tsx index 3763448a3..c26fb593c 100644 --- a/frontend/dashboard/src/app/page.tsx +++ b/frontend/dashboard/src/app/page.tsx @@ -27,7 +27,6 @@ export default function Home() { -
-
) { + return produce(state, draft => { + Object.assign(draft, action.payload); + }); + }, + updateClub(state, action: PayloadAction) { + return produce(state, draft => { + Object.assign(draft, action.payload); + }); + }, + resetClub() { + return initialState; + } + } +}) + +export const { setClub, updateClub, resetClub } = clubSlice.actions; +export const clubReducer = clubSlice.reducer; \ No newline at end of file diff --git a/frontend/dashboard/src/app/state/recruitment/recruitmentSlice.ts b/frontend/dashboard/src/app/state/recruitment/recruitmentSlice.ts new file mode 100644 index 000000000..c2fcce6f9 --- /dev/null +++ b/frontend/dashboard/src/app/state/recruitment/recruitmentSlice.ts @@ -0,0 +1,29 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { Recruitment, RecruitmentCycle } from '../../../types/recruitment'; + + +const initialState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Always, + recruitmentType: [], + isRecruiting: false, + applications: [] +}; + +const recruitmentSlice = createSlice({ + name: 'recruitment', + initialState, + reducers: { + setRecruitment(_, action: PayloadAction) { + return action.payload; + }, + updateRecruitment(state, action: PayloadAction>) { + return { ...state, ...action.payload }; + }, + resetRecruitment() { + return initialState; + } + } +}); + +export const { setRecruitment, updateRecruitment, resetRecruitment } = recruitmentSlice.actions; +export const recruitmentReducer = recruitmentSlice.reducer; \ No newline at end of file diff --git a/frontend/dashboard/src/app/tests/clubState.test.ts b/frontend/dashboard/src/app/tests/clubState.test.ts new file mode 100644 index 000000000..0a5e8fd24 --- /dev/null +++ b/frontend/dashboard/src/app/tests/clubState.test.ts @@ -0,0 +1,82 @@ +import { setClub, updateClub, resetClub, clubReducer } from '../state/club/clubSlice'; +import { Club, CreateClubRequestBody, UpdateClubRequestBody } from '../../types/club'; + +describe('club slice', () => { + const initialState: Club = { + userId: '', + clubId: '', + clubName: '', + accessToken: '', + csrfToken: '', + preview: '', + description: '', + weeklyTimeCommitment: 0, + oneWordToDescribeUs: '', + logo: '', + } + + it('set club', () => { + const club: CreateClubRequestBody = { + userId: '123', + name: 'Generate', + preview: 'preview', + description: 'description', + weeklyTimeCommitment: 10, + oneWordToDescribeUs: 'innovative', + logo: 'logo.png', + } + + const action = setClub(club); + const nextState = clubReducer(initialState, action); + expect(nextState).toEqual({ + ...initialState, + ...club + }) + }) + + it('update club', () => { + const currentState: Club = { + userId: '123', + clubId: '456', + clubName: 'Generate Development Studio', + accessToken: 'token', + csrfToken: 'csrf', + preview: 'preview', + description: 'description', + weeklyTimeCommitment: 20, + oneWordToDescribeUs: 'daring', + logo: 'logo.png', + } + + const updatedFields: UpdateClubRequestBody = { + preview: 'new preview', + weeklyTimeCommitment: 10, + } + + const action = updateClub(updatedFields); + const nextState = clubReducer(currentState, action); + expect(nextState).toEqual({ + ...currentState, + ...updatedFields, + }) + }) + + it('reset club', () => { + const currentState: Club = { + userId: '123', + clubId: '456', + clubName: 'Generate Development Studio', + accessToken: 'token', + csrfToken: 'csrf', + preview: 'preview', + description: 'description', + weeklyTimeCommitment: 20, + oneWordToDescribeUs: 'daring', + logo: 'logo.png', + } + + const action = resetClub(); + const nextState = clubReducer(currentState, action); + expect(nextState).toEqual(initialState); + }) +}) \ No newline at end of file diff --git a/frontend/dashboard/src/app/tests/recruitmentState.test.ts b/frontend/dashboard/src/app/tests/recruitmentState.test.ts new file mode 100644 index 000000000..89c21ccaa --- /dev/null +++ b/frontend/dashboard/src/app/tests/recruitmentState.test.ts @@ -0,0 +1,60 @@ +import { setRecruitment, updateRecruitment, resetRecruitment, recruitmentReducer } from '../state/recruitment/recruitmentSlice'; +import { Recruitment, RecruitmentCycle, RecruitmentType, UpdateRecruitmentRequestBody } from '../../types/recruitment'; + +describe('recruitment slice', () => { + const initialState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Always, + recruitmentType: [], + isRecruiting: false, + applications: [] + } + + it('set recruitment', () => { + const recruitment: Recruitment = { + recruitmentCycle: RecruitmentCycle.Spring, + recruitmentType: [RecruitmentType.Apply], + isRecruiting: true, + applications: [] + } + + const action = setRecruitment(recruitment); + const nextState = recruitmentReducer(initialState, action); + expect(nextState).toEqual({ + ...initialState, + ...recruitment + }); + }) + + it('update recruitment', () => { + const currentState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Spring, + recruitmentType: [RecruitmentType.Apply], + isRecruiting: true, + applications: [] + } + + const updatedFields: UpdateRecruitmentRequestBody = { + isRecruiting: false, + } + + const action = updateRecruitment(updatedFields); + const nextState = recruitmentReducer(currentState, action); + expect(nextState).toEqual({ + ...currentState, + ...updatedFields, + }) + }) + + it('reset recruitment', () => { + const currentState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Spring, + recruitmentType: [RecruitmentType.Apply], + isRecruiting: true, + applications: [] + } + + const action = resetRecruitment(); + const nextState = recruitmentReducer(currentState, action); + expect(nextState).toEqual(initialState); + }); +}) \ No newline at end of file diff --git a/frontend/dashboard/src/store/StoreProvider.tsx b/frontend/dashboard/src/store/StoreProvider.tsx index 429deb39e..4a0881f98 100644 --- a/frontend/dashboard/src/store/StoreProvider.tsx +++ b/frontend/dashboard/src/store/StoreProvider.tsx @@ -1,4 +1,4 @@ -"use client"; +'use client' import { useRef } from "react"; import { AppStore, makeStore } from "./store"; @@ -6,17 +6,21 @@ import { Provider } from "react-redux"; type StoreProviderProps = { children: React.ReactNode; -}; +} /** * The Redux store provider component. This makes the store accessible globally across the repository */ export default function StoreProvider({ children }: StoreProviderProps) { - const storeRef = useRef(); + const storeRef = useRef(); - // Instantiate store singleton: - if (!storeRef.current) { - storeRef.current = makeStore(); - } - return {children}; + // Instantiate store singleton: + if (!storeRef.current) { + storeRef.current = makeStore() + } + return ( + + {children} + + ) } diff --git a/frontend/dashboard/src/store/store.ts b/frontend/dashboard/src/store/store.ts index 6aa3d29ac..7e5a536ec 100644 --- a/frontend/dashboard/src/store/store.ts +++ b/frontend/dashboard/src/store/store.ts @@ -1,24 +1,28 @@ -import { configureStore } from "@reduxjs/toolkit"; -import { useDispatch, useSelector, useStore } from "react-redux"; -import { baseApi } from "@sac/lib"; +import { baseApi } from '@generatesac/lib'; +import { configureStore } from '@reduxjs/toolkit' +import { useDispatch, useSelector, useStore } from 'react-redux'; +import { clubReducer } from '../app/state/club/clubSlice'; +import { recruitmentReducer } from '../app/state/recruitment/recruitmentSlice'; export const makeStore = () => { return configureStore({ reducer: { [baseApi.reducerPath]: baseApi.reducer, + clubReducer: clubReducer, + recruitmentReducer: recruitmentReducer, }, - middleware: (getDefaultMiddleware) => - getDefaultMiddleware().concat(baseApi.middleware), - }); + getDefaultMiddleware() + .concat(baseApi.middleware) + }) }; // Redux types: -export type AppStore = ReturnType; -export type RootState = ReturnType; -export type AppDispatch = AppStore["dispatch"]; +export type AppStore = ReturnType +export type RootState = ReturnType +export type AppDispatch = AppStore['dispatch'] // Typed Redux interactive methods: -export const useAppDispatch = useDispatch.withTypes(); -export const useAppSelector = useSelector.withTypes(); -export const useAppStore = useStore.withTypes(); +export const useAppDispatch = useDispatch.withTypes() +export const useAppSelector = useSelector.withTypes() +export const useAppStore = useStore.withTypes() diff --git a/frontend/dashboard/src/types/application.ts b/frontend/dashboard/src/types/application.ts new file mode 100644 index 000000000..50356a079 --- /dev/null +++ b/frontend/dashboard/src/types/application.ts @@ -0,0 +1,4 @@ +export type Application = { + applicationTitle: string + applicationLink: string +} \ No newline at end of file diff --git a/frontend/dashboard/src/types/club.ts b/frontend/dashboard/src/types/club.ts new file mode 100644 index 000000000..b1bb49503 --- /dev/null +++ b/frontend/dashboard/src/types/club.ts @@ -0,0 +1,31 @@ +export type Club = { + userId: string; + clubId: string; + parentId?: string; + clubName: string; + accessToken: string; + csrfToken: string; + preview: string; + description: string; + weeklyTimeCommitment: number; + oneWordToDescribeUs: string; + logo: string; +} + +export interface CreateClubRequestBody { + userId: string; + name: string; + preview: string; + description: string; + weeklyTimeCommitment: number; + oneWordToDescribeUs: string; + logo: string; +} + +export interface UpdateClubRequestBody { + preview?: string; + description?: string; + weeklyTimeCommitment?: number; + oneWordToDescribeUs?: string; + logo?: string; +} \ No newline at end of file diff --git a/frontend/dashboard/src/types/recruitment.ts b/frontend/dashboard/src/types/recruitment.ts new file mode 100644 index 000000000..9f7e72fc0 --- /dev/null +++ b/frontend/dashboard/src/types/recruitment.ts @@ -0,0 +1,29 @@ +import { Application } from "./application"; + +export enum RecruitmentCycle { + Fall = 'fall', + FallSpring = 'fallSpring', + Spring = 'spring', + Always = 'always' +} + +export enum RecruitmentType { + Unrestricted = 'unrestricted', + Tryout = 'tryout', + Apply = 'application' +} + +export type Recruitment = { + recruitmentCycle: RecruitmentCycle; + recruitmentType: RecruitmentType[]; + isRecruiting: boolean; + applications: Application[]; +} + +export type UpdateRecruitmentRequestBody = { + recruitmentCycle?: RecruitmentCycle; + recruitmentType?: RecruitmentType[]; + isRecruiting?: boolean; + applications?: Application[]; +} + diff --git a/frontend/dashboard/tailwind.config.ts b/frontend/dashboard/tailwind.config.ts index cf5ff5d99..d45370b06 100644 --- a/frontend/dashboard/tailwind.config.ts +++ b/frontend/dashboard/tailwind.config.ts @@ -1,20 +1,84 @@ -import type { Config } from "tailwindcss"; +import type { Config } from "tailwindcss" +const { fontFamily } = require("tailwindcss/defaultTheme") -const config: Config = { +const config = { + darkMode: ["class"], content: [ - "./pages/**/*.{js,ts,jsx,tsx,mdx}", - "./components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", - ], + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', + ], + prefix: "", theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, extend: { - backgroundImage: { - "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", - "gradient-conic": - "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + fontFamily: { + sans: ["var(--font-sans)", ...fontFamily.sans], }, }, }, - plugins: [], -}; -export default config; + plugins: [require("tailwindcss-animate")], +} satisfies Config + +export default config \ No newline at end of file diff --git a/frontend/dashboard/tsconfig.json b/frontend/dashboard/tsconfig.json index e7ff90fd2..96c71f61c 100644 --- a/frontend/dashboard/tsconfig.json +++ b/frontend/dashboard/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,16 +15,25 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true, "plugins": [ { "name": "next" } ], "paths": { - "@/*": ["./*"] - } + "@/*": [ + "./*" + ] + }, + "incremental": true }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/frontend/dashboard/yarn.lock b/frontend/dashboard/yarn.lock index bf1958b63..5845753cf 100644 --- a/frontend/dashboard/yarn.lock +++ b/frontend/dashboard/yarn.lock @@ -2,51 +2,101 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: "@babel/highlight" "^7.24.2" picocolors "^1.0.0" +"@babel/compat-data@^7.23.5": + version "7.24.4" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.23.0": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/generator@7.17.7": version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz" integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== dependencies: "@babel/types" "^7.17.0" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.23.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/types" "^7.24.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -54,62 +104,220 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== +"@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== + +"@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== + dependencies: + "@babel/types" "^7.24.5" -"@babel/helper-string-parser@^7.23.4": +"@babel/helper-split-export-declaration@^7.22.6", "@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-string-parser@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" "@babel/highlight@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.24.5" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== -"@babel/runtime@^7.23.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/runtime@^7.13.10", "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.1": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15": +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz" integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== + dependencies: + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" + debug "^4.3.1" + globals "^11.1.0" + "@babel/traverse@7.23.2": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: "@babel/code-frame" "^7.22.13" @@ -123,38 +331,115 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + +"@babel/types@^7.17.0": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + "@babel/types@7.17.0": version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz" integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@^7.17.0", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@blocknote/core@^0.12.4": + version "0.12.4" + resolved "https://registry.npmjs.org/@blocknote/core/-/core-0.12.4.tgz" + integrity sha512-njnrEZUZ7sPm0CIwxSfFfnP1IgB+H+Kvk5+2Etr3tozuQgwdQ0X6wn6E+MTCP97Nxl/aPA7S1F/XUoy1L8ICXQ== + dependencies: + "@tiptap/core" "^2.0.3" + "@tiptap/extension-bold" "^2.0.3" + "@tiptap/extension-code" "^2.0.3" + "@tiptap/extension-collaboration" "^2.0.3" + "@tiptap/extension-collaboration-cursor" "^2.0.3" + "@tiptap/extension-dropcursor" "^2.0.3" + "@tiptap/extension-gapcursor" "^2.0.3" + "@tiptap/extension-hard-break" "^2.0.3" + "@tiptap/extension-history" "^2.0.3" + "@tiptap/extension-horizontal-rule" "^2.0.3" + "@tiptap/extension-italic" "^2.0.3" + "@tiptap/extension-link" "^2.0.3" + "@tiptap/extension-paragraph" "^2.0.3" + "@tiptap/extension-strike" "^2.0.3" + "@tiptap/extension-table-cell" "^2.0.3" + "@tiptap/extension-table-header" "^2.0.3" + "@tiptap/extension-table-row" "^2.0.3" + "@tiptap/extension-text" "^2.0.3" + "@tiptap/extension-underline" "^2.0.3" + "@tiptap/pm" "^2.0.3" + hast-util-from-dom "^4.2.0" + prosemirror-model "^1.18.3" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.3.4" + prosemirror-transform "^1.7.2" + prosemirror-view "^1.31.4" + rehype-format "^5.0.0" + rehype-parse "^8.0.4" + rehype-remark "^9.1.2" + rehype-stringify "^9.0.3" + remark-gfm "^3.0.1" + remark-parse "^10.0.1" + remark-rehype "^10.1.0" + remark-stringify "^10.0.2" + unified "^10.1.2" + uuid "^8.3.2" + y-prosemirror "1.2.1" + y-protocols "^1.0.5" + yjs "^13.6.1" + +"@blocknote/react@^0.12.4": + version "0.12.4" + resolved "https://registry.npmjs.org/@blocknote/react/-/react-0.12.4.tgz" + integrity sha512-cgtQmPUhRmWwHifskhfuwq7SflXTagilblzkfKmkvHYsldeH2WcOHGbgskX5bdx7ulvryrLnTSbXszLuTGd5Hw== + dependencies: + "@blocknote/core" "^0.12.4" + "@floating-ui/react" "^0.26.4" + "@mantine/core" "^7.7.1" + "@mantine/hooks" "^7.7.1" + "@mantine/utils" "^6.0.21" + "@tiptap/core" "^2.0.3" + "@tiptap/react" "^2.0.3" + lodash.merge "^4.6.2" + react "^18" + react-dom "^18.2.0" + react-icons "^4.3.1" + use-prefers-color-scheme "^1.1.3" "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -169,12 +454,63 @@ "@eslint/js@8.57.0": version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@floating-ui/core@^1.0.0": + version "1.6.1" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz" + integrity sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A== + dependencies: + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/dom@^1.0.0": + version "1.6.5" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz" + integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/react-dom@^2.0.0": + version "2.0.9" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz" + integrity sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.4", "@floating-ui/react@^0.26.9": + version "0.26.13" + resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.13.tgz" + integrity sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@floating-ui/utils" "^0.2.0" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.0": + version "0.2.2" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz" + integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== + +"@generatesac/lib@^0.0.1": + version "0.0.1" + resolved "https://registry.npmjs.org/@generatesac/lib/-/lib-0.0.1.tgz" + integrity sha512-E7Vw3fZlRdxdBUl06H4s/0IzFb7BCAAWP/iHwA/ju0p4ILy0f6mq2hpWvIDqRFLri6NFWdO3eCd23yjN1VQFNQ== + dependencies: + "@blocknote/core" "^0.12.4" + "@blocknote/react" "^0.12.4" + "@reduxjs/toolkit" "^2.2.3" + "@tiptap/pm" "^2.3.1" + react "^18.2.0" + react-dom "^18.2.0" + react-icons "^5.2.1" + react-redux "^9.1.2" + zod "^3.23.6" + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: "@humanwhocodes/object-schema" "^2.0.2" @@ -183,17 +519,17 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -203,9 +539,217 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.0.0", "@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -214,100 +758,82 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.2.tgz#6c36fe0b04a22ea78bd60a645ae77d53cd16d3ca" - integrity sha512-sk72qRfM1Q90XZWYRoJKu/UWlTgihrASiYw/scb15u+tyzcze3bOuJ/UV6TBOQEeUaxOkRqGeuGUdiiuxc5oqw== - -"@next/eslint-plugin-next@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.2.tgz#1eaf592ebb961e0b093e4774b0c77298af5e2e0e" - integrity sha512-q+Ec2648JtBpKiu/FSJm8HAsFXlNvioHeBCbTP12T1SGcHYwhqHULSfQgFkPgHDu3kzNp2Kem4J54bK4rPQ5SQ== +"@mantine/core@^7.7.1": + version "7.9.0" + resolved "https://registry.npmjs.org/@mantine/core/-/core-7.9.0.tgz" + integrity sha512-EhELO1uYq2s08H69h4BCcvE26mNLPaXUi6RAjApqBIynMcyJlmdluFtvGKFxjpgFZy3moeSYNrjEW//T0uTMZg== + dependencies: + "@floating-ui/react" "^0.26.9" + clsx "2.1.0" + react-number-format "^5.3.1" + react-remove-scroll "^2.5.7" + react-textarea-autosize "8.5.3" + type-fest "^4.12.0" + +"@mantine/hooks@^7.7.1", "@mantine/hooks@7.9.0": + version "7.9.0" + resolved "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.9.0.tgz" + integrity sha512-LKgyrlaIK0S/gcn/VDbhqLBZOYjvhXfVcH7rMs4MIBVD+wuRo2LvvAYe3cUfQbBCfmlpRjqvewwvsIYYsjSofQ== + +"@mantine/utils@^6.0.21": + version "6.0.21" + resolved "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.21.tgz" + integrity sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ== + +"@next/env@14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz" + integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== + +"@next/eslint-plugin-next@14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz" + integrity sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw== dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.2.tgz#55e395b0db6dd5ea2dc92818260ff3a399f1a056" - integrity sha512-3iPgMhzbalizGwHNFUcGnDhFPSgVBHQ8aqSTAMxB5BvJG0oYrDf1WOJZlbXBgunOEj/8KMVbejEur/FpvFsgFQ== - -"@next/swc-darwin-x64@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.2.tgz#f96fb65510be798c03b0432129792c6ac8885bc8" - integrity sha512-x7Afi/jt0ZBRUZHTi49yyej4o8znfIMHO4RvThuoc0P+uli8Jd99y5GKjxoYunPKsXL09xBXEM1+OQy2xEL0Ag== - -"@next/swc-linux-arm64-gnu@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.2.tgz#443f0d4ab9d1aa4338e40f77ca4e182d60e88448" - integrity sha512-zbfPtkk7L41ODMJwSp5VbmPozPmMMQrzAc0HAUomVeVIIwlDGs/UCqLJvLNDt4jpWgc21SjjyIn762lNGrMaUA== - -"@next/swc-linux-arm64-musl@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.2.tgz#182c00b3d2f3ed4eaacdd385d07b230252c64de9" - integrity sha512-wPbS3pI/JU16rm3XdLvvTmlsmm1nd+sBa2ohXgBZcShX4TgOjD4R+RqHKlI1cjo/jDZKXt6OxmcU0Iys0OC/yg== - -"@next/swc-linux-x64-gnu@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.2.tgz#e826a08085dcc61685ff42884ad4032e71ac154f" - integrity sha512-NqWOHqqq8iC9tuHvZxjQ2tX+jWy2X9y8NX2mcB4sj2bIccuCxbIZrU/ThFPZZPauygajZuVQ6zediejQHwZHwQ== - -"@next/swc-linux-x64-musl@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.2.tgz#42f921ca6d93fdfb2b13de70cd8a44ba5526b318" - integrity sha512-lGepHhwb9sGhCcU7999+iK1ZZT+6rrIoVg40MP7DZski9GIZP80wORSbt5kJzh9v2x2ev2lxC6VgwMQT0PcgTA== - -"@next/swc-win32-arm64-msvc@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.2.tgz#9c8f60da8e3882c4c66f21747abf944a627d05ff" - integrity sha512-TZSh/48SfcLEQ4rD25VVn2kdIgUWmMflRX3OiyPwGNXn3NiyPqhqei/BaqCYXViIQ+6QsG9R0C8LftMqy8JPMA== - -"@next/swc-win32-ia32-msvc@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.2.tgz#fdb0b5f74e6dc0dcb34b7f7d24775ad034d915e8" - integrity sha512-M0tBVNMEBJN2ZNQWlcekMn6pvLria7Sa2Fai5znm7CCJz4pP3lrvlSxhKdkCerk0D9E0bqx5yAo3o2Q7RrD4gA== - -"@next/swc-win32-x64-msvc@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.2.tgz#95cc0dad2c7ac5177fa6eeab070dccfa30532353" - integrity sha512-a/20E/wtTJZ3Ykv3f/8F0l7TtgQa2LWHU2oNB9bsu0VjqGuGGHmm/q6waoUNQYTVPYrrlxxaHjJcDV6aiSTt/w== +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@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.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -315,45 +841,232 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@pkgr/core@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@reduxjs/toolkit@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.3.tgz#5ce71cbf162f98c5dafb49bd3f1e11c5486ab9c4" - integrity sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA== +"@popperjs/core@^2.9.0": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@radix-ui/react-compose-refs@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz" + integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-slot@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz" + integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + +"@reduxjs/toolkit@^2.2.3", "@reduxjs/toolkit@^2.2.4": + version "2.2.5" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.5.tgz" + integrity sha512-aeFA/s5NCG7NoJe/MhmwREJxRkDs0ZaSqt0MxhWUrwCf1UQXpwR87RROJEql0uAkLI6U7snBOYOcKw83ew3FPg== dependencies: immer "^10.0.3" redux "^5.0.1" redux-thunk "^3.1.0" - reselect "^5.0.1" + reselect "^5.1.0" + +"@remirror/core-constants@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz" + integrity sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== "@rushstack/eslint-patch@^1.3.3": version "1.10.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz" integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@swc/counter@^0.1.3": version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== "@swc/helpers@0.5.5": version "0.5.5" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@tiptap/core@^2.0.0", "@tiptap/core@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.3.1.tgz" + integrity sha512-ycpQlmczAOc05TgB5sc3RUTEEBXAVmS8MR9PqQzg96qidaRfVkgE+2w4k7t83PMHl2duC0MGqOCy96pLYwSpeg== + +"@tiptap/extension-bold@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.3.1.tgz" + integrity sha512-szHDXKOQfrlCzsys401zBtPWE5gyY3LcpPlrn2zBRrBmzU2U/1A7Y3HkoqZo3SSrTY37eG1Vr2J2aHySK6Uj/w== + +"@tiptap/extension-bubble-menu@^2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.3.1.tgz" + integrity sha512-6PGrk65f0eXHcCEe6A2/GpooMsD6RPZY1kWSSWUNfklJO54R/8uAtsSVIBr7wQ34pvrYkNaluRUrDWUokWyBOQ== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-code@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.3.1.tgz" + integrity sha512-bVX0EnDZoRXnoA7dyoZe7w2gdRjxmFEcsatHLkcr3R3x4k9oSgZXLe1C2jGbjJWr4j32tYXZ1cpKte6f1WUKzg== + +"@tiptap/extension-collaboration-cursor@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.3.1.tgz" + integrity sha512-r4vBfuUiz+o2p62UJUmKruvoHgNS67sOBk2P5zYDljVEg2O8ydZVU2qmBdDgfyqQG3aO/p4tYDCCZeVsoYQngA== + +"@tiptap/extension-collaboration@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.3.1.tgz" + integrity sha512-d/azeir3H2v8epywquDMpDaz0BcLJddwGkSB/MMJe6Q58fEenRCad5/GE3zs0bMEhA0WELq9YtWLO87xrUQg9A== + +"@tiptap/extension-dropcursor@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.1.tgz" + integrity sha512-xDG1Z01ftRI4mIOY+bPuG53xZ9FfVd6hzjNchwFHRlU3E+/2O+DsEBy/pJuHmpnFx1B/1ANbssoidGvK3LIPYw== + +"@tiptap/extension-floating-menu@^2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.3.1.tgz" + integrity sha512-3+dONthHRMFzJjLF9JtRbm9u4XJs8txCoChsZjwD0wBf8XfPtUGZQn9W5xNJG+5pozrOQhj9KC1UZL4tuvSRkg== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-gapcursor@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.1.tgz" + integrity sha512-jhMw0LtEV/HVovUDRdoH0QLnBWLDyw4Su7UZ0bkMtsnCO9MujLKths3SKsPstuAckZQKR5smokEytxDHH0aglg== + +"@tiptap/extension-hard-break@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.3.1.tgz" + integrity sha512-HO47iS2KQJLxhZM4ghZz5t2qgESH6D/mKJbjO7jM0eCYEyUfPyYJwV2VgjQP7x+1axcvsrhpzkJrjSg5+KqtQQ== + +"@tiptap/extension-history@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.3.1.tgz" + integrity sha512-m+W6qTP4V0PHqqKnXw/ma18a62O0Cqp5FDWtSarOuxx6W4FpVr4A3Uxfbp4RigZEYanLcX4UJOWL4nWsFdYWHw== + +"@tiptap/extension-horizontal-rule@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.1.tgz" + integrity sha512-IPgCFkiT6Y5BSFBQMTXS6gq2Ust6otMzRwddoI0RC8tl/tMftFBEPqYKADWVQeQb4C6AQydRjUbmAwHpBH31Eg== + +"@tiptap/extension-italic@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.3.1.tgz" + integrity sha512-yEAn0dT1LH1vAULmZv3L1fs7M1Fn/8wZCw7LDGw2/E+VYbDeXgy7XwMPyzhrzV1oV9Z+3gugCbYV0IJ4PBwudA== + +"@tiptap/extension-link@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.3.1.tgz" + integrity sha512-VE54iLwWcPldqZl7a4E/pmGD7waCWS//VT8jxTuFUroTouIzT+OjB9DQAXMkrRiaz+na3I8Jie1yBE+zYB0gvQ== + dependencies: + linkifyjs "^4.1.0" + +"@tiptap/extension-paragraph@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.3.1.tgz" + integrity sha512-bHkkHU012clwCrpzmEHGuF8fwLuFL3x9MJ17wnhwanoIM3MG6ZCdeb9copjDvUpZXLKTUYKotoPGNhxmOrP2bQ== + +"@tiptap/extension-strike@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.3.1.tgz" + integrity sha512-fpsVewcnaYk37TAF4JHkwH9O6Ml7JooF1v/Eh9p7PSItNcEfg/3RLlJL3c53RzLWdlunjgptM/M0alPV0Zyq4A== + +"@tiptap/extension-table-cell@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.3.1.tgz" + integrity sha512-xjCmpokTRyU4OcUbrXchPkZhUY5ACNyNYPwxWcXlZHG8rFbF/UJFHt22VZzMFLb33iBWgsPR9MfPtSL4+wdm4Q== + +"@tiptap/extension-table-header@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.3.1.tgz" + integrity sha512-hAQjjPie+QDW851CsmknoPI1hkB54mur0EudHxuEMCTweMZJseiO+IggNdQT3YdlUcV/UZTJdnhtOvmpHHLQ1w== + +"@tiptap/extension-table-row@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.3.1.tgz" + integrity sha512-TYUj1XXdVGHrQOs1MiErB064Wp6vJeInViuN+fXt/u/Fc4LbQzfXbMsjqALfcfajJdGgqHBNBV25lzCrFGTJ8w== + +"@tiptap/extension-text@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.3.1.tgz" + integrity sha512-ZM+Bpty9jChEN/VjUP/fX1Fvoz0Z3YLdjj9+pFA0H7woli+TmxWY6yUUTA2SBDb2mJ52yNOUfRE/sYx6gkDuBQ== + +"@tiptap/extension-underline@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.3.1.tgz" + integrity sha512-xgLGr7bM5OAKagUKdL5dWxJHgwEp2fk3D5XCVUBwqgeOZtOFteoqPzb/2617w7qrP+9oM9zRjw6z27hM8YxyvQ== + +"@tiptap/pm@^2.0.0", "@tiptap/pm@^2.0.3", "@tiptap/pm@^2.3.1": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz" + integrity sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ== + dependencies: + prosemirror-changeset "^2.2.1" + prosemirror-collab "^1.3.1" + prosemirror-commands "^1.5.2" + prosemirror-dropcursor "^1.8.1" + prosemirror-gapcursor "^1.3.2" + prosemirror-history "^1.3.2" + prosemirror-inputrules "^1.3.0" + prosemirror-keymap "^1.2.2" + prosemirror-markdown "^1.12.0" + prosemirror-menu "^1.2.4" + prosemirror-model "^1.19.4" + prosemirror-schema-basic "^1.2.2" + prosemirror-schema-list "^1.3.0" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.3.5" + prosemirror-trailing-node "^2.0.7" + prosemirror-transform "^1.8.0" + prosemirror-view "^1.32.7" + +"@tiptap/react@^2.0.3": + version "2.3.1" + resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.3.1.tgz" + integrity sha512-MM6UOi5nmdM/dZXYtbBYHJEsVtyyFFnOCXlXmhTlhz0WYI8VkEAY7XWLB96KrqsbRk9PUWwdev7iT1q40zxVeg== + dependencies: + "@tiptap/extension-bubble-menu" "^2.3.1" + "@tiptap/extension-floating-menu" "^2.3.1" + "@trivago/prettier-plugin-sort-imports@^4.3.0": version "4.3.0" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + resolved "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz" integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== dependencies: "@babel/generator" "7.17.7" @@ -363,46 +1076,183 @@ javascript-natural-sort "0.7.1" lodash "^4.17.21" +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/extend@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/extend/-/extend-3.0.4.tgz" + integrity sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA== + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== + dependencies: + "@types/unist" "^2" + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@^20": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node@*", "@types/node@^20": + version "20.12.10" + resolved "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz" + integrity sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw== dependencies: undici-types "~5.26.4" +"@types/parse5@^6.0.0": + version "6.0.3" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== + "@types/prop-types@*": version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/react-dom@^18": - version "18.2.25" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" - integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== + version "18.3.0" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18": - version "18.2.79" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" - integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== +"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18", "@types/react@^18.2.25": + version "18.3.1" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz" + integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.10" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + "@types/use-sync-external-store@^0.0.3": version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz" integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== dependencies: "@typescript-eslint/scope-manager" "7.2.0" @@ -413,7 +1263,7 @@ "@typescript-eslint/scope-manager@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz" integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== dependencies: "@typescript-eslint/types" "7.2.0" @@ -421,12 +1271,12 @@ "@typescript-eslint/types@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz" integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== "@typescript-eslint/typescript-estree@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz" integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== dependencies: "@typescript-eslint/types" "7.2.0" @@ -440,7 +1290,7 @@ "@typescript-eslint/visitor-keys@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz" integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== dependencies: "@typescript-eslint/types" "7.2.0" @@ -448,22 +1298,22 @@ "@ungap/structured-clone@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -471,43 +1321,55 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -515,24 +1377,31 @@ anymatch@~3.1.2: arg@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-buffer-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: call-bind "^1.0.5" @@ -540,7 +1409,7 @@ array-buffer-byte-length@^1.0.1: array-includes@^3.1.6, array-includes@^3.1.7: version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: call-bind "^1.0.7" @@ -552,12 +1421,12 @@ array-includes@^3.1.6, array-includes@^3.1.7: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.findlast@^1.2.4: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: call-bind "^1.0.7" @@ -569,7 +1438,7 @@ array.prototype.findlast@^1.2.4: array.prototype.findlastindex@^1.2.3: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: call-bind "^1.0.7" @@ -581,7 +1450,7 @@ array.prototype.findlastindex@^1.2.3: array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" @@ -591,7 +1460,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: array.prototype.flatmap@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" @@ -601,7 +1470,7 @@ array.prototype.flatmap@^1.3.2: array.prototype.toreversed@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + resolved "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz" integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== dependencies: call-bind "^1.0.2" @@ -611,7 +1480,7 @@ array.prototype.toreversed@^1.1.2: array.prototype.tosorted@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz" integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== dependencies: call-bind "^1.0.5" @@ -622,7 +1491,7 @@ array.prototype.tosorted@^1.1.3: arraybuffer.prototype.slice@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: array-buffer-byte-length "^1.0.1" @@ -636,12 +1505,12 @@ arraybuffer.prototype.slice@^1.0.3: ast-types-flow@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== autoprefixer@^10.4.19: version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz" integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: browserslist "^4.23.0" @@ -653,36 +1522,101 @@ autoprefixer@^10.4.19: available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" axe-core@=4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== axobject-query@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: dequal "^2.0.3" -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +babel-jest@^29.0.0, babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -690,21 +1624,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.23.0: +browserslist@^4.22.2, browserslist@^4.23.0, "browserslist@>= 4.21.0": version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: caniuse-lite "^1.0.30001587" @@ -712,16 +1646,35 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + busboy@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -732,22 +1685,37 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001612" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz#d34248b4ec1f117b70b24ad9ee04c90e0b8a14ae" - integrity sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g== + version "1.0.30001616" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz" + integrity sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -756,15 +1724,35 @@ chalk@^2.4.2: chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -777,48 +1765,127 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + +class-variance-authority@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz" + integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== + dependencies: + clsx "2.0.0" + client-only@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +clsx@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +crelt@^1.0.0: + version "1.0.6" + resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -827,22 +1894,22 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== data-view-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: call-bind "^1.0.6" @@ -851,7 +1918,7 @@ data-view-buffer@^1.0.1: data-view-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== dependencies: call-bind "^1.0.7" @@ -860,7 +1927,7 @@ data-view-byte-length@^1.0.1: data-view-byte-offset@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== dependencies: call-bind "^1.0.6" @@ -869,108 +1936,162 @@ data-view-byte-offset@^1.0.0: debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +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" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" -dequal@^2.0.3: +dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.668: - version "1.4.745" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.745.tgz#9c202ce9cbf18a5b5e0ca47145fd127cc4dd2290" - integrity sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA== + version "1.4.757" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz" + integrity sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enhanced-resolve@^5.12.0: version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz" integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: array-buffer-byte-length "^1.0.1" @@ -1022,24 +2143,24 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + version "1.0.19" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.3" es-errors "^1.3.0" es-set-tostringtag "^2.0.3" function-bind "^1.1.2" @@ -1054,14 +2175,14 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== dependencies: get-intrinsic "^1.2.4" @@ -1070,41 +2191,51 @@ es-set-tostringtag@^2.0.3: es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-next@14.2.2: - version "14.2.2" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.2.tgz#c79f935fa63859303056778b88848b2af0d052ab" - integrity sha512-12/uFc0KX+wUs7EDpOUGKMXBXZJiBVGdK5/m/QgXOCg2mQ0bQWoKSWNrCeOg7Vum6Kw1d1TW453W6xh+GbHquw== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-config-next@14.2.3: + version "14.2.3" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.3.tgz" + integrity sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg== dependencies: - "@next/eslint-plugin-next" "14.2.2" + "@next/eslint-plugin-next" "14.2.3" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0" eslint-import-resolver-node "^0.3.6" @@ -1116,7 +2247,7 @@ eslint-config-next@14.2.2: eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -1125,7 +2256,7 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: eslint-import-resolver-typescript@^3.5.2: version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz" integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== dependencies: debug "^4.3.4" @@ -1138,14 +2269,14 @@ eslint-import-resolver-typescript@^3.5.2: eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz" integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: +eslint-plugin-import@*, eslint-plugin-import@^2.28.1: version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: array-includes "^3.1.7" @@ -1168,7 +2299,7 @@ eslint-plugin-import@^2.28.1: eslint-plugin-jsx-a11y@^6.7.1: version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz" integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== dependencies: "@babel/runtime" "^7.23.2" @@ -1190,20 +2321,20 @@ eslint-plugin-jsx-a11y@^6.7.1: eslint-plugin-prettier@^5.1.3: version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz" integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== dependencies: prettier-linter-helpers "^1.0.0" synckit "^0.8.6" "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.33.2: version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz" integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== dependencies: array-includes "^3.1.7" @@ -1227,7 +2358,7 @@ eslint-plugin-react@^7.33.2: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1235,12 +2366,12 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8, eslint@^8.56.0, eslint@>=8.0.0: version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1284,50 +2415,91 @@ eslint@^8: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.2: version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1336,40 +2508,55 @@ fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1377,7 +2564,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -1386,19 +2573,19 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" foreground-child@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== dependencies: cross-spawn "^7.0.0" @@ -1406,27 +2593,27 @@ foreground-child@^3.1.0: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" @@ -1436,12 +2623,22 @@ function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -1450,9 +2647,24 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: call-bind "^1.0.5" @@ -1460,40 +2672,29 @@ get-symbol-description@^1.0.2: get-intrinsic "^1.2.4" get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + version "4.7.4" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.4.tgz" + integrity sha512-ofbkKj+0pjXjhejr007J/fLf+sW+8H7K5GCm+msC8q3IpvgjobpyPqSRFemNyIMxklC0zeJpi7VDFna19FacvQ== dependencies: resolve-pkg-maps "^1.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + 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@10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - glob@^10.3.10: version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz" integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== dependencies: foreground-child "^3.1.0" @@ -1502,9 +2703,9 @@ glob@^10.3.10: minipass "^7.0.4" path-scurry "^1.10.2" -glob@^7.1.3: +glob@^7.1.3, glob@^7.1.4: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -1514,28 +2715,40 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@10.3.10: + version "10.3.10" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -1547,93 +2760,329 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" +hast-util-embedded@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-2.0.1.tgz" + integrity sha512-QUdSOP1/o+/TxXtpPFXR2mUg2P+ySrmlX7QjwHZCXqMFyYk7YmcGSvqRW+4XgXAoHifdE1t2PwFaQK33TqVjSw== + dependencies: + hast-util-is-element "^2.0.0" + +hast-util-embedded@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz" + integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-from-dom@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz" + integrity sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ== + dependencies: + hastscript "^7.0.0" + web-namespaces "^2.0.0" + +hast-util-from-parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz" + integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hastscript "^7.0.0" + property-information "^6.0.0" + vfile "^5.0.0" + vfile-location "^4.0.0" + web-namespaces "^2.0.0" + +hast-util-has-property@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz" + integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== + +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-body-ok-link@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-2.0.0.tgz" + integrity sha512-S58hCexyKdD31vMsErvgLfflW6vYWo/ixRLPJTtkOvLld24vyI8vmYmkgLA5LG3la2ME7nm7dLGdm48gfLRBfw== + dependencies: + "@types/hast" "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-element "^2.0.0" + +hast-util-is-body-ok-link@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz" + integrity sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-element@^2.0.0: + version "2.1.3" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz" + integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-parse-selector@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz" + integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== + dependencies: + "@types/hast" "^2.0.0" + +hast-util-phrasing@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-2.0.2.tgz" + integrity sha512-yGkCfPkkfCyiLfK6KEl/orMDr/zgCnq/NaO9HfULx6/Zga5fso5eqQA5Ov/JZVqACygvw9shRYWgXNcG2ilo7w== + dependencies: + "@types/hast" "^2.0.0" + hast-util-embedded "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-body-ok-link "^2.0.0" + hast-util-is-element "^2.0.0" + +hast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz" + integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-has-property "^3.0.0" + hast-util-is-body-ok-link "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-raw@^7.0.0: + version "7.2.3" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz" + integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + hast-util-from-parse5 "^7.0.0" + hast-util-to-parse5 "^7.0.0" + html-void-elements "^2.0.0" + parse5 "^6.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-html@^8.0.0: + version "8.0.4" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz" + integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-raw "^7.0.0" + hast-util-whitespace "^2.0.0" + html-void-elements "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-mdast@^8.3.0: + version "8.4.1" + resolved "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-8.4.1.tgz" + integrity sha512-tfmBLASuCgyhCzpkTXM5kU8xeuS5jkMZ17BYm2YftGT5wvgc7uHXTZ/X8WfNd6F5NV/IGmrLsuahZ+jXQir4zQ== + dependencies: + "@types/extend" "^3.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + extend "^3.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-element "^2.0.0" + hast-util-phrasing "^2.0.0" + hast-util-to-text "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + rehype-minify-whitespace "^5.0.0" + trim-trailing-lines "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit "^4.0.0" + +hast-util-to-parse5@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz" + integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-text@^3.0.0: + version "3.1.2" + resolved "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz" + integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hast-util-is-element "^2.0.0" + unist-util-find-after "^4.0.0" + +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz" + integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz" + integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== + +html-whitespace-sensitive-tag-names@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz" + integrity sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + ignore@^5.2.0: version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== immer@^10.0.3: - version "10.0.4" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.4.tgz#09af41477236b99449f9d705369a4daaf780362b" - integrity sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw== + version "10.1.1" + resolved "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -1641,142 +3090,169 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== internal-slot@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: es-errors "^1.3.0" hasown "^2.0.0" side-channel "^1.0.4" +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + is-array-buffer@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" get-intrinsic "^1.2.1" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-async-function@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== dependencies: has-tostringtag "^1.0.0" is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" is-data-view@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: is-typed-array "^1.1.13" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== dependencies: call-bind "^1.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-generator-function@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -1784,52 +3260,57 @@ is-regex@^1.1.4: is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: call-bind "^1.0.7" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.13: version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: call-bind "^1.0.7" @@ -1837,17 +3318,75 @@ is-weakset@^2.0.3: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic.js@^0.2.4: + version "0.2.5" + resolved "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz" + integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + iterator.prototype@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: define-properties "^1.2.1" @@ -1858,7 +3397,7 @@ iterator.prototype@^1.1.2: jackspeak@^2.3.5, jackspeak@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" @@ -1867,56 +3406,432 @@ jackspeak@^2.3.5, jackspeak@^2.3.6: javascript-natural-sort@0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + resolved "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz" integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@*, jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.0.0, jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + jiti@^1.21.0: version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" @@ -1926,139 +3841,669 @@ json5@^1.0.2: keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + language-subtag-registry@^0.3.20: version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: language-subtag-registry "^0.3.20" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" +lib0@^0.2.42, lib0@^0.2.85, lib0@^0.2.86: + version "0.2.93" + resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.93.tgz" + integrity sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q== + dependencies: + isomorphic.js "^0.2.4" + lilconfig@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz" integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + +linkifyjs@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz" + integrity sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loose-envify@^1.1.0, loose-envify@^1.4.0: +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + version "10.2.2" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" +lucide-react@^0.378.0: + version "0.378.0" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.378.0.tgz" + integrity sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g== + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +markdown-it@^14.0.0: + version "14.1.0" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + +mdast-util-find-and-replace@^2.0.0: + version "2.2.2" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz" + integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== + dependencies: + "@types/mdast" "^3.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" + +mdast-util-from-markdown@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz" + integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== + dependencies: + "@types/mdast" "^3.0.0" + ccount "^2.0.0" + mdast-util-find-and-replace "^2.0.0" + micromark-util-character "^1.0.0" + +mdast-util-gfm-footnote@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz" + integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-util-normalize-identifier "^1.0.0" + +mdast-util-gfm-strikethrough@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz" + integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz" + integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== + dependencies: + "@types/mdast" "^3.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-task-list-item@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz" + integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz" + integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-gfm-autolink-literal "^1.0.0" + mdast-util-gfm-footnote "^1.0.0" + mdast-util-gfm-strikethrough "^1.0.0" + mdast-util-gfm-table "^1.0.0" + mdast-util-gfm-task-list-item "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + +mdast-util-to-hast@^12.1.0: + version "12.3.0" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-extension-gfm-autolink-literal@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz" + integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-extension-gfm-footnote@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz" + integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-strikethrough@^1.0.0: + version "1.0.7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz" + integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz" + integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-tagfilter@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz" + integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-gfm-task-list-item@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz" + integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz" + integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== + dependencies: + micromark-extension-gfm-autolink-literal "^1.0.0" + micromark-extension-gfm-footnote "^1.0.0" + micromark-extension-gfm-strikethrough "^1.0.0" + micromark-extension-gfm-table "^1.0.0" + micromark-extension-gfm-tagfilter "^1.0.0" + micromark-extension-gfm-task-list-item "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.1: version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: brace-expansion "^2.0.1" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + version "7.1.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz" + integrity sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mz@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -2067,20 +4512,20 @@ mz@^2.7.0: nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next@14.2.2: - version "14.2.2" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.2.tgz#707311b5e4bf973ada2305233f322bdd0cd9d579" - integrity sha512-oGwUaa2bCs47FbuxWMpOoXtBMPYpvTPgdZr3UAo+pu7Ns00z9otmYpoeV1HEiYL06AlRQQIA/ypK526KjJfaxg== +next@14.2.3: + version "14.2.3" + resolved "https://registry.npmjs.org/next/-/next-14.2.3.tgz" + integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: - "@next/env" "14.2.2" + "@next/env" "14.2.3" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -2088,54 +4533,66 @@ next@14.2.2: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.2" - "@next/swc-darwin-x64" "14.2.2" - "@next/swc-linux-arm64-gnu" "14.2.2" - "@next/swc-linux-arm64-musl" "14.2.2" - "@next/swc-linux-x64-gnu" "14.2.2" - "@next/swc-linux-x64-musl" "14.2.2" - "@next/swc-win32-arm64-msvc" "14.2.2" - "@next/swc-win32-ia32-msvc" "14.2.2" - "@next/swc-win32-x64-msvc" "14.2.2" + "@next/swc-darwin-arm64" "14.2.3" + "@next/swc-darwin-x64" "14.2.3" + "@next/swc-linux-arm64-gnu" "14.2.3" + "@next/swc-linux-arm64-musl" "14.2.3" + "@next/swc-linux-x64-gnu" "14.2.3" + "@next/swc-linux-x64-musl" "14.2.3" + "@next/swc-win32-arm64-msvc" "14.2.3" + "@next/swc-win32-ia32-msvc" "14.2.3" + "@next/swc-win32-x64-msvc" "14.2.3" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.1: version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: call-bind "^1.0.5" @@ -2145,7 +4602,7 @@ object.assign@^4.1.4, object.assign@^4.1.5: object.entries@^1.1.7: version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: call-bind "^1.0.7" @@ -2154,7 +4611,7 @@ object.entries@^1.1.7: object.fromentries@^2.0.7: version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -2164,7 +4621,7 @@ object.fromentries@^2.0.7: object.groupby@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -2173,7 +4630,7 @@ object.groupby@^1.0.1: object.hasown@^1.1.3: version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz" integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== dependencies: define-properties "^1.2.1" @@ -2182,7 +4639,7 @@ object.hasown@^1.1.3: object.values@^1.1.6, object.values@^1.1.7: version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: call-bind "^1.0.7" @@ -2191,67 +4648,113 @@ object.values@^1.1.6, object.values@^1.1.7: once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" + +orderedmap@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz" + integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== -p-limit@^3.0.2: +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.10.1, path-scurry@^1.10.2: version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz" integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== dependencies: lru-cache "^10.2.0" @@ -2259,37 +4762,44 @@ path-scurry@^1.10.1, path-scurry@^1.10.2: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pirates@^4.0.1: +pirates@^4.0.1, pirates@^4.0.4: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -2298,14 +4808,14 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" @@ -2313,14 +4823,14 @@ postcss-load-config@^4.0.1: postcss-nested@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: postcss-selector-parser "^6.0.11" postcss-selector-parser@^6.0.11: version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz" integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" @@ -2328,118 +4838,362 @@ postcss-selector-parser@^6.0.11: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: + version "8.4.38" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + postcss@8.4.31: version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" -prettier@^3.2.4: +prettier@^3.2.4, prettier@>=3.0.0, "prettier@2.x - 3.x": version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -prop-types@^15.8.1: +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" react-is "^16.13.1" +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +prosemirror-changeset@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz" + integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== + dependencies: + prosemirror-transform "^1.0.0" + +prosemirror-collab@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz" + integrity sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ== + dependencies: + prosemirror-state "^1.0.0" + +prosemirror-commands@^1.0.0, prosemirror-commands@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz" + integrity sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-dropcursor@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz" + integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" + +prosemirror-gapcursor@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz" + integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== + dependencies: + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" + +prosemirror-history@^1.0.0, prosemirror-history@^1.3.2: + version "1.4.0" + resolved "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.0.tgz" + integrity sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ== + dependencies: + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.31.0" + rope-sequence "^1.3.0" + +prosemirror-inputrules@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz" + integrity sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz" + integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== + dependencies: + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" + +prosemirror-markdown@^1.12.0: + version "1.12.0" + resolved "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz" + integrity sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ== + dependencies: + markdown-it "^14.0.0" + prosemirror-model "^1.0.0" + +prosemirror-menu@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz" + integrity sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA== + dependencies: + crelt "^1.0.0" + prosemirror-commands "^1.0.0" + prosemirror-history "^1.0.0" + prosemirror-state "^1.0.0" + +prosemirror-model@^1.0.0, prosemirror-model@^1.18.3, prosemirror-model@^1.19.0, prosemirror-model@^1.19.4, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.7.1, prosemirror-model@^1.8.1: + version "1.21.0" + resolved "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz" + integrity sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA== + dependencies: + orderedmap "^2.0.0" + +prosemirror-schema-basic@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz" + integrity sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw== + dependencies: + prosemirror-model "^1.19.0" + +prosemirror-schema-list@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz" + integrity sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.7.3" + +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.2.3, prosemirror-state@^1.3.1, prosemirror-state@^1.4.2, prosemirror-state@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz" + integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.27.0" + +prosemirror-tables@^1.3.4, prosemirror-tables@^1.3.5: + version "1.3.7" + resolved "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz" + integrity sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA== + dependencies: + prosemirror-keymap "^1.1.2" + prosemirror-model "^1.8.1" + prosemirror-state "^1.3.1" + prosemirror-transform "^1.2.1" + prosemirror-view "^1.13.3" + +prosemirror-trailing-node@^2.0.7: + version "2.0.8" + resolved "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz" + integrity sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA== + dependencies: + "@remirror/core-constants" "^2.0.2" + escape-string-regexp "^4.0.0" + +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.2, prosemirror-transform@^1.7.3, prosemirror-transform@^1.8.0: + version "1.9.0" + resolved "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz" + integrity sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg== + dependencies: + prosemirror-model "^1.21.0" + +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.31.2, prosemirror-view@^1.31.4, prosemirror-view@^1.32.7, prosemirror-view@^1.9.10: + version "1.33.6" + resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.6.tgz" + integrity sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw== + dependencies: + prosemirror-model "^1.20.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-dom@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== +"react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.2.0, react-dom@>=16.8.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" + +react-icons@^4.3.1: + version "4.12.0" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz" + integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== + +react-icons@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz" + integrity sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw== react-is@^16.13.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-redux@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.1.tgz#852ec13084bd7375e26db697d2fc9027ffada204" - integrity sha512-5ynfGDzxxsoV73+4czQM56qF43vsmgJsO22rmAvU5tZT2z5Xow/A2uhhxwXuGTxgdReF3zcp7A80gma2onRs1A== +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +react-number-format@^5.3.1: + version "5.3.4" + resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.4.tgz" + integrity sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg== + dependencies: + prop-types "^15.7.2" + +"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.1.1, react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== dependencies: "@types/use-sync-external-store" "^0.0.3" use-sync-external-store "^1.0.0" -react@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== +react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.7: + version "2.5.9" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.9.tgz" + integrity sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react-textarea-autosize@8.5.3: + version "8.5.3" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@*, "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", react@^18, react@^18.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.8.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" redux-thunk@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz" integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== -redux@^5.0.1: +redux@^5.0.0, redux@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== reflect.getprototypeof@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz" integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== dependencies: call-bind "^1.0.7" @@ -2452,12 +5206,12 @@ reflect.getprototypeof@^1.0.4: regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regexp.prototype.flags@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: call-bind "^1.0.6" @@ -2465,24 +5219,150 @@ regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" -reselect@^5.0.1: +rehype-format@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.0.tgz" + integrity sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-phrasing "^3.0.0" + hast-util-whitespace "^3.0.0" + html-whitespace-sensitive-tag-names "^3.0.0" + rehype-minify-whitespace "^6.0.0" + unist-util-visit-parents "^6.0.0" + +rehype-minify-whitespace@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.1.tgz" + integrity sha512-PPp4lWJiBPlePI/dv1BeYktbwkfgXkrK59MUa+tYbMPgleod+4DvFK2PLU0O0O60/xuhHfiR9GUIUlXTU8sRIQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-embedded "^2.0.0" + hast-util-is-element "^2.0.0" + hast-util-whitespace "^2.0.0" + unified "^10.0.0" + unist-util-is "^5.0.0" + +rehype-minify-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz" + integrity sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-whitespace "^3.0.0" + unist-util-is "^6.0.0" + +rehype-parse@^8.0.4: + version "8.0.5" + resolved "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.5.tgz" + integrity sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^7.0.0" + parse5 "^6.0.0" + unified "^10.0.0" + +rehype-remark@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/rehype-remark/-/rehype-remark-9.1.2.tgz" + integrity sha512-c0fG3/CrJ95zAQ07xqHSkdpZybwdsY7X5dNWvgL2XqLKZuqmG3+vk6kP/4miCnp+R+x/0uKKRSpfXb9aGR8Z5w== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + hast-util-to-mdast "^8.3.0" + unified "^10.0.0" + +rehype-stringify@^9.0.3: + version "9.0.4" + resolved "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz" + integrity sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-to-html "^8.0.0" + unified "^10.0.0" + +remark-gfm@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" + integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-gfm "^2.0.0" + micromark-extension-gfm "^2.0.0" + unified "^10.0.0" + +remark-parse@^10.0.1: + version "10.0.2" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" + +remark-rehype@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" + integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-hast "^12.1.0" + unified "^10.0.0" + +remark-stringify@^10.0.2: + version "10.0.3" + resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz" + integrity sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.0.0" + unified "^10.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +reselect@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" + resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz" integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -2491,7 +5371,7 @@ resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: resolve@^2.0.0-next.5: version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: is-core-module "^2.13.0" @@ -2500,26 +5380,38 @@ resolve@^2.0.0-next.5: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +rope-sequence@^1.3.0: + version "1.3.4" + resolved "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz" + integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== + run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + safe-array-concat@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: call-bind "^1.0.7" @@ -2529,35 +5421,42 @@ safe-array-concat@^1.1.2: safe-regex-test@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: call-bind "^1.0.6" es-errors "^1.3.0" is-regex "^1.1.4" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" -semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.5.3: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + semver@^7.5.4: version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -2569,7 +5468,7 @@ set-function-length@^1.2.1: set-function-name@^2.0.1, set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -2579,19 +5478,19 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -2599,43 +5498,100 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== source-map-js@^1.0.2, source-map-js@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.6.0, source-map@^0.6.1: + 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" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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.1.0, 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== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: +string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" @@ -2644,7 +5600,7 @@ string-width@^4.1.0: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -2653,7 +5609,7 @@ string-width@^5.0.1, string-width@^5.1.2: string.prototype.matchall@^4.0.10: version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== dependencies: call-bind "^1.0.7" @@ -2671,7 +5627,7 @@ string.prototype.matchall@^4.0.10: string.prototype.trim@^1.2.9: version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: call-bind "^1.0.7" @@ -2681,7 +5637,7 @@ string.prototype.trim@^1.2.9: string.prototype.trimend@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: call-bind "^1.0.7" @@ -2690,54 +5646,72 @@ string.prototype.trimend@^1.0.8: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" sucrase@^3.32.0: version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -2750,34 +5724,58 @@ sucrase@^3.32.0: supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== synckit@^0.8.6: version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz" integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" -tailwindcss@^3.4.1: +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tailwind-merge@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz" + integrity sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA== + dependencies: + "@babel/runtime" "^7.24.1" + +tailwindcss-animate@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" + integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== + +tailwindcss@^3.4.1, "tailwindcss@>=3.0.0 || insiders": version "3.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz" integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -2805,53 +5803,103 @@ tailwindcss@^3.4.1: tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" +tippy.js@^6.3.7: + version "6.3.7" + resolved "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== + dependencies: + "@popperjs/core" "^2.9.0" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trim-trailing-lines@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz" + integrity sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + ts-api-utils@^1.0.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-jest@^29.1.2: + version "29.1.2" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -2859,26 +5907,41 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.12.0: + version "4.18.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz" + integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== + typed-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: call-bind "^1.0.7" @@ -2887,7 +5950,7 @@ typed-array-buffer@^1.0.2: typed-array-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: call-bind "^1.0.7" @@ -2898,7 +5961,7 @@ typed-array-byte-length@^1.0.1: typed-array-byte-offset@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: available-typed-arrays "^1.0.7" @@ -2910,7 +5973,7 @@ typed-array-byte-offset@^1.0.2: typed-array-length@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: call-bind "^1.0.7" @@ -2920,14 +5983,19 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5: +typescript@>=3.3.1, typescript@>=4.2.0, "typescript@>=4.3 <6", typescript@5.4.5: version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -2937,37 +6005,220 @@ unbox-primitive@^1.0.2: undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +unified@^10.0.0, unified@^10.1.2: + version "10.1.2" + resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unist-util-find-after@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz" + integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-generated@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + version "1.0.15" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz" + integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== dependencies: - escalade "^3.1.1" + escalade "^3.1.2" picocolors "^1.0.0" uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== + dependencies: + tslib "^2.0.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-prefers-color-scheme@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/use-prefers-color-scheme/-/use-prefers-color-scheme-1.1.3.tgz" + integrity sha512-ZRgDfb5BFLum/Sud4SpZ+d1YcV+lRbsupw0qQ/rGy5kGrpE3KMUQgEQOKiQQSa4Wslex46n5fKFO+9FGMTosUQ== + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + use-sync-external-store@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + version "1.2.2" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +vfile-location@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz" + integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== + dependencies: + "@types/unist" "^2.0.0" + vfile "^5.0.0" + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +w3c-keyname@^2.2.0: + version "2.2.8" + resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -2978,7 +6229,7 @@ which-boxed-primitive@^1.0.2: which-builtin-type@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== dependencies: function.prototype.name "^1.1.5" @@ -2996,7 +6247,7 @@ which-builtin-type@^1.1.3: which-collection@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -3006,7 +6257,7 @@ which-collection@^1.0.1: which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: available-typed-arrays "^1.0.7" @@ -3017,14 +6268,28 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -3033,7 +6298,7 @@ which@^2.0.1: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -3042,25 +6307,92 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +y-prosemirror@^1.2.1, y-prosemirror@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.1.tgz" + integrity sha512-czMBfB1eL2awqmOSxQM8cS/fsUOGE6fjvyPLInrh4crPxFiw67wDpwIW+EGBYKRa04sYbS0ScGj7ZgvWuDrmBQ== + dependencies: + lib0 "^0.2.42" + +y-protocols@^1.0.1, y-protocols@^1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz" + integrity sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q== + dependencies: + lib0 "^0.2.85" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + version "2.4.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz" + integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yjs@^13.0.0, yjs@^13.5.38, yjs@^13.6.1: + version "13.6.15" + resolved "https://registry.npmjs.org/yjs/-/yjs-13.6.15.tgz" + integrity sha512-moFv4uNYhp8BFxIk3AkpoAnnjts7gwdpiG8RtyFiKbMtxKCS0zVZ5wPaaGpwC3V2N/K8TK8MwtSI3+WO9CHWjQ== + dependencies: + lib0 "^0.2.86" yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod@^3.23.3: - version "3.23.3" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.3.tgz#eeb068f83acb55310174673dee631dfa0be5510d" - integrity sha512-tPvq1B/2Yu/dh2uAIH2/BhUlUeLIUvAjr6dpL/75I0pCYefHgjhXk1o1Kob3kTU8C7yU1j396jFHlsVWFi9ogg== +zod@^3.23.6: + version "3.23.7" + resolved "https://registry.npmjs.org/zod/-/zod-3.23.7.tgz" + integrity sha512-NBeIoqbtOiUMomACV/y+V3Qfs9+Okr18vR5c/5pHClPpufWOrsx8TENboDPe265lFdfewX2yBtNTLPvnmCxwog== + +zod@^3.23.8: + version "3.23.8" + resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/frontend/lib/.eslintrc.cjs b/frontend/lib/.eslintrc.cjs new file mode 100644 index 000000000..6e8698b72 --- /dev/null +++ b/frontend/lib/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + ], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], + rules: { + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, +}; diff --git a/frontend/lib/.eslintrc.json b/frontend/lib/.eslintrc.json deleted file mode 100644 index be1138c28..000000000 --- a/frontend/lib/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["prettier"] -} diff --git a/frontend/lib/.gitignore b/frontend/lib/.gitignore index 40b878db5..a547bf36d 100644 --- a/frontend/lib/.gitignore +++ b/frontend/lib/.gitignore @@ -1 +1,24 @@ -node_modules/ \ No newline at end of file +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/lib/README.md b/frontend/lib/README.md new file mode 100644 index 000000000..0af595e9d --- /dev/null +++ b/frontend/lib/README.md @@ -0,0 +1,30 @@ +# Generate SAC Frontend Library: + +This repository holds the common types, apis, and components for frontend library used by the Student Activity Calendar. + +To install the page, navigate to the target repo and initiate the following command: + +- `yarn add @generatesac/blocks` + +## Development / Testing + +When contributing to the package, you will likely want to test your code locally before pushing to remote. To link it with real-time updates, following the steps below: + +1. Navigate to `/frontend/lib` and run `yarn link` +2. Mavigate to the target repo, ppen a second terminal and run `yarn link "@generatesac/blocks"` +3. Navigate back to `/frontend/lib` and run `yarn watch`. + +When you are ready to finish local development: + +1. Exit out of "watch mode" using `ctrl + C` +1. Navigate to `/frontend/lib` and run `yarn unlink` +1. Navigate to the target repo and run `yarn link "@generatesac/blocks"` + +## Contributing + +When you are ready to push new code to the library, make sure to bump the version in the `package.json`. We are using semantic versioning. If you forget to do this, the `frontend/lib` GitHub Action will fail on push. + +Once the code is merged into `main`, a new version of the package will automatically be built and deployed. Monitor GitHub Actions to ensure a proper release. In the event that the workflow fails, you can manually release the package using the commands below: + +1. `yarn build` +2. `yarn publish` diff --git a/frontend/lib/api/authApi.ts b/frontend/lib/api/authApi.ts deleted file mode 100644 index 8452eb392..000000000 --- a/frontend/lib/api/authApi.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { LoginRequestBody, RefreshTokenRequestBody } from '../types/auth'; -import { User, userSchema } from '../types/user'; -import { - EmailRequestBody, - VerifyEmailRequestBody, - VerifyPasswordResetTokenRequestBody -} from '../types/verification'; - -import { baseApi } from '../api/base'; - -const AUTH_API_BASE_URL = '/auth'; - -export const authApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - login: builder.mutation({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/login`, - method: 'POST', - body - }), - transformResponse: (response: User) => { - return userSchema.parse(response); - } - }), - logout: builder.mutation({ - query: () => ({ - url: `${AUTH_API_BASE_URL}/logout`, - method: 'POST' - }) - }), - refresh: builder.mutation({ - query: (body) => ({ - url: 'refresh', - method: 'POST', - body - }) - }), - forgotPassword: builder.mutation({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/forgot-password`, - method: 'POST', - body - }) - }), - verifyPasswordResetToken: builder.mutation< - void, - VerifyPasswordResetTokenRequestBody - >({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/verify-reset`, - method: 'POST', - body - }) - }), - sendCode: builder.mutation({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/send-code`, - method: 'POST', - body - }) - }), - verifyEmail: builder.mutation({ - query: (body) => ({ - url: `${AUTH_API_BASE_URL}/verify-email`, - method: 'POST', - body - }) - }) - }) -}); - -export const { - useLoginMutation, - useLogoutMutation, - useRefreshMutation, - useForgotPasswordMutation, - useVerifyPasswordResetTokenMutation, - useSendCodeMutation, - useVerifyEmailMutation -} = authApi; diff --git a/frontend/lib/api/base.ts b/frontend/lib/api/base.ts deleted file mode 100644 index 3a67a6d66..000000000 --- a/frontend/lib/api/base.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; - -export const API_BASE_URL = 'http://127.0.0.1:8080/api/v1'; - -// BaseAPI for the entire application: -export const baseApi = createApi({ - baseQuery: fetchBaseQuery({ - baseUrl: API_BASE_URL, - credentials: 'include', - prepareHeaders: async (headers, { getState }) => { - const token = (getState() as { auth: { token: string } })?.auth - .token; - if (token) { - headers.set('Authorization', `Bearer ${token}`); - } - return headers; - } - }), - tagTypes: [ - 'User', - 'Tag', - 'Category', - 'Club', - 'Contact', - 'Event', - 'PointOfContact', - 'File', - 'Follower', - 'Member' - ], - endpoints: () => ({}) -}); - -// Add query params to a request: -export function handleQueryParams( - baseUrl: string, - queryParams?: Record -): string { - const url = new URL(baseUrl); - if (queryParams) { - Object.entries(queryParams).forEach(([key, value]) => { - url.searchParams.append(key, value.toString()); - }); - } - return url.toString(); -} diff --git a/frontend/lib/api/categoryApi.ts b/frontend/lib/api/categoryApi.ts deleted file mode 100644 index 161e307dc..000000000 --- a/frontend/lib/api/categoryApi.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { z } from 'zod'; - -import { - Category, - CreateCategoryRequestBody, - categorySchema -} from '../types/category'; -import { PaginationQueryParams } from '../types/root'; -import { Tag } from '../types/tag'; - -import { baseApi, handleQueryParams } from '../api/base'; - -const CATEGORY_API_BASE_URL = '/categories'; - -export const categoryApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - createCategory: builder.mutation({ - query: (body) => ({ - url: CATEGORY_API_BASE_URL, - method: 'POST', - body - }), - transformResponse: (response: Category) => { - return categorySchema.parse(response); - }, - invalidatesTags: ['Category'] - }), - categories: builder.query({ - query: (queryParams) => ({ - url: handleQueryParams( - `${CATEGORY_API_BASE_URL}/`, - queryParams - ), - method: 'GET' - }), - transformResponse: (response: Category[]) => { - return z.array(categorySchema).parse(response); - }, - providesTags: (result, _, _arg) => - result - ? result.map((category) => ({ - type: 'Category', - id: category.id - })) - : ['Category'] - }), - category: builder.query({ - query: (id) => ({ - url: `${CATEGORY_API_BASE_URL}/${id}/`, - method: 'GET' - }), - transformResponse: (response: Category) => { - return categorySchema.parse(response); - }, - providesTags: (result, _, id) => - result ? [{ type: 'Category', id }] : [] - }), - deleteCategory: builder.mutation({ - query: (id) => ({ - url: `${CATEGORY_API_BASE_URL}/${id}/`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, id) => [{ type: 'Category', id }] - }), - updateCategory: builder.mutation< - Category, - { id: string; body: CreateCategoryRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${CATEGORY_API_BASE_URL}/${id}/`, - method: 'PUT', - body - }), - transformResponse: (response: Category) => { - return categorySchema.parse(response); - }, - invalidatesTags: (result, _, { id }) => - result ? [{ type: 'Category', id }] : [] - }), - categoryTags: builder.query< - Tag[], - { id: string; queryParams?: PaginationQueryParams } - >({ - query: ({ id, queryParams }) => ({ - url: handleQueryParams( - `${CATEGORY_API_BASE_URL}/${id}/tags/`, - queryParams - ), - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((tag) => ({ type: 'Tag', id: tag.id })) - : ['Tag'] - }), - categoryTag: builder.query({ - query: ({ categoryID, tagID }) => ({ - url: `${CATEGORY_API_BASE_URL}/${categoryID}/tags/${tagID}/`, - method: 'GET' - }), - providesTags: (result, _, { tagID }) => - result ? [{ type: 'Tag', id: tagID }] : [] - }) - }) -}); - -export const { - useCreateCategoryMutation, - useCategoriesQuery, - useCategoryQuery, - useDeleteCategoryMutation, - useUpdateCategoryMutation, - useCategoryTagsQuery, - useCategoryTagQuery -} = categoryApi; diff --git a/frontend/lib/api/clubApi.ts b/frontend/lib/api/clubApi.ts deleted file mode 100644 index 3481f835b..000000000 --- a/frontend/lib/api/clubApi.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { z } from 'zod'; - -import { - Club, - CreateClubRequestBody, - CreateClubTagsRequestBody, - UpdateClubRequestBody, - clubSchema -} from '../types/club'; -import { - Contact, - CreateContactRequestBody, - contactSchema -} from '../types/contact'; -import { Event, eventSchema } from '../types/event'; -import { - PointOfContact, - UpdatePointOfContactRequestBody, - pointOfContactSchema -} from '../types/pointOfContact'; -import { PaginationQueryParams } from '../types/root'; -import { Tag, tagSchema } from '../types/tag'; -import { User, userSchema } from '../types/user'; - -import { baseApi, handleQueryParams } from '../api/base'; - -export const CLUB_API_BASE_URL = '/clubs'; - -export const clubApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - createClub: builder.mutation({ - query: (body) => ({ - url: `${CLUB_API_BASE_URL}/`, - method: 'POST', - body - }), - invalidatesTags: ['Club'], - transformResponse: (response: Club) => { - return clubSchema.parse(response); - } - }), - clubs: builder.query({ - query: (queryParams) => ({ - url: handleQueryParams(`${CLUB_API_BASE_URL}/`, queryParams), - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((club) => ({ type: 'Club', id: club.id })) - : ['Club'], - transformResponse: (response: Club) => { - return z.array(clubSchema).parse(response); - } - }), - club: builder.query({ - query: (id) => ({ - url: `${CLUB_API_BASE_URL}/${id}/`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'Club', id }] : [], - transformResponse: (response: Club) => { - return clubSchema.parse(response); - } - }), - updateClub: builder.mutation< - Club, - { id: string; body: UpdateClubRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${CLUB_API_BASE_URL}/${id}/`, - method: 'PATCH', - body - }), - invalidatesTags: (result, _, { id }) => - result ? [{ type: 'Club', id }] : [], - transformResponse: (response: Club) => { - return clubSchema.parse(response); - } - }), - deleteClub: builder.mutation({ - query: (id) => ({ - url: `${CLUB_API_BASE_URL}/${id}/`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, id) => [{ type: 'Club', id }] - }), - clubContacts: builder.query({ - query: (id) => ({ - url: `${CLUB_API_BASE_URL}/${id}/contacts/`, - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((contact) => ({ - type: 'Contact', - id: contact.id - })) - : ['Contact'], - transformResponse: (response: Contact) => { - return z.array(contactSchema).parse(response); - } - }), - createContact: builder.mutation< - Contact, - { id: string; body: CreateContactRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${CLUB_API_BASE_URL}/${id}/contacts/`, - method: 'PUT', - body - }), - invalidatesTags: ['Contact'], - transformResponse: (response: Contact) => { - return contactSchema.parse(response); - } - }), - clubEvents: builder.query< - Event[], - { id: string; queryParams?: PaginationQueryParams } - >({ - query: ({ id, queryParams }) => ({ - url: handleQueryParams( - `${CLUB_API_BASE_URL}/${id}/events/`, - queryParams - ), - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((event) => ({ type: 'Event', id: event.id })) - : ['Event'], - transformResponse: (response) => { - return z.array(eventSchema).parse(response); - } - }), - clubFollowers: builder.query< - User[], - { id: string; queryParams?: PaginationQueryParams } - >({ - query: ({ id, queryParams }) => ({ - url: handleQueryParams( - `${CLUB_API_BASE_URL}/${id}/followers/`, - queryParams - ), - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((follower) => ({ - type: 'Follower', - id: follower.id - })) - : ['Follower'], - transformResponse: (response) => { - return z.array(userSchema).parse(response); - } - }), - clubMembers: builder.query< - User[], - { id: string; queryParams?: PaginationQueryParams } - >({ - query: ({ id, queryParams }) => ({ - url: handleQueryParams( - `${CLUB_API_BASE_URL}/${id}/members/`, - queryParams - ), - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((member) => ({ type: 'User', id: member.id })) - : ['User'], - transformResponse: (response) => { - return z.array(userSchema).parse(response); - } - }), - clubPointOfContacts: builder.query({ - query: (id) => ({ - url: `${CLUB_API_BASE_URL}/${id}/pocs/`, - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((poc) => ({ - type: 'PointOfContact', - id: poc.id - })) - : ['PointOfContact'], - transformResponse: (response) => { - return z.array(pointOfContactSchema).parse(response); - } - }), - clubPointOfContact: builder.query< - PointOfContact, - { clubId: string; pocId: string } - >({ - query: ({ clubId, pocId }) => ({ - url: `${CLUB_API_BASE_URL}/${clubId}/pocs/${pocId}`, - method: 'GET' - }), - providesTags: (result, _, { pocId }) => - result ? [{ type: 'PointOfContact', id: pocId }] : [], - transformResponse: (response) => { - return pointOfContactSchema.parse(response); - } - }), - createClubPointOfContact: builder.mutation< - PointOfContact, - { id: string; body: FormData } - >({ - query: ({ id, body }) => ({ - url: `${CLUB_API_BASE_URL}/${id}/pocs/`, - method: 'POST', - body - }), - invalidatesTags: ['PointOfContact'], - transformResponse: (response) => { - return pointOfContactSchema.parse(response); - } - }), - updateClubPointOfContactPhoto: builder.mutation< - PointOfContact, - { clubId: string; pocId: string; body: FormData } - >({ - query: ({ clubId, pocId, body }) => ({ - url: `${CLUB_API_BASE_URL}/${clubId}/pocs/${pocId}/photo`, - method: 'PATCH', - body - }), - invalidatesTags: (result, _, { pocId }) => - result ? [{ type: 'PointOfContact', id: pocId }] : [], - transformResponse: (response) => { - return pointOfContactSchema.parse(response); - } - }), - updateClubPointOfContact: builder.mutation< - PointOfContact, - { - clubId: string; - pocId: string; - body: UpdatePointOfContactRequestBody; - } - >({ - query: ({ clubId, pocId, body }) => ({ - url: `${CLUB_API_BASE_URL}/${clubId}/pocs/${pocId}`, - method: 'PATCH', - body - }), - invalidatesTags: (result, _, { pocId }) => - result ? [{ type: 'PointOfContact', id: pocId }] : [], - transformResponse: (response) => { - return pointOfContactSchema.parse(response); - } - }), - deleteClubPointOfContact: builder.mutation< - void, - { clubId: string; pocId: string } - >({ - query: ({ clubId, pocId }) => ({ - url: `${CLUB_API_BASE_URL}/${clubId}/pocs/${pocId}`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, { pocId }) => [ - { type: 'PointOfContact', id: pocId } - ] - }), - createClubTags: builder.mutation< - Tag[], - { id: string; body: CreateClubTagsRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${CLUB_API_BASE_URL}/${id}/tags/`, - method: 'POST', - body - }), - invalidatesTags: (result, _, _arg) => - result - ? result.map((tag) => ({ type: 'Tag', id: tag.id })) - : ['Tag'], - transformResponse: (response) => { - return z.array(tagSchema).parse(response); - } - }), - clubTags: builder.query({ - query: (id) => ({ - url: `${CLUB_API_BASE_URL}/${id}/tags/`, - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((tag) => ({ type: 'Tag', id: tag.id })) - : ['Tag'], - transformResponse: (response) => { - return z.array(tagSchema).parse(response); - } - }), - deleteClubTag: builder.mutation< - void, - { clubId: string; tagId: string } - >({ - query: ({ clubId, tagId }) => ({ - url: `${CLUB_API_BASE_URL}/${clubId}/tags/${tagId}`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, { tagId }) => [ - { type: 'Tag', id: tagId } - ] - }) - }) -}); - -export const { - useCreateClubMutation, - useClubsQuery, - useClubQuery, - useUpdateClubMutation, - useDeleteClubMutation, - useClubContactsQuery, - useCreateContactMutation, - useClubEventsQuery, - useClubFollowersQuery, - useClubMembersQuery, - useClubPointOfContactsQuery, - useClubPointOfContactQuery, - useCreateClubPointOfContactMutation, - useUpdateClubPointOfContactPhotoMutation, - useUpdateClubPointOfContactMutation, - useDeleteClubPointOfContactMutation, - useCreateClubTagsMutation, - useClubTagsQuery, - useDeleteClubTagMutation -} = clubApi; diff --git a/frontend/lib/api/contactApi.ts b/frontend/lib/api/contactApi.ts deleted file mode 100644 index 396d94089..000000000 --- a/frontend/lib/api/contactApi.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from 'zod'; - -import { Contact, contactSchema } from '../types/contact'; -import { PaginationQueryParams } from '../types/root'; - -import { baseApi, handleQueryParams } from '../api/base'; - -const CONTACT_API_BASE_URL = '/contacts'; - -export const contactApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - contact: builder.query({ - query: (id) => ({ - url: `${CONTACT_API_BASE_URL}/${id}`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'Contact', id }] : [], - transformResponse: (response) => { - return contactSchema.parse(response); - } - }), - contacts: builder.query({ - query: (queryParams) => ({ - url: handleQueryParams(`${CONTACT_API_BASE_URL}/`, queryParams), - method: 'GET' - }), - providesTags: (result) => - result - ? result.map(({ id }) => ({ type: 'Contact', id })) - : ['Contact'], - transformResponse: (response) => { - return z.array(contactSchema).parse(response); - } - }), - deleteContact: builder.mutation({ - query: (id) => ({ - url: `${CONTACT_API_BASE_URL}/${id}`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, id) => [{ type: 'Contact', id }] - }) - }) -}); - -export const { useContactQuery, useContactsQuery, useDeleteContactMutation } = - contactApi; diff --git a/frontend/lib/api/eventApi.ts b/frontend/lib/api/eventApi.ts deleted file mode 100644 index ee8e29618..000000000 --- a/frontend/lib/api/eventApi.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { z } from 'zod'; - -import { Club, clubSchema } from '../types/club'; -import { - CreateEventRequestBody, - Event, - UpdateEventRequestBody, - eventSchema -} from '../types/event'; -import { PaginationQueryParams } from '../types/root'; -import { Tag } from '../types/tag'; - -import { baseApi, handleQueryParams } from '../api/base'; - -const EVENT_API_BASE_URL = '/events'; - -export const eventApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - events: builder.query({ - query: (queryParams) => ({ - url: handleQueryParams(`${EVENT_API_BASE_URL}/`, queryParams), - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((event) => ({ type: 'Event', id: event.id })) - : ['Event'], - transformResponse: (response) => { - return z.array(eventSchema).parse(response); - } - }), - event: builder.query({ - query: (id) => ({ - url: `${EVENT_API_BASE_URL}/${id}/`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'Event', id }] : [], - transformResponse: (response: Event) => { - return eventSchema.parse(response); - } - }), - createEvent: builder.mutation({ - query: (body) => ({ - url: `${EVENT_API_BASE_URL}/`, - method: 'POST', - body - }), - invalidatesTags: ['Event'], - transformResponse: (response) => { - return eventSchema.parse(response); - } - }), - updateEvent: builder.mutation< - Event, - { id: string; body: UpdateEventRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${EVENT_API_BASE_URL}/${id}`, - method: 'PATCH', - body - }), - invalidatesTags: (result, _, { id }) => - result ? [{ type: 'Event', id }] : [], - transformResponse: (response) => { - return eventSchema.parse(response); - } - }), - deleteEvent: builder.mutation({ - query: (id) => ({ - url: `${EVENT_API_BASE_URL}/${id}`, - method: 'DELETE' - }), - invalidatesTags: (result, _, id) => - result ? [{ type: 'Event', id }] : [] - }), - eventHosts: builder.query({ - query: (id) => ({ - url: `${EVENT_API_BASE_URL}/${id}/hosts`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'Event', id }, 'Club'] : ['Event'], - transformResponse: (response) => { - return z.array(clubSchema).parse(response); - } - }), - eventTags: builder.query({ - query: (id) => ({ - url: `${EVENT_API_BASE_URL}/${id}/tags`, - method: 'GET' - }), - providesTags: (result, _, _arg) => - result - ? result.map((tag) => ({ type: 'Tag', id: tag.id })) - : ['Tag'] - }) - }) -}); - -export const { - useEventsQuery, - useEventQuery, - useCreateEventMutation, - useUpdateEventMutation, - useDeleteEventMutation, - useEventHostsQuery, - useEventTagsQuery -} = eventApi; diff --git a/frontend/lib/api/fileApi.ts b/frontend/lib/api/fileApi.ts deleted file mode 100644 index 9df28d1ee..000000000 --- a/frontend/lib/api/fileApi.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { z } from 'zod'; - -import { File, fileSchema } from '../types/file'; -import { PaginationQueryParams } from '../types/root'; - -import { baseApi, handleQueryParams } from '../api/base'; - -const FILE_API_BASE_URL = '/files'; - -export const fileApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - files: builder.query({ - query: (queryParams) => ({ - url: handleQueryParams(`${FILE_API_BASE_URL}/`, queryParams), - method: 'GET' - }), - providesTags: (result) => - result - ? result.map(({ id }) => ({ type: 'File', id })) - : ['File'], - transformResponse: (response) => { - return z.array(fileSchema).parse(response); - } - }), - file: builder.query({ - query: (id) => ({ - url: `${FILE_API_BASE_URL}/${id}`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'File', id }] : [], - transformResponse: (response) => { - return fileSchema.parse(response); - } - }), - createFile: builder.mutation({ - query: (body) => ({ - url: `${FILE_API_BASE_URL}/`, - method: 'POST', - body - }), - invalidatesTags: ['File'], - transformResponse: (response) => { - return fileSchema.parse(response); - } - }), - deleteFile: builder.mutation({ - query: (id) => ({ - url: `${FILE_API_BASE_URL}/${id}`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, id) => [{ type: 'File', id }] - }) - }) -}); - -export const { - useFilesQuery, - useFileQuery, - useCreateFileMutation, - useDeleteFileMutation -} = fileApi; diff --git a/frontend/lib/api/index.ts b/frontend/lib/api/index.ts deleted file mode 100644 index d9f91448e..000000000 --- a/frontend/lib/api/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './tagApi'; -export * from './userApi'; -export * from './eventApi'; -export * from './contactApi'; -export * from './clubApi'; -export * from './categoryApi'; -export * from './pointOfContactApi'; -export * from './fileApi'; -export * from './authApi'; -export * from './base'; diff --git a/frontend/lib/api/pointOfContactApi.ts b/frontend/lib/api/pointOfContactApi.ts deleted file mode 100644 index 905a6a499..000000000 --- a/frontend/lib/api/pointOfContactApi.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { z } from 'zod'; - -import { PointOfContact, pointOfContactSchema } from '../types/pointOfContact'; -import { PaginationQueryParams } from '../types/root'; - -import { baseApi, handleQueryParams } from '../api/base'; - -const POC_API_BASE_URL = '/pocs'; - -export const pointOfContactApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - pointOfContacts: builder.query( - { - query: (queryParams) => ({ - url: handleQueryParams(`${POC_API_BASE_URL}/`, queryParams), - method: 'GET' - }), - providesTags: (result) => - result - ? result.map(({ id }) => ({ - type: 'PointOfContact', - id - })) - : ['PointOfContact'], - transformResponse: (response) => { - return z.array(pointOfContactSchema).parse(response); - } - } - ), - pointOfContact: builder.query({ - query: (id) => ({ - url: `${POC_API_BASE_URL}/${id}`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'PointOfContact', id }] : [], - transformResponse: (response) => { - return pointOfContactSchema.parse(response); - } - }) - }) -}); - -export const { usePointOfContactsQuery, usePointOfContactQuery } = - pointOfContactApi; diff --git a/frontend/lib/api/tagApi.ts b/frontend/lib/api/tagApi.ts deleted file mode 100644 index c302b2d3a..000000000 --- a/frontend/lib/api/tagApi.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { z } from 'zod'; - -import { PaginationQueryParams } from '../types/root'; -import { - CreateTagRequestBody, - Tag, - UpdateTagRequestBody, - tagSchema -} from '../types/tag'; - -import { baseApi, handleQueryParams } from '../api/base'; - -const TAG_API_BASE_URL = '/tags'; - -export const tagApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - tags: builder.query({ - query: (queryParams) => ({ - url: handleQueryParams(`${TAG_API_BASE_URL}/`, queryParams), - method: 'GET' - }), - providesTags: (result) => - result - ? result.map(({ id }) => ({ type: 'Tag', id })) - : ['Tag'], - transformResponse: (response) => { - return z.array(tagSchema).parse(response); - } - }), - tag: builder.query({ - query: (id) => ({ - url: `${TAG_API_BASE_URL}/${id}/`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'Tag', id }] : [], - transformResponse: (response) => { - return tagSchema.parse(response); - } - }), - createTag: builder.mutation({ - query: (body) => ({ - url: `${TAG_API_BASE_URL}/`, - method: 'POST', - body - }), - invalidatesTags: ['Tag'], - transformResponse: (response) => { - return tagSchema.parse(response); - } - }), - updateTag: builder.mutation< - Tag, - { id: string; body: UpdateTagRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${TAG_API_BASE_URL}/${id}/`, - method: 'PATCH', - body - }), - invalidatesTags: (result, _, { id }) => - result ? [{ type: 'Tag', id }] : [], - transformResponse: (response) => { - return tagSchema.parse(response); - } - }), - deleteTag: builder.mutation({ - query: (id) => ({ - url: `${TAG_API_BASE_URL}/${id}/`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, id) => [{ type: 'Tag', id }] - }) - }) -}); - -export const { - useTagsQuery, - useTagQuery, - useCreateTagMutation, - useUpdateTagMutation, - useDeleteTagMutation -} = tagApi; diff --git a/frontend/lib/api/userApi.ts b/frontend/lib/api/userApi.ts deleted file mode 100644 index 3092daa01..000000000 --- a/frontend/lib/api/userApi.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { z } from 'zod'; - -import { UpdatePasswordRequestBody } from '../types/auth'; -import { Club, clubSchema } from '../types/club'; -import { PaginationQueryParams } from '../types/root'; -import { Tag, tagSchema } from '../types/tag'; -import { - CreateUserRequestBody, - CreateUserTagsRequestBody, - UpdateUserRequestBody, - User, - userSchema -} from '../types/user'; - -import { baseApi, handleQueryParams } from '../api/base'; - -const USER_API_BASE_URL = '/users'; - -export const userApi = baseApi.injectEndpoints({ - endpoints: (builder) => ({ - users: builder.query({ - query: (queryParams) => ({ - url: handleQueryParams(`${USER_API_BASE_URL}/`, queryParams), - method: 'GET' - }), - providesTags: (result) => - result - ? result.map(({ id }) => ({ type: 'User', id })) - : ['User'], - transformResponse: (response) => { - return z.array(userSchema).parse(response); - } - }), - user: builder.query({ - query: (id) => ({ - url: `${USER_API_BASE_URL}/${id}/`, - method: 'GET' - }), - providesTags: (result, _, id) => - result ? [{ type: 'User', id }] : [], - transformResponse: (response) => { - return userSchema.parse(response); - } - }), - currentUser: builder.query({ - query: () => ({ - url: `${USER_API_BASE_URL}/me`, - method: 'GET' - }), - providesTags: (result) => - result ? [{ type: 'User', id: result.id }] : [], - transformResponse: (response) => { - return userSchema.parse(response); - } - }), - createUser: builder.mutation({ - query: (body) => ({ - url: `${USER_API_BASE_URL}/`, - method: 'POST', - body - }), - invalidatesTags: ['User'], - transformResponse: (response) => { - return userSchema.parse(response); - } - }), - updateUser: builder.mutation< - User, - { id: string; body: UpdateUserRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${USER_API_BASE_URL}/${id}/`, - method: 'PATCH', - body - }), - invalidatesTags: (result, _, { id }) => - result ? [{ type: 'User', id }] : [], - transformResponse: (response) => { - return userSchema.parse(response); - } - }), - deleteUser: builder.mutation({ - query: (id) => ({ - url: `${USER_API_BASE_URL}/${id}/`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, id) => [{ type: 'User', id }] - }), - updatePassword: builder.mutation< - void, - { id: string; body: UpdatePasswordRequestBody } - >({ - query: ({ id, body }) => ({ - url: `${USER_API_BASE_URL}/${id}/password`, - method: 'PATCH', - body - }) - }), - userFollowing: builder.query({ - query: (id) => ({ - url: `${USER_API_BASE_URL}/${id}/follower/`, - method: 'GET' - }), - providesTags: (result, _, id) => - result - ? [{ type: 'Follower', id }, 'Club'] - : [{ type: 'Follower', id }], - transformResponse: (response) => { - return z.array(clubSchema).parse(response); - } - }), - createUserFollowing: builder.mutation< - void, - { userID: string; clubID: string } - >({ - query: ({ userID, clubID }) => ({ - url: `${USER_API_BASE_URL}/${userID}/follower/${clubID}`, - method: 'POST' - }), - invalidatesTags: (_result, _, { userID }) => [ - { type: 'Follower', id: userID } - ] - }), - deleteUserFollowing: builder.mutation< - void, - { userID: string; clubID: string } - >({ - query: ({ userID, clubID }) => ({ - url: `${USER_API_BASE_URL}/${userID}/follower/${clubID}`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, { userID }) => [ - { type: 'Follower', id: userID } - ] - }), - userMembership: builder.query({ - query: (id) => ({ - url: `${USER_API_BASE_URL}/${id}/member/`, - method: 'GET' - }), - providesTags: (result, _, id) => - result - ? [{ type: 'Member', id }, 'Club'] - : [{ type: 'Member', id }], - transformResponse: (response) => { - return z.array(clubSchema).parse(response); - } - }), - createUserMembership: builder.mutation< - void, - { userID: string; clubID: string } - >({ - query: ({ userID, clubID }) => ({ - url: `${USER_API_BASE_URL}/${userID}/member/${clubID}`, - method: 'POST' - }), - invalidatesTags: (_result, _, { userID }) => [ - { type: 'Follower', id: userID }, - { type: 'Member', id: userID } - ] - }), - deleteUserMembership: builder.mutation< - void, - { userID: string; clubID: string } - >({ - query: ({ userID, clubID }) => ({ - url: `${USER_API_BASE_URL}/${userID}/member/${clubID}`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, { userID }) => [ - { type: 'Member', id: userID } - ] - }), - userTags: builder.query({ - query: () => ({ - url: `${USER_API_BASE_URL}/tags/`, - method: 'GET' - }), - providesTags: (result) => - result - ? result.map((tag) => ({ type: 'Tag', id: tag.id })) - : ['Tag'], - transformResponse: (response) => { - return z.array(tagSchema).parse(response); - } - }), - createUserTags: builder.mutation({ - query: (body) => ({ - url: `${USER_API_BASE_URL}/tags/`, - method: 'POST', - body - }), - invalidatesTags: (result, _, _arg) => - result - ? result.map((tag) => ({ type: 'Tag', id: tag.id })) - : ['Tag'], - transformResponse: (response) => { - return z.array(tagSchema).parse(response); - } - }), - deleteUserTag: builder.mutation({ - query: (id) => ({ - url: `${USER_API_BASE_URL}/tags/${id}/`, - method: 'DELETE' - }), - invalidatesTags: (_result, _, id) => [{ type: 'Tag', id }] - }) - }) -}); - -export const { - useUsersQuery, - useUserQuery, - useCurrentUserQuery, - useCreateUserMutation, - useUpdateUserMutation, - useDeleteUserMutation, - useUpdatePasswordMutation, - useUserFollowingQuery, - useCreateUserFollowingMutation, - useDeleteUserFollowingMutation, - useUserMembershipQuery, - useCreateUserMembershipMutation, - useDeleteUserMembershipMutation, - useUserTagsQuery, - useCreateUserTagsMutation, - useDeleteUserTagMutation -} = userApi; diff --git a/frontend/lib/const.ts b/frontend/lib/const.ts deleted file mode 100644 index 75dab23f5..000000000 --- a/frontend/lib/const.ts +++ /dev/null @@ -1 +0,0 @@ -export const API_BASE_URL = 'http://127.0.0.1:8080/api/v1'; diff --git a/frontend/lib/index.ts b/frontend/lib/index.ts deleted file mode 100644 index 4d4b4e299..000000000 --- a/frontend/lib/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './api'; -export * from './types'; diff --git a/frontend/lib/package.json b/frontend/lib/package.json index 116e230ac..35c09da62 100644 --- a/frontend/lib/package.json +++ b/frontend/lib/package.json @@ -1,19 +1,56 @@ { - "name": "@sac/lib", - "main": "index.ts", - "version": "0.1.0", - "scripts": { - "test": "echo \"Woah there, we have no frontend tests as of right now. Let's just say we're passing.\" && exit 0", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx --fix", - "format": "prettier --write ." - }, - "private": true, - "dependencies": { - "@reduxjs/toolkit": "^2.2.3", - "zod": "^3.23.4" - }, - "devDependencies": { - "eslint-plugin-prettier": "^5.1.3", - "prettier": "^3.2.4" - } + "name": "@generatesac/lib", + "version": "0.0.1", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "description": "This repository holds the common types, apis, and components for frontend library used by the Student Activity Calendar.", + "repository": { + "url": "https://github.com/GenerateNU/sac" + }, + "license": "ISC", + "scripts": { + "dev": "vite", + "format": "prettier --write .", + "build": "tsc && vite build", + "watch": "yarn build --watch", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "test": "echo \"Woah there, we have no frontend tests as of right now. Let's just say we're passing.\" && exit 0" + }, + "dependencies": { + "@reduxjs/toolkit": "^2.2.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-redux": "^9.1.2", + "zod": "^3.23.6" + }, + "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/node": "^20.12.10", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "glob": "^10.3.12", + "prettier": "^3.2.5", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "vite-plugin-dts": "^3.9.1", + "vite-plugin-lib-inject-css": "^2.0.1" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "publishConfig": { + "@generatesac:registry": "https://npm.pkg.github.com" + } } diff --git a/frontend/lib/src/api/authApi.ts b/frontend/lib/src/api/authApi.ts new file mode 100644 index 000000000..e16cd6fef --- /dev/null +++ b/frontend/lib/src/api/authApi.ts @@ -0,0 +1,69 @@ +import { LoginRequestBody, RefreshTokenRequestBody } from "../types/auth"; +import { User, userSchema } from "../types/user"; +import { + EmailRequestBody, + VerifyEmailRequestBody, + VerifyPasswordResetTokenRequestBody, +} from "../types/verification"; +import { baseApi } from "./base"; + +const AUTH_API_BASE_URL = "/auth"; + +export const authApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + login: builder.mutation({ + query: (body) => ({ + url: `${AUTH_API_BASE_URL}/login`, + method: "POST", + body, + }), + transformResponse: (response: User) => { + return userSchema.parse(response); + }, + }), + logout: builder.mutation({ + query: () => ({ + url: `${AUTH_API_BASE_URL}/logout`, + method: "POST", + }), + }), + refresh: builder.mutation({ + query: (body) => ({ + url: "refresh", + method: "POST", + body, + }), + }), + forgotPassword: builder.mutation({ + query: (body) => ({ + url: `${AUTH_API_BASE_URL}/forgot-password`, + method: "POST", + body, + }), + }), + verifyPasswordResetToken: builder.mutation< + void, + VerifyPasswordResetTokenRequestBody + >({ + query: (body) => ({ + url: `${AUTH_API_BASE_URL}/verify-reset`, + method: "POST", + body, + }), + }), + sendCode: builder.mutation({ + query: (body) => ({ + url: `${AUTH_API_BASE_URL}/send-code`, + method: "POST", + body, + }), + }), + verifyEmail: builder.mutation({ + query: (body) => ({ + url: `${AUTH_API_BASE_URL}/verify-email`, + method: "POST", + body, + }), + }), + }), +}); diff --git a/frontend/lib/src/api/base.ts b/frontend/lib/src/api/base.ts new file mode 100644 index 000000000..f4171fc23 --- /dev/null +++ b/frontend/lib/src/api/base.ts @@ -0,0 +1,45 @@ +import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; + +export const API_BASE_URL = "http://127.0.0.1:8080/api/v1"; + +// BaseAPI for the entire application: +export const baseApi = createApi({ + baseQuery: fetchBaseQuery({ + baseUrl: API_BASE_URL, + credentials: "include", + prepareHeaders: async (headers, { getState }) => { + const token = (getState() as { auth: { token: string } })?.auth.token; + if (token) { + headers.set("Authorization", `Bearer ${token}`); + } + return headers; + }, + }), + tagTypes: [ + "User", + "Tag", + "Category", + "Club", + "Contact", + "Event", + "PointOfContact", + "File", + "Follower", + "Member", + ], + endpoints: () => ({}), +}); + +// Add query params to a request: +export function handleQueryParams( + baseUrl: string, + queryParams?: Record, +): string { + const url = new URL(baseUrl); + if (queryParams) { + Object.entries(queryParams).forEach(([key, value]) => { + url.searchParams.append(key, value.toString()); + }); + } + return url.toString(); +} diff --git a/frontend/lib/src/api/categoryApi.ts b/frontend/lib/src/api/categoryApi.ts new file mode 100644 index 000000000..d2f5e9259 --- /dev/null +++ b/frontend/lib/src/api/categoryApi.ts @@ -0,0 +1,99 @@ +import { z } from "zod"; + +import { + Category, + CreateCategoryRequestBody, + categorySchema, +} from "../types/category"; +import { PaginationQueryParams } from "../types/root"; +import { Tag } from "../types/tag"; +import { baseApi, handleQueryParams } from "./base"; + +const CATEGORY_API_BASE_URL = "/categories"; + +export const categoryApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + createCategory: builder.mutation({ + query: (body) => ({ + url: CATEGORY_API_BASE_URL, + method: "POST", + body, + }), + transformResponse: (response: Category) => { + return categorySchema.parse(response); + }, + invalidatesTags: ["Category"], + }), + categories: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${CATEGORY_API_BASE_URL}/`, queryParams), + method: "GET", + }), + transformResponse: (response: Category[]) => { + return z.array(categorySchema).parse(response); + }, + providesTags: (result, _, _arg) => + result + ? result.map((category) => ({ + type: "Category", + id: category.id, + })) + : ["Category"], + }), + category: builder.query({ + query: (id) => ({ + url: `${CATEGORY_API_BASE_URL}/${id}/`, + method: "GET", + }), + transformResponse: (response: Category) => { + return categorySchema.parse(response); + }, + providesTags: (result, _, id) => + result ? [{ type: "Category", id }] : [], + }), + deleteCategory: builder.mutation({ + query: (id) => ({ + url: `${CATEGORY_API_BASE_URL}/${id}/`, + method: "DELETE", + }), + invalidatesTags: (_result, _, id) => [{ type: "Category", id }], + }), + updateCategory: builder.mutation< + Category, + { id: string; body: CreateCategoryRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${CATEGORY_API_BASE_URL}/${id}/`, + method: "PUT", + body, + }), + transformResponse: (response: Category) => { + return categorySchema.parse(response); + }, + invalidatesTags: (result, _, { id }) => + result ? [{ type: "Category", id }] : [], + }), + categoryTags: builder.query< + Tag[], + { id: string; queryParams?: PaginationQueryParams } + >({ + query: ({ id, queryParams }) => ({ + url: handleQueryParams( + `${CATEGORY_API_BASE_URL}/${id}/tags/`, + queryParams, + ), + method: "GET", + }), + providesTags: (result, _, _arg) => + result ? result.map((tag) => ({ type: "Tag", id: tag.id })) : ["Tag"], + }), + categoryTag: builder.query({ + query: ({ categoryID, tagID }) => ({ + url: `${CATEGORY_API_BASE_URL}/${categoryID}/tags/${tagID}/`, + method: "GET", + }), + providesTags: (result, _, { tagID }) => + result ? [{ type: "Tag", id: tagID }] : [], + }), + }), +}); diff --git a/frontend/lib/src/api/clubApi.ts b/frontend/lib/src/api/clubApi.ts new file mode 100644 index 000000000..278836379 --- /dev/null +++ b/frontend/lib/src/api/clubApi.ts @@ -0,0 +1,322 @@ +import { z } from "zod"; + +import { + Club, + CreateClubRequestBody, + CreateClubTagsRequestBody, + UpdateClubRequestBody, + clubSchema, +} from "../types/club"; +import { + Contact, + CreateContactRequestBody, + contactSchema, +} from "../types/contact"; +import { Event, eventSchema } from "../types/event"; +import { + PointOfContact, + UpdatePointOfContactRequestBody, + pointOfContactSchema, +} from "../types/pointOfContact"; +import { PaginationQueryParams } from "../types/root"; +import { Tag, tagSchema } from "../types/tag"; +import { User, userSchema } from "../types/user"; +import { baseApi, handleQueryParams } from "./base"; + +export const CLUB_API_BASE_URL = "/clubs"; + +export const clubApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + createClub: builder.mutation({ + query: (body) => ({ + url: `${CLUB_API_BASE_URL}/`, + method: "POST", + body, + }), + invalidatesTags: ["Club"], + transformResponse: (response: Club) => { + return clubSchema.parse(response); + }, + }), + clubs: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${CLUB_API_BASE_URL}/`, queryParams), + method: "GET", + }), + providesTags: (result, _, _arg) => + result + ? result.map((club) => ({ type: "Club", id: club.id })) + : ["Club"], + transformResponse: (response: Club) => { + return z.array(clubSchema).parse(response); + }, + }), + club: builder.query({ + query: (id) => ({ + url: `${CLUB_API_BASE_URL}/${id}/`, + method: "GET", + }), + providesTags: (result, _, id) => (result ? [{ type: "Club", id }] : []), + transformResponse: (response: Club) => { + return clubSchema.parse(response); + }, + }), + updateClub: builder.mutation< + Club, + { id: string; body: UpdateClubRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${CLUB_API_BASE_URL}/${id}/`, + method: "PATCH", + body, + }), + invalidatesTags: (result, _, { id }) => + result ? [{ type: "Club", id }] : [], + transformResponse: (response: Club) => { + return clubSchema.parse(response); + }, + }), + deleteClub: builder.mutation({ + query: (id) => ({ + url: `${CLUB_API_BASE_URL}/${id}/`, + method: "DELETE", + }), + invalidatesTags: (_result, _, id) => [{ type: "Club", id }], + }), + clubContacts: builder.query({ + query: (id) => ({ + url: `${CLUB_API_BASE_URL}/${id}/contacts/`, + method: "GET", + }), + providesTags: (result, _, _arg) => + result + ? result.map((contact) => ({ + type: "Contact", + id: contact.id, + })) + : ["Contact"], + transformResponse: (response: Contact) => { + return z.array(contactSchema).parse(response); + }, + }), + createContact: builder.mutation< + Contact, + { id: string; body: CreateContactRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${CLUB_API_BASE_URL}/${id}/contacts/`, + method: "PUT", + body, + }), + invalidatesTags: ["Contact"], + transformResponse: (response: Contact) => { + return contactSchema.parse(response); + }, + }), + clubEvents: builder.query< + Event[], + { id: string; queryParams?: PaginationQueryParams } + >({ + query: ({ id, queryParams }) => ({ + url: handleQueryParams( + `${CLUB_API_BASE_URL}/${id}/events/`, + queryParams, + ), + method: "GET", + }), + providesTags: (result, _, _arg) => + result + ? result.map((event) => ({ type: "Event", id: event.id })) + : ["Event"], + transformResponse: (response) => { + return z.array(eventSchema).parse(response); + }, + }), + clubFollowers: builder.query< + User[], + { id: string; queryParams?: PaginationQueryParams } + >({ + query: ({ id, queryParams }) => ({ + url: handleQueryParams( + `${CLUB_API_BASE_URL}/${id}/followers/`, + queryParams, + ), + method: "GET", + }), + providesTags: (result, _, _arg) => + result + ? result.map((follower) => ({ + type: "Follower", + id: follower.id, + })) + : ["Follower"], + transformResponse: (response) => { + return z.array(userSchema).parse(response); + }, + }), + clubMembers: builder.query< + User[], + { id: string; queryParams?: PaginationQueryParams } + >({ + query: ({ id, queryParams }) => ({ + url: handleQueryParams( + `${CLUB_API_BASE_URL}/${id}/members/`, + queryParams, + ), + method: "GET", + }), + providesTags: (result, _, _arg) => + result + ? result.map((member) => ({ type: "User", id: member.id })) + : ["User"], + transformResponse: (response) => { + return z.array(userSchema).parse(response); + }, + }), + createClubMember: builder.mutation< + User, + { clubID: string; userID: string } + >({ + query: ({ clubID, userID }) => ({ + url: `${CLUB_API_BASE_URL}/${clubID}/members/${userID}`, + method: "POST", + }), + invalidatesTags: (result, _, { userID }) => + result ? [{ type: "User", id: userID }] : [], + }), + deleteClubMember: builder.mutation< + void, + { clubID: string; userID: string } + >({ + query: ({ clubID, userID }) => ({ + url: `${CLUB_API_BASE_URL}/${clubID}/members/${userID}`, + method: "DELETE", + }), + invalidatesTags: (result, _, { userID }) => + result ? [{ type: "User", id: userID }] : [], + }), + clubPointOfContacts: builder.query({ + query: (id) => ({ + url: `${CLUB_API_BASE_URL}/${id}/pocs/`, + method: "GET", + }), + providesTags: (result, _, _arg) => + result + ? result.map((poc) => ({ + type: "PointOfContact", + id: poc.id, + })) + : ["PointOfContact"], + transformResponse: (response) => { + return z.array(pointOfContactSchema).parse(response); + }, + }), + clubPointOfContact: builder.query< + PointOfContact, + { clubID: string; pocId: string } + >({ + query: ({ clubID, pocId }) => ({ + url: `${CLUB_API_BASE_URL}/${clubID}/pocs/${pocId}`, + method: "GET", + }), + providesTags: (result, _, { pocId }) => + result ? [{ type: "PointOfContact", id: pocId }] : [], + transformResponse: (response) => { + return pointOfContactSchema.parse(response); + }, + }), + createClubPointOfContact: builder.mutation< + PointOfContact, + { id: string; body: FormData } + >({ + query: ({ id, body }) => ({ + url: `${CLUB_API_BASE_URL}/${id}/pocs/`, + method: "POST", + body, + }), + invalidatesTags: ["PointOfContact"], + transformResponse: (response) => { + return pointOfContactSchema.parse(response); + }, + }), + updateClubPointOfContactPhoto: builder.mutation< + PointOfContact, + { clubID: string; pocId: string; body: FormData } + >({ + query: ({ clubID, pocId, body }) => ({ + url: `${CLUB_API_BASE_URL}/${clubID}/pocs/${pocId}/photo`, + method: "PATCH", + body, + }), + invalidatesTags: (result, _, { pocId }) => + result ? [{ type: "PointOfContact", id: pocId }] : [], + transformResponse: (response) => { + return pointOfContactSchema.parse(response); + }, + }), + updateClubPointOfContact: builder.mutation< + PointOfContact, + { + clubID: string; + pocId: string; + body: UpdatePointOfContactRequestBody; + } + >({ + query: ({ clubID, pocId, body }) => ({ + url: `${CLUB_API_BASE_URL}/${clubID}/pocs/${pocId}`, + method: "PATCH", + body, + }), + invalidatesTags: (result, _, { pocId }) => + result ? [{ type: "PointOfContact", id: pocId }] : [], + transformResponse: (response) => { + return pointOfContactSchema.parse(response); + }, + }), + deleteClubPointOfContact: builder.mutation< + void, + { clubID: string; pocId: string } + >({ + query: ({ clubID, pocId }) => ({ + url: `${CLUB_API_BASE_URL}/${clubID}/pocs/${pocId}`, + method: "DELETE", + }), + invalidatesTags: (_result, _, { pocId }) => [ + { type: "PointOfContact", id: pocId }, + ], + }), + createClubTags: builder.mutation< + Tag[], + { id: string; body: CreateClubTagsRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${CLUB_API_BASE_URL}/${id}/tags/`, + method: "POST", + body, + }), + invalidatesTags: (result, _, _arg) => + result ? result.map((tag) => ({ type: "Tag", id: tag.id })) : ["Tag"], + transformResponse: (response) => { + return z.array(tagSchema).parse(response); + }, + }), + clubTags: builder.query({ + query: (id) => ({ + url: `${CLUB_API_BASE_URL}/${id}/tags/`, + method: "GET", + }), + providesTags: (result, _, _arg) => + result ? result.map((tag) => ({ type: "Tag", id: tag.id })) : ["Tag"], + transformResponse: (response) => { + return z.array(tagSchema).parse(response); + }, + }), + deleteClubTag: builder.mutation({ + query: ({ clubID, tagId }) => ({ + url: `${CLUB_API_BASE_URL}/${clubID}/tags/${tagId}`, + method: "DELETE", + }), + invalidatesTags: (_result, _, { tagId }) => [{ type: "Tag", id: tagId }], + }), + }), +}); diff --git a/frontend/lib/src/api/contactApi.ts b/frontend/lib/src/api/contactApi.ts new file mode 100644 index 000000000..1f49c01e7 --- /dev/null +++ b/frontend/lib/src/api/contactApi.ts @@ -0,0 +1,43 @@ +import { z } from "zod"; + +import { Contact, contactSchema } from "../types/contact"; +import { PaginationQueryParams } from "../types/root"; +import { baseApi, handleQueryParams } from "./base"; + +const CONTACT_API_BASE_URL = "/contacts"; + +export const contactApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + contact: builder.query({ + query: (id) => ({ + url: `${CONTACT_API_BASE_URL}/${id}`, + method: "GET", + }), + providesTags: (result, _, id) => + result ? [{ type: "Contact", id }] : [], + transformResponse: (response) => { + return contactSchema.parse(response); + }, + }), + contacts: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${CONTACT_API_BASE_URL}/`, queryParams), + method: "GET", + }), + providesTags: (result) => + result + ? result.map(({ id }) => ({ type: "Contact", id })) + : ["Contact"], + transformResponse: (response) => { + return z.array(contactSchema).parse(response); + }, + }), + deleteContact: builder.mutation({ + query: (id) => ({ + url: `${CONTACT_API_BASE_URL}/${id}`, + method: "DELETE", + }), + invalidatesTags: (_result, _, id) => [{ type: "Contact", id }], + }), + }), +}); diff --git a/frontend/lib/src/api/eventApi.ts b/frontend/lib/src/api/eventApi.ts new file mode 100644 index 000000000..6a20e8b28 --- /dev/null +++ b/frontend/lib/src/api/eventApi.ts @@ -0,0 +1,95 @@ +import { z } from "zod"; + +import { Club, clubSchema } from "../types/club"; +import { + CreateEventRequestBody, + Event, + UpdateEventRequestBody, + eventSchema, +} from "../types/event"; +import { PaginationQueryParams } from "../types/root"; +import { Tag } from "../types/tag"; +import { baseApi, handleQueryParams } from "./base"; + +const EVENT_API_BASE_URL = "/events"; + +export const eventApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + events: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${EVENT_API_BASE_URL}/`, queryParams), + method: "GET", + }), + providesTags: (result, _, _arg) => + result + ? result.map((event) => ({ type: "Event", id: event.id })) + : ["Event"], + transformResponse: (response) => { + return z.array(eventSchema).parse(response); + }, + }), + event: builder.query({ + query: (id) => ({ + url: `${EVENT_API_BASE_URL}/${id}/`, + method: "GET", + }), + providesTags: (result, _, id) => (result ? [{ type: "Event", id }] : []), + transformResponse: (response: Event) => { + return eventSchema.parse(response); + }, + }), + createEvent: builder.mutation({ + query: (body) => ({ + url: `${EVENT_API_BASE_URL}/`, + method: "POST", + body, + }), + invalidatesTags: ["Event"], + transformResponse: (response) => { + return eventSchema.parse(response); + }, + }), + updateEvent: builder.mutation< + Event, + { id: string; body: UpdateEventRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${EVENT_API_BASE_URL}/${id}`, + method: "PATCH", + body, + }), + invalidatesTags: (result, _, { id }) => + result ? [{ type: "Event", id }] : [], + transformResponse: (response) => { + return eventSchema.parse(response); + }, + }), + deleteEvent: builder.mutation({ + query: (id) => ({ + url: `${EVENT_API_BASE_URL}/${id}`, + method: "DELETE", + }), + invalidatesTags: (result, _, id) => + result ? [{ type: "Event", id }] : [], + }), + eventHosts: builder.query({ + query: (id) => ({ + url: `${EVENT_API_BASE_URL}/${id}/hosts`, + method: "GET", + }), + providesTags: (result, _, id) => + result ? [{ type: "Event", id }, "Club"] : ["Event"], + transformResponse: (response) => { + return z.array(clubSchema).parse(response); + }, + }), + eventTags: builder.query({ + query: (id) => ({ + url: `${EVENT_API_BASE_URL}/${id}/tags`, + method: "GET", + }), + providesTags: (result, _, _arg) => + result ? result.map((tag) => ({ type: "Tag", id: tag.id })) : ["Tag"], + }), + }), +}); diff --git a/frontend/lib/src/api/fileApi.ts b/frontend/lib/src/api/fileApi.ts new file mode 100644 index 000000000..9725b7fb3 --- /dev/null +++ b/frontend/lib/src/api/fileApi.ts @@ -0,0 +1,51 @@ +import { z } from "zod"; + +import { File, fileSchema } from "../types/file"; +import { PaginationQueryParams } from "../types/root"; +import { baseApi, handleQueryParams } from "./base"; + +const FILE_API_BASE_URL = "/files"; + +export const fileApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + files: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${FILE_API_BASE_URL}/`, queryParams), + method: "GET", + }), + providesTags: (result) => + result ? result.map(({ id }) => ({ type: "File", id })) : ["File"], + transformResponse: (response) => { + return z.array(fileSchema).parse(response); + }, + }), + file: builder.query({ + query: (id) => ({ + url: `${FILE_API_BASE_URL}/${id}`, + method: "GET", + }), + providesTags: (result, _, id) => (result ? [{ type: "File", id }] : []), + transformResponse: (response) => { + return fileSchema.parse(response); + }, + }), + createFile: builder.mutation({ + query: (body) => ({ + url: `${FILE_API_BASE_URL}/`, + method: "POST", + body, + }), + invalidatesTags: ["File"], + transformResponse: (response) => { + return fileSchema.parse(response); + }, + }), + deleteFile: builder.mutation({ + query: (id) => ({ + url: `${FILE_API_BASE_URL}/${id}`, + method: "DELETE", + }), + invalidatesTags: (_result, _, id) => [{ type: "File", id }], + }), + }), +}); diff --git a/frontend/lib/src/api/index.ts b/frontend/lib/src/api/index.ts new file mode 100644 index 000000000..36963c18c --- /dev/null +++ b/frontend/lib/src/api/index.ts @@ -0,0 +1,10 @@ +export * from "./tagApi"; +export * from "./userApi"; +export * from "./eventApi"; +export * from "./contactApi"; +export * from "./clubApi"; +export * from "./categoryApi"; +export * from "./pointOfContactApi"; +export * from "./fileApi"; +export * from "./authApi"; +export * from "./base"; diff --git a/frontend/lib/src/api/pointOfContactApi.ts b/frontend/lib/src/api/pointOfContactApi.ts new file mode 100644 index 000000000..4ce7630ca --- /dev/null +++ b/frontend/lib/src/api/pointOfContactApi.ts @@ -0,0 +1,39 @@ +import { z } from "zod"; + +import { PointOfContact, pointOfContactSchema } from "../types/pointOfContact"; +import { PaginationQueryParams } from "../types/root"; +import { baseApi, handleQueryParams } from "./base"; + +const POC_API_BASE_URL = "/pocs"; + +export const pointOfContactApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + pointOfContacts: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${POC_API_BASE_URL}/`, queryParams), + method: "GET", + }), + providesTags: (result) => + result + ? result.map(({ id }) => ({ + type: "PointOfContact", + id, + })) + : ["PointOfContact"], + transformResponse: (response) => { + return z.array(pointOfContactSchema).parse(response); + }, + }), + pointOfContact: builder.query({ + query: (id) => ({ + url: `${POC_API_BASE_URL}/${id}`, + method: "GET", + }), + providesTags: (result, _, id) => + result ? [{ type: "PointOfContact", id }] : [], + transformResponse: (response) => { + return pointOfContactSchema.parse(response); + }, + }), + }), +}); diff --git a/frontend/lib/src/api/tagApi.ts b/frontend/lib/src/api/tagApi.ts new file mode 100644 index 000000000..aed91c8c7 --- /dev/null +++ b/frontend/lib/src/api/tagApi.ts @@ -0,0 +1,71 @@ +import { z } from "zod"; + +import { PaginationQueryParams } from "../types/root"; +import { + CreateTagRequestBody, + Tag, + UpdateTagRequestBody, + tagSchema, +} from "../types/tag"; +import { baseApi, handleQueryParams } from "./base"; + +const TAG_API_BASE_URL = "/tags"; + +export const tagApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + tags: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${TAG_API_BASE_URL}/`, queryParams), + method: "GET", + }), + providesTags: (result) => + result ? result.map(({ id }) => ({ type: "Tag", id })) : ["Tag"], + transformResponse: (response) => { + return z.array(tagSchema).parse(response); + }, + }), + tag: builder.query({ + query: (id) => ({ + url: `${TAG_API_BASE_URL}/${id}/`, + method: "GET", + }), + providesTags: (result, _, id) => (result ? [{ type: "Tag", id }] : []), + transformResponse: (response) => { + return tagSchema.parse(response); + }, + }), + createTag: builder.mutation({ + query: (body) => ({ + url: `${TAG_API_BASE_URL}/`, + method: "POST", + body, + }), + invalidatesTags: ["Tag"], + transformResponse: (response) => { + return tagSchema.parse(response); + }, + }), + updateTag: builder.mutation< + Tag, + { id: string; body: UpdateTagRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${TAG_API_BASE_URL}/${id}/`, + method: "PATCH", + body, + }), + invalidatesTags: (result, _, { id }) => + result ? [{ type: "Tag", id }] : [], + transformResponse: (response) => { + return tagSchema.parse(response); + }, + }), + deleteTag: builder.mutation({ + query: (id) => ({ + url: `${TAG_API_BASE_URL}/${id}/`, + method: "DELETE", + }), + invalidatesTags: (_result, _, id) => [{ type: "Tag", id }], + }), + }), +}); diff --git a/frontend/lib/src/api/userApi.ts b/frontend/lib/src/api/userApi.ts new file mode 100644 index 000000000..76ff03c62 --- /dev/null +++ b/frontend/lib/src/api/userApi.ts @@ -0,0 +1,174 @@ +import { z } from "zod"; + +import { UpdatePasswordRequestBody } from "../types/auth"; +import { Club, clubSchema } from "../types/club"; +import { PaginationQueryParams } from "../types/root"; +import { Tag, tagSchema } from "../types/tag"; +import { + CreateUserRequestBody, + CreateUserTagsRequestBody, + UpdateUserRequestBody, + User, + userSchema, +} from "../types/user"; +import { baseApi, handleQueryParams } from "./base"; + +const USER_API_BASE_URL = "/users"; + +export const userApi = baseApi.injectEndpoints({ + endpoints: (builder) => ({ + users: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${USER_API_BASE_URL}/`, queryParams), + method: "GET", + }), + providesTags: (result) => + result ? result.map(({ id }) => ({ type: "User", id })) : ["User"], + transformResponse: (response) => { + return z.array(userSchema).parse(response); + }, + }), + user: builder.query({ + query: (id) => ({ + url: `${USER_API_BASE_URL}/${id}/`, + method: "GET", + }), + providesTags: (result, _, id) => (result ? [{ type: "User", id }] : []), + transformResponse: (response) => { + return userSchema.parse(response); + }, + }), + currentUser: builder.query({ + query: () => ({ + url: `${USER_API_BASE_URL}/me`, + method: "GET", + }), + providesTags: (result) => + result ? [{ type: "User", id: result.id }] : [], + transformResponse: (response) => { + return userSchema.parse(response); + }, + }), + createUser: builder.mutation({ + query: (body) => ({ + url: `${USER_API_BASE_URL}/`, + method: "POST", + body, + }), + invalidatesTags: ["User"], + transformResponse: (response) => { + return userSchema.parse(response); + }, + }), + updateUser: builder.mutation< + User, + { id: string; body: UpdateUserRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${USER_API_BASE_URL}/${id}/`, + method: "PATCH", + body, + }), + invalidatesTags: (result, _, { id }) => + result ? [{ type: "User", id }] : [], + transformResponse: (response) => { + return userSchema.parse(response); + }, + }), + deleteUser: builder.mutation({ + query: (id) => ({ + url: `${USER_API_BASE_URL}/${id}/`, + method: "DELETE", + }), + invalidatesTags: (_result, _, id) => [{ type: "User", id }], + }), + updatePassword: builder.mutation< + void, + { id: string; body: UpdatePasswordRequestBody } + >({ + query: ({ id, body }) => ({ + url: `${USER_API_BASE_URL}/${id}/password`, + method: "PATCH", + body, + }), + }), + userFollowing: builder.query({ + query: (id) => ({ + url: `${USER_API_BASE_URL}/${id}/follower/`, + method: "GET", + }), + providesTags: (result, _, id) => + result + ? [{ type: "Follower", id }, "Club"] + : [{ type: "Follower", id }], + transformResponse: (response) => { + return z.array(clubSchema).parse(response); + }, + }), + createUserFollowing: builder.mutation< + void, + { userID: string; clubID: string } + >({ + query: ({ userID, clubID }) => ({ + url: `${USER_API_BASE_URL}/${userID}/follower/${clubID}`, + method: "POST", + }), + invalidatesTags: (_result, _, { userID }) => [ + { type: "Follower", id: userID }, + ], + }), + deleteUserFollowing: builder.mutation< + void, + { userID: string; clubID: string } + >({ + query: ({ userID, clubID }) => ({ + url: `${USER_API_BASE_URL}/${userID}/follower/${clubID}`, + method: "DELETE", + }), + invalidatesTags: (_result, _, { userID }) => [ + { type: "Follower", id: userID }, + ], + }), + userMembership: builder.query({ + query: (id) => ({ + url: `${USER_API_BASE_URL}/${id}/member/`, + method: "GET", + }), + providesTags: (result, _, id) => + result ? [{ type: "Member", id }, "Club"] : [{ type: "Member", id }], + transformResponse: (response) => { + return z.array(clubSchema).parse(response); + }, + }), + userTags: builder.query({ + query: () => ({ + url: `${USER_API_BASE_URL}/tags/`, + method: "GET", + }), + providesTags: (result) => + result ? result.map((tag) => ({ type: "Tag", id: tag.id })) : ["Tag"], + transformResponse: (response) => { + return z.array(tagSchema).parse(response); + }, + }), + createUserTags: builder.mutation({ + query: (body) => ({ + url: `${USER_API_BASE_URL}/tags/`, + method: "POST", + body, + }), + invalidatesTags: (result, _, _arg) => + result ? result.map((tag) => ({ type: "Tag", id: tag.id })) : ["Tag"], + transformResponse: (response) => { + return z.array(tagSchema).parse(response); + }, + }), + deleteUserTag: builder.mutation({ + query: (id) => ({ + url: `${USER_API_BASE_URL}/tags/${id}/`, + method: "DELETE", + }), + invalidatesTags: (_result, _, id) => [{ type: "Tag", id }], + }), + }), +}); diff --git a/frontend/lib/src/index.ts b/frontend/lib/src/index.ts new file mode 100644 index 000000000..1d58e1a79 --- /dev/null +++ b/frontend/lib/src/index.ts @@ -0,0 +1,2 @@ +export * from "./api"; +export * from "./types"; diff --git a/frontend/lib/types/auth.ts b/frontend/lib/src/types/auth.ts similarity index 58% rename from frontend/lib/types/auth.ts rename to frontend/lib/src/types/auth.ts index f9191dc5a..e45d7af5f 100644 --- a/frontend/lib/types/auth.ts +++ b/frontend/lib/src/types/auth.ts @@ -1,31 +1,31 @@ -import { z } from 'zod'; +import { z } from "zod"; // Schemas: export const loginRequestBodySchema = z.object({ - email: z.string().email(), - password: z.string().min(8) + email: z.string().email(), + password: z.string().min(8), }); export const updatePasswordRequestBodySchema = z.object({ - old_password: z.string().min(8), - new_password: z.string().min(8) + old_password: z.string().min(8), + new_password: z.string().min(8), }); export const refreshTokenRequestBodySchema = z.object({ - refresh_token: z.string() + refresh_token: z.string(), }); export const tokensSchema = z.object({ - access_token: z.string(), - refresh_token: z.string() + access_token: z.string(), + refresh_token: z.string(), }); // Types: export type LoginRequestBody = z.infer; export type UpdatePasswordRequestBody = z.infer< - typeof updatePasswordRequestBodySchema + typeof updatePasswordRequestBodySchema >; export type RefreshTokenRequestBody = z.infer< - typeof refreshTokenRequestBodySchema + typeof refreshTokenRequestBodySchema >; export type Tokens = z.infer; diff --git a/frontend/lib/types/category.ts b/frontend/lib/src/types/category.ts similarity index 59% rename from frontend/lib/types/category.ts rename to frontend/lib/src/types/category.ts index f400b4d70..6577d5693 100644 --- a/frontend/lib/types/category.ts +++ b/frontend/lib/src/types/category.ts @@ -1,22 +1,22 @@ -import { z } from 'zod'; +import { z } from "zod"; -import { rootModelSchema } from './root'; -import { tagSchema } from './tag'; +import { rootModelSchema } from "./root"; +import { tagSchema } from "./tag"; // Schemas: export const createCategoryRequestBodySchema = z.object({ - name: z.string().min(1) + name: z.string().min(1), }); export const categorySchemaIntermediate = z.object({ - name: z.string(), - tags: z.array(tagSchema) + name: z.string(), + tags: z.array(tagSchema), }); export const categorySchema = categorySchemaIntermediate.merge(rootModelSchema); // Types: export type CreateCategoryRequestBody = z.infer< - typeof createCategoryRequestBodySchema + typeof createCategoryRequestBodySchema >; export type Category = z.infer; diff --git a/frontend/lib/src/types/club.ts b/frontend/lib/src/types/club.ts new file mode 100644 index 000000000..1f1705ca5 --- /dev/null +++ b/frontend/lib/src/types/club.ts @@ -0,0 +1,65 @@ +import { z } from "zod"; + +import { rootModelSchema } from "./root"; + +// Enums: +const recruitmentCycleEnum = z.enum(["fall", "spring", "fallSpring", "always"]); +const recruitmentTypeEnum = z.enum(["unrestricted", "tryout", "application"]); + +// Schemas: +export const createClubRequestBodySchema = z.object({ + user_id: z.string().uuid(), + name: z.string(), + preview: z.string(), + description: z.string(), + is_recruiting: z.boolean(), + recruitment_cycle: recruitmentCycleEnum, + recruitment_type: recruitmentTypeEnum, + application_link: z.string(), + logo: z.string().optional(), + weekly_time_committment: z.number().optional(), + one_word_to_describe_us: z.string().max(20).optional(), +}); + +export const updateClubRequestBodySchema = z.object({ + name: z.string().optional(), + preview: z.string().optional(), + description: z.string().optional(), + is_recruiting: z.boolean().optional(), + recruitment_cycle: recruitmentCycleEnum.optional(), + recruitment_type: recruitmentTypeEnum.optional(), + application_link: z.string().optional(), + logo: z.string().optional(), + weekly_time_committment: z.number().optional(), + one_word_to_describe_us: z.string().max(20).optional(), +}); + +export const createClubTagsRequestBodySchema = z.object({ + tags: z.array(z.string().uuid()), +}); + +const clubSchemaIntermediate = z.object({ + name: z.string().max(255), + preview: z.string().max(255), + description: z.string().max(255), + num_members: z.number(), + is_recruiting: z.boolean(), + recruitment_cycle: recruitmentCycleEnum, + recruitment_type: recruitmentTypeEnum, + application_link: z.string().max(255), + logo: z.string().max(255).optional(), + weekly_time_committment: z.number().optional(), + one_word_to_describe_us: z.string().max(20).optional(), +}); + +export const clubSchema = clubSchemaIntermediate.merge(rootModelSchema); + +// Types: +export type RecruitmentCycle = z.infer; +export type RecruitmentType = z.infer; +export type CreateClubRequestBody = z.infer; +export type UpdateClubRequestBody = z.infer; +export type CreateClubTagsRequestBody = z.infer< + typeof createClubTagsRequestBodySchema +>; +export type Club = z.infer; diff --git a/frontend/lib/src/types/contact.ts b/frontend/lib/src/types/contact.ts new file mode 100644 index 000000000..7ec56c109 --- /dev/null +++ b/frontend/lib/src/types/contact.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; + +import { rootModelSchema } from "./root"; + +// Enums: +const contactTypeEnum = z.enum([ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite", +]); + +// Schemas: +export const createContactRequestBodySchema = z.object({ + type: contactTypeEnum, + content: z.string().max(255), +}); + +export const contactSchema = + createContactRequestBodySchema.merge(rootModelSchema); + +// Types: +export type ContactType = z.infer; +export type CreateContactRequestBody = z.infer< + typeof createContactRequestBodySchema +>; +export type Contact = z.infer; diff --git a/frontend/lib/types/error.ts b/frontend/lib/src/types/error.ts similarity index 63% rename from frontend/lib/types/error.ts rename to frontend/lib/src/types/error.ts index aa50e46ac..6bfb33c7d 100644 --- a/frontend/lib/types/error.ts +++ b/frontend/lib/src/types/error.ts @@ -1,3 +1,3 @@ export type ErrorResponse = { - error: string; + error: string; }; diff --git a/frontend/lib/src/types/event.ts b/frontend/lib/src/types/event.ts new file mode 100644 index 000000000..594a01c5d --- /dev/null +++ b/frontend/lib/src/types/event.ts @@ -0,0 +1,57 @@ +import { z } from "zod"; + +import { rootModelSchema } from "./root"; + +/** + * TODO: Re-Write After BE Fixes + */ + +// Enums: +const eventTypeEnum = z.enum(["open", "membersOnly"]); + +// Schemas: +const createEventRequestBodySchema = z.object({ + name: z.string(), + preview: z.string(), + content: z.string(), + start_time: z.date(), + end_time: z.date(), + location: z.string(), + event_type: eventTypeEnum, + is_recurring: z.boolean(), +}); + +const updateEventRequestBodySchema = z.object({ + name: z.string().optional(), + preview: z.string().optional(), + content: z.string().optional(), + start_time: z.date().optional(), + end_time: z.date().optional(), + location: z.string().optional(), + event_type: eventTypeEnum.optional(), + host: z.string().uuid().optional(), +}); + +const eventSchemaIntermediate = z.object({ + name: z.string().max(255), + preview: z.string().max(255), + content: z.string().max(255), + start_time: z.date(), + end_time: z.date(), + location: z.string().max(255), + meeting_link: z.string().max(255).optional(), + event_type: eventTypeEnum, + is_recurring: z.boolean(), + host: z.string().uuid(), +}); + +export const eventSchema = eventSchemaIntermediate.merge(rootModelSchema); + +// Types: +export type CreateEventRequestBody = z.infer< + typeof createEventRequestBodySchema +>; +export type UpdateEventRequestBody = z.infer< + typeof updateEventRequestBodySchema +>; +export type Event = z.infer; diff --git a/frontend/lib/src/types/file.ts b/frontend/lib/src/types/file.ts new file mode 100644 index 000000000..87716e371 --- /dev/null +++ b/frontend/lib/src/types/file.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; + +import { rootModelSchema } from "./root"; + +// Schemas: +export const createFileRequestBodySchema = z.object({ + owner_id: z.string().uuid(), + owner_type: z.string().max(255), +}); + +const fileSchemaIntermediate = z.object({ + owner_id: z.string().uuid(), + owner_type: z.string().max(255), + file_name: z.string().max(255), + file_type: z.string().max(255), + file_size: z.number().min(1), + file_url: z.string().max(255), + object_key: z.string().max(255), +}); + +export const fileSchema = fileSchemaIntermediate.merge(rootModelSchema); + +// Types: +export type CreateFileRequestBody = z.infer; +export type File = z.infer; diff --git a/frontend/lib/src/types/index.ts b/frontend/lib/src/types/index.ts new file mode 100644 index 000000000..693dbacf2 --- /dev/null +++ b/frontend/lib/src/types/index.ts @@ -0,0 +1,12 @@ +export * from "./auth"; +export * from "./error"; +export * from "./root"; +export * from "./club"; +export * from "./contact"; +export * from "./user"; +export * from "./tag"; +export * from "./category"; +export * from "./event"; +export * from "./file"; +export * from "./pointOfContact"; +export * from "./verification"; diff --git a/frontend/lib/src/types/pointOfContact.ts b/frontend/lib/src/types/pointOfContact.ts new file mode 100644 index 000000000..b21072c3b --- /dev/null +++ b/frontend/lib/src/types/pointOfContact.ts @@ -0,0 +1,36 @@ +import { z } from "zod"; + +import { fileSchema } from "./file"; +import { rootModelSchema } from "./root"; + +// Schemas: +const createPointOfContactRequestBodySchema = z.object({ + name: z.string(), + email: z.string().email(), + position: z.string(), +}); + +const updatePointOfContactRequestBodySchema = z.object({ + name: z.string().optional(), + email: z.string().email().optional(), + position: z.string().optional(), +}); + +const pointOfContactSchemaIntermediate = z.object({ + name: z.string().max(255), + email: z.string().email(), + position: z.string().max(255), + photo_file: fileSchema, +}); + +export const pointOfContactSchema = + pointOfContactSchemaIntermediate.merge(rootModelSchema); + +// Types: +export type CreatePointOfContactRequestBody = z.infer< + typeof createPointOfContactRequestBodySchema +>; +export type UpdatePointOfContactRequestBody = z.infer< + typeof updatePointOfContactRequestBodySchema +>; +export type PointOfContact = z.infer; diff --git a/frontend/lib/src/types/root.ts b/frontend/lib/src/types/root.ts new file mode 100644 index 000000000..eba7ca968 --- /dev/null +++ b/frontend/lib/src/types/root.ts @@ -0,0 +1,18 @@ +import { z } from "zod"; + +export type uuid = string; + +export const rootModelSchema = z.object({ + id: z.string().uuid(), + created_at: z.date(), + updated_at: z.date(), +}); + +const paginationQueryParams = z + .object({ + page: z.number().int().positive().optional(), + limit: z.number().int().positive().optional(), + }) + .optional(); + +export type PaginationQueryParams = z.infer; diff --git a/frontend/lib/types/tag.ts b/frontend/lib/src/types/tag.ts similarity index 63% rename from frontend/lib/types/tag.ts rename to frontend/lib/src/types/tag.ts index 88a978719..4a350be13 100644 --- a/frontend/lib/types/tag.ts +++ b/frontend/lib/src/types/tag.ts @@ -1,21 +1,21 @@ -import { z } from 'zod'; +import { z } from "zod"; -import { rootModelSchema } from './root'; +import { rootModelSchema } from "./root"; // Schemas: export const createTagRequestBodySchema = z.object({ - name: z.string(), - categoryID: z.string().uuid() + name: z.string(), + categoryID: z.string().uuid(), }); export const updateTagRequestBodySchema = z.object({ - name: z.string().optional(), - categoryID: z.string().uuid().optional() + name: z.string().optional(), + categoryID: z.string().uuid().optional(), }); export const tagSchemaIntermediate = z.object({ - name: z.string().max(255), - category_id: z.string().uuid() + name: z.string().max(255), + category_id: z.string().uuid(), }); export const tagSchema = tagSchemaIntermediate.merge(rootModelSchema); diff --git a/frontend/lib/src/types/user.ts b/frontend/lib/src/types/user.ts new file mode 100644 index 000000000..b2e9b1572 --- /dev/null +++ b/frontend/lib/src/types/user.ts @@ -0,0 +1,184 @@ +import { z } from "zod"; + +import { rootModelSchema } from "./root"; + +// Enums: +export const userRoleEnum = z.enum(["super", "student"]); + +export const collegeEnum = z.enum([ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH", +]); + +export const majorEnum = z.enum([ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre", +]); + +export const graduationCycleEnum = z.enum(["december", "may"]); + +export const yearEnum = z.enum(["1", "2", "3", "4", "5"]); + +// Schemas: +export const createUserRequestBodySchema = z.object({ + first_name: z.string().min(1), + last_name: z.string().min(1), + email: z.string().email(), + password: z.string().min(8), + major0: majorEnum.optional(), + major1: majorEnum.optional(), + major2: majorEnum.optional(), + college: collegeEnum, + graduation_cycle: graduationCycleEnum.optional(), + graduation_year: z.number().optional(), +}); + +export const updateUserRequestBodySchema = z.object({ + first_name: z.string().min(1).optional(), + last_name: z.string().min(1).optional(), + major0: majorEnum.optional(), + major1: majorEnum.optional(), + major2: majorEnum.optional(), + college: collegeEnum.optional(), + graduation_cycle: graduationCycleEnum.optional(), + graduation_year: z.number().optional(), +}); + +export const createUserTagsRequestBodySchema = z.object({ + tags: z.array(z.string().uuid()), +}); + +const userSchemaIntermediate = z.object({ + role: userRoleEnum, + first_name: z.string().min(1), + last_name: z.string().min(1), + email: z.string().email(), + major0: majorEnum.optional(), + major1: majorEnum.optional(), + major2: majorEnum.optional(), + college: collegeEnum.optional(), + graduation_cycle: graduationCycleEnum.optional(), + graduation_year: z.number().optional(), + is_verified: z.boolean(), +}); + +export const userSchema = userSchemaIntermediate.merge(rootModelSchema); + +// Types: +export type UserRole = z.infer; +export type College = z.infer; +export type Major = z.infer; +export type GraduationCycle = z.infer; +export type Year = z.infer; + +export type CreateUserRequestBody = z.infer; +export type UpdateUserRequestBody = z.infer; +export type CreateUserTagsRequestBody = z.infer< + typeof createUserTagsRequestBodySchema +>; +export type User = z.infer; diff --git a/frontend/lib/types/verification.ts b/frontend/lib/src/types/verification.ts similarity index 52% rename from frontend/lib/types/verification.ts rename to frontend/lib/src/types/verification.ts index fc26ad025..8b4cd0880 100644 --- a/frontend/lib/types/verification.ts +++ b/frontend/lib/src/types/verification.ts @@ -1,38 +1,38 @@ -import { z } from 'zod'; +import { z } from "zod"; // Enums: -const verificationTypeEnum = z.enum(['email_verification', 'password_reset']); +const verificationTypeEnum = z.enum(["email_verification", "password_reset"]); // Schemas: const emailRequestBodySchema = z.object({ - email: z.string().email() + email: z.string().email(), }); const verifyEmailRequestBodySchema = z.object({ - email: z.string().email(), - token: z.string().length(6) + email: z.string().email(), + token: z.string().length(6), }); const verifyPasswordResetTokenRequestBodySchema = z.object({ - token: z.string(), - new_password: z.string().min(8), - verify_new_password: z.string().min(8) + token: z.string(), + new_password: z.string().min(8), + verify_new_password: z.string().min(8), }); const verificationSchema = z.object({ - user_id: z.string().uuid(), - token: z.string(), - expires_at: z.date(), - type: verificationTypeEnum + user_id: z.string().uuid(), + token: z.string(), + expires_at: z.date(), + type: verificationTypeEnum, }); // Types: export type VerificationType = z.infer; export type EmailRequestBody = z.infer; export type VerifyEmailRequestBody = z.infer< - typeof verifyEmailRequestBodySchema + typeof verifyEmailRequestBodySchema >; export type VerifyPasswordResetTokenRequestBody = z.infer< - typeof verifyPasswordResetTokenRequestBodySchema + typeof verifyPasswordResetTokenRequestBodySchema >; export type Verification = z.infer; diff --git a/frontend/lib/src/vite-env.d.ts b/frontend/lib/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/frontend/lib/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontend/lib/store.ts b/frontend/lib/store.ts deleted file mode 100644 index 03038174f..000000000 --- a/frontend/lib/store.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { configureStore } from '@reduxjs/toolkit'; -import { setupListeners } from '@reduxjs/toolkit/query'; - -import { categoriesApi } from './api/category'; -import { clubsApi } from './api/club'; -import { contactsApi } from './api/contact'; -import { eventsApi } from './api/event'; -import { tagsApi } from './api/tag'; -import { usersApi } from './api/user'; - -export const store = configureStore({ - reducer: { - [usersApi.reducerPath]: usersApi.reducer, - [clubsApi.reducerPath]: clubsApi.reducer, - [eventsApi.reducerPath]: eventsApi.reducer, - [categoriesApi.reducerPath]: categoriesApi.reducer, - [contactsApi.reducerPath]: contactsApi.reducer, - [tagsApi.reducerPath]: tagsApi.reducer - }, - - middleware: (getDefaultMiddleware) => - getDefaultMiddleware() - .concat(usersApi.middleware) - .concat(clubsApi.middleware) - .concat(eventsApi.middleware) - .concat(categoriesApi.middleware) - .concat(contactsApi.middleware) - .concat(tagsApi.middleware) -}); - -setupListeners(store.dispatch); - -export type RootState = ReturnType; -export type AppDispatch = typeof store.dispatch; diff --git a/frontend/lib/tsconfig.json b/frontend/lib/tsconfig.json index 4998af8a0..aa2736782 100644 --- a/frontend/lib/tsconfig.json +++ b/frontend/lib/tsconfig.json @@ -1,28 +1,26 @@ { - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "baseUrl": ".", - "paths": { - "@/*": ["./*"] - } - }, - "include": ["**/*.ts", "**/*.tsx", "types/index.ts"], - "exclude": ["node_modules"] + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["test", "src"], + "exclude": ["node_modules", "dist"], + "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/frontend/lib/tsconfig.node.json b/frontend/lib/tsconfig.node.json new file mode 100644 index 000000000..97ede7ee6 --- /dev/null +++ b/frontend/lib/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/lib/types/club.ts b/frontend/lib/types/club.ts deleted file mode 100644 index b43bc9c63..000000000 --- a/frontend/lib/types/club.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -// Enums: -const recruitmentCycleEnum = z.enum(['fall', 'spring', 'fallSpring', 'always']); -const recruitmentTypeEnum = z.enum(['unrestricted', 'tryout', 'application']); - -// Schemas: -export const createClubRequestBodySchema = z.object({ - user_id: z.string().uuid(), - name: z.string(), - preview: z.string(), - description: z.string(), - is_recruiting: z.boolean(), - recruitment_cycle: recruitmentCycleEnum, - recruitment_type: recruitmentTypeEnum, - application_link: z.string(), - logo: z.string().optional(), - weekly_time_committment: z.number().optional(), - one_word_to_describe_us: z.string().max(20).optional() -}); - -export const updateClubRequestBodySchema = z.object({ - name: z.string().optional(), - preview: z.string().optional(), - description: z.string().optional(), - is_recruiting: z.boolean().optional(), - recruitment_cycle: recruitmentCycleEnum.optional(), - recruitment_type: recruitmentTypeEnum.optional(), - application_link: z.string().optional(), - logo: z.string().optional(), - weekly_time_committment: z.number().optional(), - one_word_to_describe_us: z.string().max(20).optional() -}); - -export const createClubTagsRequestBodySchema = z.object({ - tags: z.array(z.string().uuid()) -}); - -const clubSchemaIntermediate = z.object({ - name: z.string().max(255), - preview: z.string().max(255), - description: z.string().max(255), - num_members: z.number(), - is_recruiting: z.boolean(), - recruitment_cycle: recruitmentCycleEnum, - recruitment_type: recruitmentTypeEnum, - application_link: z.string().max(255), - logo: z.string().max(255).optional(), - weekly_time_committment: z.number().optional(), - one_word_to_describe_us: z.string().max(20).optional() -}); - -export const clubSchema = clubSchemaIntermediate.merge(rootModelSchema); - -// Types: -export type RecruitmentCycle = z.infer; -export type RecruitmentType = z.infer; -export type CreateClubRequestBody = z.infer; -export type UpdateClubRequestBody = z.infer; -export type CreateClubTagsRequestBody = z.infer< - typeof createClubTagsRequestBodySchema ->; -export type Club = z.infer; diff --git a/frontend/lib/types/contact.ts b/frontend/lib/types/contact.ts deleted file mode 100644 index 664284e93..000000000 --- a/frontend/lib/types/contact.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -// Enums: -const contactTypeEnum = z.enum([ - 'facebook', - 'instagram', - 'x', - 'linkedin', - 'youtube', - 'github', - 'slack', - 'discord', - 'email', - 'customSite' -]); - -// Schemas: -export const createContactRequestBodySchema = z.object({ - type: contactTypeEnum, - content: z.string().max(255) -}); - -export const contactSchema = - createContactRequestBodySchema.merge(rootModelSchema); - -// Types: -export type ContactType = z.infer; -export type CreateContactRequestBody = z.infer< - typeof createContactRequestBodySchema ->; -export type Contact = z.infer; diff --git a/frontend/lib/types/event.ts b/frontend/lib/types/event.ts deleted file mode 100644 index 515066238..000000000 --- a/frontend/lib/types/event.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -/** - * TODO: Re-Write After BE Fixes - */ - -// Enums: -const eventTypeEnum = z.enum(['open', 'membersOnly']); - -// Schemas: -const createEventRequestBodySchema = z.object({ - name: z.string(), - preview: z.string(), - content: z.string(), - start_time: z.date(), - end_time: z.date(), - location: z.string(), - event_type: eventTypeEnum, - is_recurring: z.boolean() -}); - -const updateEventRequestBodySchema = z.object({ - name: z.string().optional(), - preview: z.string().optional(), - content: z.string().optional(), - start_time: z.date().optional(), - end_time: z.date().optional(), - location: z.string().optional(), - event_type: eventTypeEnum.optional(), - host: z.string().uuid().optional() -}); - -const eventSchemaIntermediate = z.object({ - name: z.string().max(255), - preview: z.string().max(255), - content: z.string().max(255), - start_time: z.date(), - end_time: z.date(), - location: z.string().max(255), - meeting_link: z.string().max(255).optional(), - event_type: eventTypeEnum, - is_recurring: z.boolean(), - host: z.string().uuid() -}); - -export const eventSchema = eventSchemaIntermediate.merge(rootModelSchema); - -// Types: -export type CreateEventRequestBody = z.infer< - typeof createEventRequestBodySchema ->; -export type UpdateEventRequestBody = z.infer< - typeof updateEventRequestBodySchema ->; -export type Event = z.infer; diff --git a/frontend/lib/types/file.ts b/frontend/lib/types/file.ts deleted file mode 100644 index b7b3101d8..000000000 --- a/frontend/lib/types/file.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -// Schemas: -export const createFileRequestBodySchema = z.object({ - owner_id: z.string().uuid(), - owner_type: z.string().max(255) -}); - -const fileSchemaIntermediate = z.object({ - owner_id: z.string().uuid(), - owner_type: z.string().max(255), - file_name: z.string().max(255), - file_type: z.string().max(255), - file_size: z.number().min(1), - file_url: z.string().max(255), - object_key: z.string().max(255) -}); - -export const fileSchema = fileSchemaIntermediate.merge(rootModelSchema); - -// Types: -export type CreateFileRequestBody = z.infer; -export type File = z.infer; diff --git a/frontend/lib/types/index.ts b/frontend/lib/types/index.ts deleted file mode 100644 index a247cd707..000000000 --- a/frontend/lib/types/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * from './auth'; -export * from './error'; - -export * from './root'; -export * from './club'; -export * from './contact'; -export * from './user'; -export * from './tag'; -export * from './category'; -export * from './event'; -export * from './file'; -export * from './pointOfContact'; -export * from './verification'; diff --git a/frontend/lib/types/item.ts b/frontend/lib/types/item.ts deleted file mode 100644 index 763910602..000000000 --- a/frontend/lib/types/item.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type Item = { - label: string; - value: string; -}; diff --git a/frontend/lib/types/pointOfContact.ts b/frontend/lib/types/pointOfContact.ts deleted file mode 100644 index 1bc6008ce..000000000 --- a/frontend/lib/types/pointOfContact.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { z } from 'zod'; - -import { fileSchema } from './file'; -import { rootModelSchema } from './root'; - -// Schemas: -const createPointOfContactRequestBodySchema = z.object({ - name: z.string(), - email: z.string().email(), - position: z.string() -}); - -const updatePointOfContactRequestBodySchema = z.object({ - name: z.string().optional(), - email: z.string().email().optional(), - position: z.string().optional() -}); - -const pointOfContactSchemaIntermediate = z.object({ - name: z.string().max(255), - email: z.string().email(), - position: z.string().max(255), - photo_file: fileSchema -}); - -export const pointOfContactSchema = - pointOfContactSchemaIntermediate.merge(rootModelSchema); - -// Types: -export type CreatePointOfContactRequestBody = z.infer< - typeof createPointOfContactRequestBodySchema ->; -export type UpdatePointOfContactRequestBody = z.infer< - typeof updatePointOfContactRequestBodySchema ->; -export type PointOfContact = z.infer; diff --git a/frontend/lib/types/root.ts b/frontend/lib/types/root.ts deleted file mode 100644 index 27c0ee4c0..000000000 --- a/frontend/lib/types/root.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from 'zod'; - -export type uuid = string; - -export const rootModelSchema = z.object({ - id: z.string().uuid(), - created_at: z.date(), - updated_at: z.date() -}); - -const paginationQueryParams = z - .object({ - page: z.number().int().positive().optional(), - limit: z.number().int().positive().optional() - }) - .optional(); - -export type PaginationQueryParams = z.infer; diff --git a/frontend/lib/types/user.ts b/frontend/lib/types/user.ts deleted file mode 100644 index 6093fbac4..000000000 --- a/frontend/lib/types/user.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -// Enums: -export const userRoleEnum = z.enum(['super', 'student']); - -export const collegeEnum = z.enum([ - 'CAMD', - 'DMSB', - 'KCCS', - 'CE', - 'BCHS', - 'SL', - 'CPS', - 'CS', - 'CSSH' -]); - -export const majorEnum = z.enum([ - 'africanaStudies', - 'americanSignLanguage', - 'americanSignLanguage-EnglishInterpreting', - 'appliedPhysics', - 'architecturalStudies', - 'architecture', - 'art:ArtVisualStudies', - 'behavioralNeuroscience', - 'biochemistry', - 'bioengineering', - 'biology', - 'biomedicalPhysics', - 'businessAdministration', - 'businessAdministration:Accounting', - 'businessAdministration:AccountingAndAdvisoryServices', - 'businessAdministration:BrandManagement', - 'businessAdministration:BusinessAnalytics', - 'businessAdministration:CorporateInnovation', - 'businessAdministration:EntrepreneurialStartups', - 'businessAdministration:FamilyBusiness', - 'businessAdministration:Finance', - 'businessAdministration:Fintech', - 'businessAdministration:HealthcareManagementAndConsulting', - 'businessAdministration:Management', - 'businessAdministration:ManagementInformationSystems', - 'businessAdministration:Marketing', - 'businessAdministration:MarketingAnalytics', - 'businessAdministration:SocialInnovationAndEntrepreneurship', - 'businessAdministration:SupplyChainManagement', - 'cellAndMolecularBiology', - 'chemicalEngineering', - 'chemistry', - 'civilEngineering', - 'communicationStudies', - 'computerEngineering', - 'computerScience', - 'computingAndLaw', - 'criminologyAndCriminalJustice', - 'culturalAnthropology', - 'cybersecurity', - 'dataScience', - 'design', - 'economics', - 'electricalEngineering', - 'english', - 'environmentalAndSustainabilityStudies', - 'environmentalEngineering', - 'environmentalScience', - 'environmentalStudies', - 'gameArtAndAnimation', - 'gameDesign', - 'globalAsianStudies', - 'healthScience', - 'history', - 'historyCultureAndLaw', - 'humanServices', - 'industrialEngineering', - 'internationalAffairs', - 'internationalBusiness', - 'internationalBusiness:Accounting', - 'internationalBusiness:AccountingAndAdvisoryServices', - 'internationalBusiness:BrandManagement', - 'internationalBusiness:BusinessAnalytics', - 'internationalBusiness:CorporateInnovation', - 'internationalBusiness:EntrepreneurialStartups', - 'internationalBusiness:FamilyBusiness', - 'internationalBusiness:Finance', - 'internationalBusiness:Fintech', - 'internationalBusiness:HealthcareManagementAndConsulting', - 'internationalBusiness:Management', - 'internationalBusiness:ManagementInformationSystems', - 'internationalBusiness:Marketing', - 'internationalBusiness:MarketingAnalytics', - 'internationalBusiness:SocialInnovationAndEntrepreneurship', - 'internationalBusiness:SupplyChainManagement', - 'journalism', - 'landscapeArchitecture', - 'linguistics', - 'marineBiology', - 'mathematics', - 'mechanicalEngineering', - 'mediaAndScreenStudies', - 'mediaArts', - 'music', - 'musicTechnology', - 'nursing', - 'pharmaceuticalSciences', - 'pharmacy(PharmD)', - 'philosophy', - 'physics', - 'politicalScience', - 'politicsPhilosophyEconomics', - 'psychology', - 'publicHealth', - 'publicRelations', - 'religiousStudies', - 'sociology', - 'spanish', - 'speechLanguagePathologyAndAudiology', - 'theatre' -]); - -export const graduationCycleEnum = z.enum(['december', 'may']); - -export const yearEnum = z.enum(['1', '2', '3', '4', '5']); - -// Schemas: -export const createUserRequestBodySchema = z.object({ - first_name: z.string().min(1), - last_name: z.string().min(1), - email: z.string().email(), - password: z.string().min(8), - major0: majorEnum.optional(), - major1: majorEnum.optional(), - major2: majorEnum.optional(), - college: collegeEnum, - graduation_cycle: graduationCycleEnum.optional(), - graduation_year: z.number().optional() -}); - -export const updateUserRequestBodySchema = z.object({ - first_name: z.string().min(1).optional(), - last_name: z.string().min(1).optional(), - major0: majorEnum.optional(), - major1: majorEnum.optional(), - major2: majorEnum.optional(), - college: collegeEnum.optional(), - graduation_cycle: graduationCycleEnum.optional(), - graduation_year: z.number().optional() -}); - -export const createUserTagsRequestBodySchema = z.object({ - tags: z.array(z.string().uuid()) -}); - -const userSchemaIntermediate = z.object({ - role: userRoleEnum, - first_name: z.string().min(1), - last_name: z.string().min(1), - email: z.string().email(), - major0: majorEnum.optional(), - major1: majorEnum.optional(), - major2: majorEnum.optional(), - college: collegeEnum.optional(), - graduation_cycle: graduationCycleEnum.optional(), - graduation_year: z.number().optional(), - is_verified: z.boolean() -}); - -export const userSchema = userSchemaIntermediate.merge(rootModelSchema); - -// Types: -export type UserRole = z.infer; -export type College = z.infer; -export type Major = z.infer; -export type GraduationCycle = z.infer; -export type Year = z.infer; - -export type CreateUserRequestBody = z.infer; -export type UpdateUserRequestBody = z.infer; -export type CreateUserTagsRequestBody = z.infer< - typeof createUserTagsRequestBodySchema ->; -export type User = z.infer; diff --git a/frontend/lib/types/uuid.ts b/frontend/lib/types/uuid.ts deleted file mode 100644 index d0ea1399d..000000000 --- a/frontend/lib/types/uuid.ts +++ /dev/null @@ -1 +0,0 @@ -export type uuid = string; diff --git a/frontend/lib/vite.config.ts b/frontend/lib/vite.config.ts new file mode 100644 index 000000000..22d2a58d6 --- /dev/null +++ b/frontend/lib/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vite"; +import { resolve } from "path"; +import dts from "vite-plugin-dts"; +import { libInjectCss } from "vite-plugin-lib-inject-css"; +import react from "@vitejs/plugin-react-swc"; + +export default defineConfig({ + plugins: [react(), libInjectCss(), dts({ include: ["src"] })], + build: { + lib: { + entry: resolve(__dirname, "src/index.ts"), + formats: ["es"], + }, + rollupOptions: { + external: ["react", "react/jsx-runtime"], + output: { + assetFileNames: "assets/[name][extname]", + entryFileNames: "[name].js", + }, + }, + }, +}); diff --git a/frontend/lib/yarn.lock b/frontend/lib/yarn.lock index 5ff57ae27..63d5c4405 100644 --- a/frontend/lib/yarn.lock +++ b/frontend/lib/yarn.lock @@ -2,6 +2,406 @@ # yarn lockfile v1 +"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/generator@7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.23.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.24.0", "@babel/parser@^7.24.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + +"@babel/template@^7.22.15": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.17.0", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@microsoft/api-extractor-model@7.28.13": + version "7.28.13" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.28.13.tgz#96fbc52155e0d07e0eabbd9699065b77702fe33a" + integrity sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw== + dependencies: + "@microsoft/tsdoc" "0.14.2" + "@microsoft/tsdoc-config" "~0.16.1" + "@rushstack/node-core-library" "4.0.2" + +"@microsoft/api-extractor@7.43.0": + version "7.43.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.43.0.tgz#41c42677bc71cd8e0f23c63c56802d85044e65cd" + integrity sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w== + dependencies: + "@microsoft/api-extractor-model" "7.28.13" + "@microsoft/tsdoc" "0.14.2" + "@microsoft/tsdoc-config" "~0.16.1" + "@rushstack/node-core-library" "4.0.2" + "@rushstack/rig-package" "0.5.2" + "@rushstack/terminal" "0.10.0" + "@rushstack/ts-command-line" "4.19.1" + lodash "~4.17.15" + minimatch "~3.0.3" + resolve "~1.22.1" + semver "~7.5.4" + source-map "~0.6.1" + typescript "5.4.2" + +"@microsoft/tsdoc-config@~0.16.1": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz#b786bb4ead00d54f53839a458ce626c8548d3adf" + integrity sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw== + dependencies: + "@microsoft/tsdoc" "0.14.2" + ajv "~6.12.6" + jju "~1.4.0" + resolve "~1.19.0" + +"@microsoft/tsdoc@0.14.2": + version "0.14.2" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" + integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@reduxjs/toolkit@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.3.tgz#5ce71cbf162f98c5dafb49bd3f1e11c5486ab9c4" @@ -12,10 +412,1408 @@ redux-thunk "^3.1.0" reselect "^5.0.1" +"@rollup/pluginutils@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/rollup-android-arm-eabi@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d" + integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ== + +"@rollup/rollup-android-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b" + integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw== + +"@rollup/rollup-darwin-arm64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a" + integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw== + +"@rollup/rollup-darwin-x64@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b" + integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14" + integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A== + +"@rollup/rollup-linux-arm-musleabihf@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb" + integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg== + +"@rollup/rollup-linux-arm64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a" + integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A== + +"@rollup/rollup-linux-arm64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af" + integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571" + integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ== + +"@rollup/rollup-linux-riscv64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f" + integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg== + +"@rollup/rollup-linux-s390x-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354" + integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g== + +"@rollup/rollup-linux-x64-gnu@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811" + integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ== + +"@rollup/rollup-linux-x64-musl@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385" + integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q== + +"@rollup/rollup-win32-arm64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f" + integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA== + +"@rollup/rollup-win32-ia32-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411" + integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ== + +"@rollup/rollup-win32-x64-msvc@4.17.2": + version "4.17.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503" + integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w== + +"@rushstack/node-core-library@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-4.0.2.tgz#e26854a3314b279d57e8abdb4acce7797d02f554" + integrity sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg== + dependencies: + fs-extra "~7.0.1" + import-lazy "~4.0.0" + jju "~1.4.0" + resolve "~1.22.1" + semver "~7.5.4" + z-schema "~5.0.2" + +"@rushstack/rig-package@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.2.tgz#0e23a115904678717a74049661931c0b37dd5495" + integrity sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA== + dependencies: + resolve "~1.22.1" + strip-json-comments "~3.1.1" + +"@rushstack/terminal@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.10.0.tgz#e81909fa0e5c8016b6df4739f0f381f44358269f" + integrity sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw== + dependencies: + "@rushstack/node-core-library" "4.0.2" + supports-color "~8.1.1" + +"@rushstack/ts-command-line@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.19.1.tgz#288ee54dd607e558a8be07705869c16c31b5c3ef" + integrity sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg== + dependencies: + "@rushstack/terminal" "0.10.0" + "@types/argparse" "1.0.38" + argparse "~1.0.9" + string-argv "~0.3.1" + +"@swc/core-darwin-arm64@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.3.tgz#37267be4dc76426073f66ca0177a10c9b1237326" + integrity sha512-kRmmV2XqWegzGXvJfVVOj10OXhLgaVOOBjaX3p3Aqg7Do5ksg+bY5wi1gAN/Eul7B08Oqf7GG7WJevjDQGWPOg== + +"@swc/core-darwin-x64@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.3.tgz#d914ad5c28022913550ef75efc78b9220a03fa1e" + integrity sha512-EYs0+ovaRw6ZN9GBr2nIeC7gUXWA0q4RYR+Og3Vo0Qgv2Mt/XudF44A2lPK9X7M3JIfu6JjnxnTuvsK1Lqojfw== + +"@swc/core-linux-arm-gnueabihf@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.3.tgz#b03d82237bb6cfbcb62815ab65e371fe0f7db622" + integrity sha512-RBVUTidSf4wgPdv98VrgJ4rMzMDN/3LBWdT7l+R7mNFH+mtID7ZAhTON0o/m1HkECgAgi1xcbTOVAw1xgd5KLA== + +"@swc/core-linux-arm64-gnu@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.3.tgz#6fb6a91a400825b3ecf27083e6c670a677c40356" + integrity sha512-DCC6El3MiTYfv98CShxz/g2s4Pxn6tV0mldCQ0UdRqaN2ApUn7E+zTrqaj5bk7yII3A43WhE9Mr6wNPbXUeVyg== + +"@swc/core-linux-arm64-musl@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.3.tgz#5f32b7535420973ee55d8e5abf0682bba390df60" + integrity sha512-p04ysjYXEyaCGpJvwHm0T0nkPawXtdKBTThWnlh8M5jYULVNVA1YmC9azG2Avs1GDaLgBPVUgodmFYpdSupOYA== + +"@swc/core-linux-x64-gnu@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.3.tgz#50510af9f466890a61d6ec9821c52e83b8be8633" + integrity sha512-/l4KJu0xwYm6tcVSOvF8RbXrIeIHJAhWnKvuX4ZnYKFkON968kB8Ghx+1yqBQcZf36tMzSuZUC5xBUA9u66lGA== + +"@swc/core-linux-x64-musl@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.3.tgz#da2a0cf23e67991c77b1d05328f5afb3408dad07" + integrity sha512-54DmSnrTXq4fYEKNR0nFAImG3+FxsHlQ6Tol/v3l+rxmg2K0FeeDOpH7wTXeWhMGhFlGrLIyLSnA+SzabfoDIA== + +"@swc/core-win32-arm64-msvc@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.3.tgz#d4314763ff14814eb59d967921bfc30307f6afd4" + integrity sha512-piUMqoHNwDXChBfaaFIMzYgoxepfd8Ci1uXXNVEnuiRKz3FiIcNLmvXaBD7lKUwKcnGgVziH/CrndX6SldKQNQ== + +"@swc/core-win32-ia32-msvc@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.3.tgz#7c2bda8aee04a162a5bfcad19de9ebaed9f9037d" + integrity sha512-zV5utPYBUzYhBOomCByAjKAvfVBcOCJtnszx7Zlfz7SAv/cGm8D1QzPDCvv6jDhIlUtLj6KyL8JXeFr+f95Fjw== + +"@swc/core-win32-x64-msvc@1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.3.tgz#677da96e52b9d5f4c374a03033970fe67b7c0594" + integrity sha512-QmUiXiPIV5gBADfDh8e2jKynEhyRC+dcKP/zF9y5KqDUErYzlhocLd68uYS4uIegP6AylYlmigHgcaktGEE9VQ== + +"@swc/core@^1.3.107": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.5.3.tgz#57add517711dbc7373cd438da1ddcaa4b2ae540d" + integrity sha512-pSEglypnBGLHBoBcv3aYS7IM2t2LRinubYMyP88UoFIcD2pear2CeB15CbjJ2IzuvERD0ZL/bthM7cDSR9g+aQ== + dependencies: + "@swc/counter" "^0.1.2" + "@swc/types" "^0.1.5" + optionalDependencies: + "@swc/core-darwin-arm64" "1.5.3" + "@swc/core-darwin-x64" "1.5.3" + "@swc/core-linux-arm-gnueabihf" "1.5.3" + "@swc/core-linux-arm64-gnu" "1.5.3" + "@swc/core-linux-arm64-musl" "1.5.3" + "@swc/core-linux-x64-gnu" "1.5.3" + "@swc/core-linux-x64-musl" "1.5.3" + "@swc/core-win32-arm64-msvc" "1.5.3" + "@swc/core-win32-ia32-msvc" "1.5.3" + "@swc/core-win32-x64-msvc" "1.5.3" + +"@swc/counter@^0.1.2", "@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.5": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.6.tgz#2f13f748995b247d146de2784d3eb7195410faba" + integrity sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg== + dependencies: + "@swc/counter" "^0.1.3" + +"@trivago/prettier-plugin-sort-imports@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== + dependencies: + "@babel/generator" "7.17.7" + "@babel/parser" "^7.20.5" + "@babel/traverse" "7.23.2" + "@babel/types" "7.17.0" + javascript-natural-sort "0.7.1" + lodash "^4.17.21" + +"@types/argparse@1.0.38": + version "1.0.38" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== + +"@types/estree@1.0.5", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@^20.12.10": + version "20.12.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.10.tgz#8f0c3f12b0f075eee1fe20c1afb417e9765bef76" + integrity sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw== + dependencies: + undici-types "~5.26.4" + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react-dom@^18.2.22": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.66": + version "18.3.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.1.tgz#fed43985caa834a2084d002e4771e15dfcbdbe8e" + integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + +"@typescript-eslint/eslint-plugin@^7.2.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f" + integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/type-utils" "7.8.0" + "@typescript-eslint/utils" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^7.2.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.8.0.tgz#1e1db30c8ab832caffee5f37e677dbcb9357ddc8" + integrity sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ== + dependencies: + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/typescript-estree" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047" + integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g== + dependencies: + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" + +"@typescript-eslint/type-utils@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz#9de166f182a6e4d1c5da76e94880e91831e3e26f" + integrity sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A== + dependencies: + "@typescript-eslint/typescript-estree" "7.8.0" + "@typescript-eslint/utils" "7.8.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d" + integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw== + +"@typescript-eslint/typescript-estree@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c" + integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg== + dependencies: + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd" + integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/typescript-estree" "7.8.0" + semver "^7.6.0" + +"@typescript-eslint/visitor-keys@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91" + integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA== + dependencies: + "@typescript-eslint/types" "7.8.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vitejs/plugin-react-swc@^3.5.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz#dc9cd1363baf3780f3ad3e0a12a46a3ffe0c7526" + integrity sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g== + dependencies: + "@swc/core" "^1.3.107" + +"@volar/language-core@1.11.1", "@volar/language-core@~1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.11.1.tgz#ecdf12ea8dc35fb8549e517991abcbf449a5ad4f" + integrity sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw== + dependencies: + "@volar/source-map" "1.11.1" + +"@volar/source-map@1.11.1", "@volar/source-map@~1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.11.1.tgz#535b0328d9e2b7a91dff846cab4058e191f4452f" + integrity sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg== + dependencies: + muggle-string "^0.3.1" + +"@volar/typescript@~1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.11.1.tgz#ba86c6f326d88e249c7f5cfe4b765be3946fd627" + integrity sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ== + dependencies: + "@volar/language-core" "1.11.1" + path-browserify "^1.0.1" + +"@vue/compiler-core@3.4.27": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.27.tgz#e69060f4b61429fe57976aa5872cfa21389e4d91" + integrity sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg== + dependencies: + "@babel/parser" "^7.24.4" + "@vue/shared" "3.4.27" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.0" + +"@vue/compiler-dom@^3.3.0": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz#d51d35f40d00ce235d7afc6ad8b09dfd92b1cc1c" + integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw== + dependencies: + "@vue/compiler-core" "3.4.27" + "@vue/shared" "3.4.27" + +"@vue/language-core@1.8.27", "@vue/language-core@^1.8.27": + version "1.8.27" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.27.tgz#2ca6892cb524e024a44e554e4c55d7a23e72263f" + integrity sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA== + dependencies: + "@volar/language-core" "~1.11.1" + "@volar/source-map" "~1.11.1" + "@vue/compiler-dom" "^3.3.0" + "@vue/shared" "^3.3.0" + computeds "^0.0.1" + minimatch "^9.0.3" + muggle-string "^0.3.1" + path-browserify "^1.0.1" + vue-template-compiler "^2.7.14" + +"@vue/shared@3.4.27", "@vue/shared@^3.3.0": + version "3.4.27" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.27.tgz#f05e3cd107d157354bb4ae7a7b5fc9cf73c63b50" + integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +ajv@^6.12.4, ajv@~6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +argparse@~1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +computeds@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e" + integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + +debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react-refresh@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz#e8e8accab681861baed00c5c12da70267db0936f" + integrity sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fs-extra@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.12: + version "10.3.12" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.10.2" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + immer@^10.0.3: - version "10.0.4" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.4.tgz#09af41477236b99449f9d705369a4daaf780362b" - integrity sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw== + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-core-module@^2.1.0, is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +javascript-natural-sort@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + +jju@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21, lodash@~4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.30.8: + version "0.30.10" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" + integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1, minimatch@^9.0.3, minimatch@^9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimatch@~3.0.3: + version "3.0.8" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" + integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== + dependencies: + brace-expansion "^1.1.7" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.1.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.0.tgz#b545f84af94e567386770159302ca113469c80b8" + integrity sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +muggle-string@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.3.1.tgz#e524312eb1728c63dd0b2ac49e3282e6ed85963a" + integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +postcss@^8.4.38: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-icons@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.2.1.tgz#28c2040917b2a2eda639b0f797bff1888e018e4a" + integrity sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw== + +react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== + dependencies: + "@types/use-sync-external-store" "^0.0.3" + use-sync-external-store "^1.0.0" + +react@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" redux-thunk@^3.1.0: version "3.1.0" @@ -32,7 +1830,378 @@ reselect@^5.0.1: resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== -zod@^3.22.4: - version "3.22.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" - integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@~1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +resolve@~1.22.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^4.13.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" + integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.17.2" + "@rollup/rollup-android-arm64" "4.17.2" + "@rollup/rollup-darwin-arm64" "4.17.2" + "@rollup/rollup-darwin-x64" "4.17.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.17.2" + "@rollup/rollup-linux-arm-musleabihf" "4.17.2" + "@rollup/rollup-linux-arm64-gnu" "4.17.2" + "@rollup/rollup-linux-arm64-musl" "4.17.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.17.2" + "@rollup/rollup-linux-riscv64-gnu" "4.17.2" + "@rollup/rollup-linux-s390x-gnu" "4.17.2" + "@rollup/rollup-linux-x64-gnu" "4.17.2" + "@rollup/rollup-linux-x64-musl" "4.17.2" + "@rollup/rollup-win32-arm64-msvc" "4.17.2" + "@rollup/rollup-win32-ia32-msvc" "4.17.2" + "@rollup/rollup-win32-x64-msvc" "4.17.2" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@^7.5.4, semver@^7.6.0: + version "7.6.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.1.tgz#60bfe090bf907a25aa8119a72b9f90ef7ca281b2" + integrity sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA== + +semver@~7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +string-argv@~0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@~8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" + integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== + +typescript@^5.2.2: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-sync-external-store@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + +validator@^13.7.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" + integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== + +vite-plugin-dts@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-3.9.1.tgz#625ad388ec3956708ccec7960550a7b0a8e8909e" + integrity sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg== + dependencies: + "@microsoft/api-extractor" "7.43.0" + "@rollup/pluginutils" "^5.1.0" + "@vue/language-core" "^1.8.27" + debug "^4.3.4" + kolorist "^1.8.0" + magic-string "^0.30.8" + vue-tsc "^1.8.27" + +vite-plugin-lib-inject-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/vite-plugin-lib-inject-css/-/vite-plugin-lib-inject-css-2.0.1.tgz#3243c1b87feb106f942a1bb205ca8cd8a424e72b" + integrity sha512-86VU8m4t3TNPk9xfdnNDqn1OHkgrPHpP7B5wkVys4tWSLwMMIucCgJdc5wenGntLNMWKChJV0Ut3qGH6iGojMg== + dependencies: + magic-string "^0.30.8" + picocolors "^1.0.0" + +vite@^5.2.0: + version "5.2.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd" + integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== + dependencies: + esbuild "^0.20.1" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vue-template-compiler@^2.7.14: + version "2.7.16" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz#c81b2d47753264c77ac03b9966a46637482bb03b" + integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + +vue-tsc@^1.8.27: + version "1.8.27" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.27.tgz#feb2bb1eef9be28017bb9e95e2bbd1ebdd48481c" + integrity sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg== + dependencies: + "@volar/typescript" "~1.11.1" + "@vue/language-core" "1.8.27" + semver "^7.5.4" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +z-schema@~5.0.2: + version "5.0.6" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.6.tgz#46d6a687b15e4a4369e18d6cb1c7b8618fc256c5" + integrity sha512-+XR1GhnWklYdfr8YaZv/iu+vY+ux7V5DS5zH1DQf6bO5ufrt/5cgNhVO5qyhsjFXvsqQb/f08DWE9b6uPscyAg== + dependencies: + lodash.get "^4.4.2" + lodash.isequal "^4.5.0" + validator "^13.7.0" + optionalDependencies: + commander "^10.0.0" + +zod@^3.23.6: + version "3.23.6" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.6.tgz#c08a977e2255dab1fdba933651584a05fcbf19e1" + integrity sha512-RTHJlZhsRbuA8Hmp/iNL7jnfc4nZishjsanDAfEY1QpDQZCahUp3xDzl+zfweE9BklxMUcgBgS1b7Lvie/ZVwA== diff --git a/frontend/mobile/.gitignore b/frontend/mobile/.gitignore index 4ed2821fa..0b37b6eb4 100644 --- a/frontend/mobile/.gitignore +++ b/frontend/mobile/.gitignore @@ -3,9 +3,6 @@ # dependencies node_modules/ -# testing -coverage/ - # Expo .expo/ dist/ diff --git a/frontend/mobile/app.d.ts b/frontend/mobile/app.d.ts deleted file mode 100644 index a13e3136b..000000000 --- a/frontend/mobile/app.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/frontend/mobile/app/(app)/(tabs)/_layout.tsx b/frontend/mobile/app/(app)/(tabs)/_layout.tsx index 8aa17c7b3..dff3314e5 100644 --- a/frontend/mobile/app/(app)/(tabs)/_layout.tsx +++ b/frontend/mobile/app/(app)/(tabs)/_layout.tsx @@ -1,94 +1,30 @@ -import React, { useEffect } from 'react'; -import { Text, View } from 'react-native'; +import React from 'react'; import { Tabs } from 'expo-router'; -import HomeSelectedIcon from '@/assets/images/svg/home-selected.svg'; -import HomeIcon from '@/assets/images/svg/home.svg'; -import NotificationIcon from '@/assets/images/svg/notification.svg'; -import ProfileSelectedIcon from '@/assets/images/svg/profile-selected.svg'; -import ProfileIcon from '@/assets/images/svg/profile.svg'; -import SearchSelectedIcon from '@/assets/images/svg/search-selected.svg'; -import SearchIcon from '@/assets/images/svg/search.svg'; -import { useAuthStore } from '@/hooks/use-auth'; - const Layout = () => { - const { isLoggedIn, fetchUser, user } = useAuthStore(); - - useEffect(() => { - if (isLoggedIn) fetchUser(); - }, [isLoggedIn, fetchUser]); - return ( ( - - ), - headerLeft: () => ( - - - Hi, {user?.first_name} - - - ), - headerRight: () => ( - - - - ), - headerShown: true, - tabBarIcon: ({ focused }) => - focused ? ( - - - - ) : ( - - - - ) + title: 'home', + headerShown: false }} - redirect={!isLoggedIn} /> - focused ? ( - - - - ) : ( - - - - ) + headerShown: false }} - redirect={!isLoggedIn} /> - focused ? ( - - - - ) : ( - - - - ) + headerShown: false }} - redirect={!isLoggedIn} /> ); diff --git a/frontend/mobile/app/(app)/(tabs)/discover.tsx b/frontend/mobile/app/(app)/(tabs)/discover.tsx index ee56ebb0a..46cd70909 100644 --- a/frontend/mobile/app/(app)/(tabs)/discover.tsx +++ b/frontend/mobile/app/(app)/(tabs)/discover.tsx @@ -1,143 +1,28 @@ -import React from 'react'; -import { - SafeAreaView, - ScrollView, - Text, - TouchableOpacity, - View -} from 'react-native'; - -import { router } from 'expo-router'; - -import { useClubsQuery, useEventsQuery } from '@sac/lib'; - -import { SearchBar } from '@/app/(app)/search/_components/search-bar'; -import { TopSearch } from '@/app/(app)/search/_components/top-search'; - -import { ClubHomePageCard } from './_components/club-homepage-card'; -import { EventHomePageCardHorizontal } from './_components/event-homepage-card'; - -const Discover = () => { - const { - data: events, - isLoading: eIsLoading, - error: eError - } = useEventsQuery({}); - - const { - data: clubs, - isLoading: cIsLoading, - error: cError - } = useClubsQuery({}); - - if (eIsLoading || cIsLoading) { - return Loading...; - } - - if (eError || cError) { - return Error...; - } +import { StyleSheet, Text, View } from 'react-native'; +const DiscoverPage = () => { return ( - - - { - router.push('/(app)/search/recents'); - return undefined; - }} - /> - - - Top Searches - - {/* FIXME: this and discover clubs have the same layout, make like a 2d grid scroll view elem */} - - - - - - - - - - - - - - - - Discover Clubs - - - - View All - - - - - - - {clubs?.map((club) => { - return ; - })} - - - - - - Discover Events - - - - View All - - - - - {events?.map((event) => { - return ( - - ); - })} - - - - + + Discover + ); }; -export default Discover; +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center' + }, + title: { + fontSize: 20, + fontWeight: 'bold' + }, + separator: { + marginVertical: 30, + height: 1, + width: '80%' + } +}); + +export default DiscoverPage; diff --git a/frontend/mobile/app/(app)/(tabs)/index.tsx b/frontend/mobile/app/(app)/(tabs)/index.tsx index ea130844c..c1e40d376 100644 --- a/frontend/mobile/app/(app)/(tabs)/index.tsx +++ b/frontend/mobile/app/(app)/(tabs)/index.tsx @@ -1,67 +1,28 @@ -import React from 'react'; -import { SectionList, Text, View } from 'react-native'; - -import { StatusBar } from 'expo-status-bar'; - -import { useUserFollowingQuery } from '@sac/lib'; - -import { useAuthStore } from '@/hooks/use-auth'; - -import { HappeningToday } from './_components/happening-today'; -import { RecommendedClubs } from './_components/recommended-clubs'; -import { UpcomingEvents } from './_components/upcoming-events'; +import { StyleSheet, Text, View } from 'react-native'; const HomePage = () => { - const { user } = useAuthStore(); - const { - data: clubs, - isLoading: cIsLoading, - error: cError - } = useUserFollowingQuery(user?.id!); return ( - <> - - - {cIsLoading && Loading...} - {cError && Error...} - {clubs && clubs.length === 0 && ( - Follow some clubs to see them here! - )} - {clubs && clubs.length > 0 && ( - Following Clubs: {clubs.length} - )} - {clubs && - clubs.map((club) => {club.name})} - - - ] - }, - { - title: 'Upcoming Events', - data: [] - }, - { - title: 'Recommended Clubs', - data: [] - } - ]} - keyExtractor={(_, index) => index.toString()} - renderItem={({ item }) => {item}} - renderSectionHeader={({ section: { title } }) => ( - - {title} - - )} - stickyHeaderHiddenOnScroll={true} - stickySectionHeadersEnabled={false} - /> - - + + Home + ); }; +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center' + }, + title: { + fontSize: 20, + fontWeight: 'bold' + }, + separator: { + marginVertical: 30, + height: 1, + width: '80%' + } +}); + export default HomePage; diff --git a/frontend/mobile/app/(app)/(tabs)/profile.tsx b/frontend/mobile/app/(app)/(tabs)/profile.tsx index 98d5bd882..7d6ca1183 100644 --- a/frontend/mobile/app/(app)/(tabs)/profile.tsx +++ b/frontend/mobile/app/(app)/(tabs)/profile.tsx @@ -1,24 +1,28 @@ -import React from 'react'; -import { SafeAreaView, Text, View } from 'react-native'; - -import { Button } from '@/components/button'; -import { useAuthStore } from '@/hooks/use-auth'; - -const Profile = () => { - const { onLogout, user } = useAuthStore(); - - const handleSignOut = async () => { - onLogout(); - }; +import { StyleSheet, Text, View } from 'react-native'; +const ProfilePage = () => { return ( - - - Welcome {user?.first_name} - - - + + Profile + ); }; -export default Profile; +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center' + }, + title: { + fontSize: 20, + fontWeight: 'bold' + }, + separator: { + marginVertical: 30, + height: 1, + width: '80%' + } +}); + +export default ProfilePage; diff --git a/frontend/mobile/app/(app)/_layout.tsx b/frontend/mobile/app/(app)/_layout.tsx index f283ca7bd..b8aa8a74e 100644 --- a/frontend/mobile/app/(app)/_layout.tsx +++ b/frontend/mobile/app/(app)/_layout.tsx @@ -1,62 +1,11 @@ import React from 'react'; -import { View } from 'react-native'; import { Stack } from 'expo-router'; -import { Arrow } from '@/components/arrow'; - -import { ClubKebab } from './_components/club-kebab'; -import { EventKabab } from './_components/event-kebab'; - const Layout = () => { return ( - , - headerRight: () => - }} - /> - , - headerRight: () => - }} - /> - ( - - ), - headerLeft: () => - }} - /> - ); }; diff --git a/frontend/mobile/app/(auth)/_layout.tsx b/frontend/mobile/app/(auth)/_layout.tsx index 670d9c7ae..0e369d3c7 100644 --- a/frontend/mobile/app/(auth)/_layout.tsx +++ b/frontend/mobile/app/(auth)/_layout.tsx @@ -1,106 +1,11 @@ import React from 'react'; -import { View } from 'react-native'; -import { Stack, router } from 'expo-router'; - -import { Arrow } from '@/components/arrow'; -import { Button } from '@/components/button'; -import { Wordmark } from '@/components/wordmark'; -import { useAuthStore } from '@/hooks/use-auth'; +import { Stack } from 'expo-router'; const Layout = () => { - const { onLogout } = useAuthStore(); return ( - - , - headerBackground: () => - }} - /> - , - headerBackground: () => ( - - ), - animationTypeForReplace: 'push', - animation: 'slide_from_right' - }} - /> - , - headerRight: () => ( - - ), - headerBackground: () => , - animationTypeForReplace: 'pop', - animation: 'slide_from_left' - }} - /> - { - return onLogout()} />; - }, - headerBackground: () => - }} - /> - , - headerBackground: () => , - headerRight: () => ( - router.replace('/(app)/(tabs)/')} - /> - ) - }} - /> - , - headerBackground: () => , - headerRight: () => ( - router.replace('/(app)/(tabs)/')} - /> - ) - }} - /> + + ); }; diff --git a/frontend/mobile/app/(auth)/index.tsx b/frontend/mobile/app/(auth)/index.tsx new file mode 100644 index 000000000..d1e4b89e7 --- /dev/null +++ b/frontend/mobile/app/(auth)/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Text, View } from 'react-native'; + +const Welcome = () => { + return ( + + Welcome + + ); +}; + +export default Welcome; diff --git a/frontend/mobile/app/_layout.tsx b/frontend/mobile/app/_layout.tsx index 609f7647d..2d1c8c6e0 100644 --- a/frontend/mobile/app/_layout.tsx +++ b/frontend/mobile/app/_layout.tsx @@ -1,78 +1,26 @@ import { useEffect } from 'react'; -import { View } from 'react-native'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; -import Spinner from 'react-native-loading-spinner-overlay'; +import 'react-native-reanimated'; import { Provider } from 'react-redux'; import { useFonts } from 'expo-font'; -import { Stack, useRouter, useSegments } from 'expo-router'; +import { Stack } from 'expo-router'; import * as SplashScreen from 'expo-splash-screen'; import { StatusBar } from 'expo-status-bar'; import FontAwesome from '@expo/vector-icons/FontAwesome'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { useAuthStore } from '@/hooks/use-auth'; import { store } from '@/store/store'; -export { - // Catch any errors thrown by the Layout component. - ErrorBoundary -} from 'expo-router'; +export { ErrorBoundary } from 'expo-router'; -// Prevent the splash screen from auto-hiding before asset loading is complete. SplashScreen.preventAutoHideAsync(); -export const queryClient = new QueryClient({ - defaultOptions: { - queries: { - refetchOnWindowFocus: false, - retry: false, - staleTime: 1000 * 60 * 5 - } - } -}); - const InitalLayout = () => { - const { isLoggedIn, fetchCache, isVerified, user } = useAuthStore(); - const router = useRouter(); - const segments = useSegments(); - useEffect(() => { - const handleNavigation = () => { - if (isLoggedIn === null) return fetchCache(); - - const inApp = segments[0] === '(app)'; - - console.log({ isLoggedIn, isVerified, inApp }); - - if (isLoggedIn && isVerified === false) { - router.push('/(auth)/verification'); - } else if (isLoggedIn && isVerified) { - router.push('/(app)/(tabs)/'); - } else if (!isLoggedIn) { - router.push('/(auth)/welcome'); - } - }; - - console.log({ isLoggedIn, isVerified, user }); - + const handleNavigation = () => {}; handleNavigation(); - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isLoggedIn, isVerified]); - - if (isLoggedIn === null) - return ( - - - - ); + }, []); return ( <> @@ -104,10 +52,8 @@ const RootLayout = () => { return ( - - - - + + ); diff --git a/frontend/mobile/assets/images/bell.png b/frontend/mobile/assets/images/bell.png deleted file mode 100644 index d94644403..000000000 Binary files a/frontend/mobile/assets/images/bell.png and /dev/null differ diff --git a/frontend/mobile/assets/images/box.png b/frontend/mobile/assets/images/box.png deleted file mode 100644 index e60e632e3..000000000 Binary files a/frontend/mobile/assets/images/box.png and /dev/null differ diff --git a/frontend/mobile/assets/images/campus.png b/frontend/mobile/assets/images/campus.png deleted file mode 100644 index cf96cf698..000000000 Binary files a/frontend/mobile/assets/images/campus.png and /dev/null differ diff --git a/frontend/mobile/assets/images/girl-1.jpeg b/frontend/mobile/assets/images/girl-1.jpeg deleted file mode 100644 index 761c26539..000000000 Binary files a/frontend/mobile/assets/images/girl-1.jpeg and /dev/null differ diff --git a/frontend/mobile/assets/images/guy-1.jpeg b/frontend/mobile/assets/images/guy-1.jpeg deleted file mode 100644 index a7d034358..000000000 Binary files a/frontend/mobile/assets/images/guy-1.jpeg and /dev/null differ diff --git a/frontend/mobile/assets/images/placeholder_club_logo.png b/frontend/mobile/assets/images/placeholder_club_logo.png deleted file mode 100644 index 65c26b8ba..000000000 Binary files a/frontend/mobile/assets/images/placeholder_club_logo.png and /dev/null differ diff --git a/frontend/mobile/assets/images/placeholder_location.png b/frontend/mobile/assets/images/placeholder_location.png deleted file mode 100644 index 24fb78e20..000000000 Binary files a/frontend/mobile/assets/images/placeholder_location.png and /dev/null differ diff --git a/frontend/mobile/assets/images/sandbox-header.png b/frontend/mobile/assets/images/sandbox-header.png deleted file mode 100644 index 9b2bc3867..000000000 Binary files a/frontend/mobile/assets/images/sandbox-header.png and /dev/null differ diff --git a/frontend/mobile/assets/images/showcase.png b/frontend/mobile/assets/images/showcase.png deleted file mode 100644 index 5ee136c25..000000000 Binary files a/frontend/mobile/assets/images/showcase.png and /dev/null differ diff --git a/frontend/mobile/assets/images/svg/blue-pin.svg b/frontend/mobile/assets/images/svg/blue-pin.svg deleted file mode 100644 index e9ccab689..000000000 --- a/frontend/mobile/assets/images/svg/blue-pin.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/frontend/mobile/assets/images/svg/calendar.svg b/frontend/mobile/assets/images/svg/calendar.svg deleted file mode 100644 index 8748b5b78..000000000 --- a/frontend/mobile/assets/images/svg/calendar.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/cancel.svg b/frontend/mobile/assets/images/svg/cancel.svg deleted file mode 100644 index 3430caf0c..000000000 --- a/frontend/mobile/assets/images/svg/cancel.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/frontend/mobile/assets/images/svg/circle-clock.svg b/frontend/mobile/assets/images/svg/circle-clock.svg deleted file mode 100644 index 832d32910..000000000 --- a/frontend/mobile/assets/images/svg/circle-clock.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/default-header.svg b/frontend/mobile/assets/images/svg/default-header.svg deleted file mode 100644 index 6894fde1b..000000000 --- a/frontend/mobile/assets/images/svg/default-header.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/document.svg b/frontend/mobile/assets/images/svg/document.svg deleted file mode 100644 index 533bfe4b8..000000000 --- a/frontend/mobile/assets/images/svg/document.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/frontend/mobile/assets/images/svg/email-confirm.svg b/frontend/mobile/assets/images/svg/email-confirm.svg deleted file mode 100644 index 3953ab5ed..000000000 --- a/frontend/mobile/assets/images/svg/email-confirm.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/mobile/assets/images/svg/email.svg b/frontend/mobile/assets/images/svg/email.svg deleted file mode 100644 index a99bb0d8c..000000000 --- a/frontend/mobile/assets/images/svg/email.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/mobile/assets/images/svg/event-demo-day.svg b/frontend/mobile/assets/images/svg/event-demo-day.svg deleted file mode 100644 index 081121dcb..000000000 --- a/frontend/mobile/assets/images/svg/event-demo-day.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/event-drop-party.svg b/frontend/mobile/assets/images/svg/event-drop-party.svg deleted file mode 100644 index 3876ebd09..000000000 --- a/frontend/mobile/assets/images/svg/event-drop-party.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/event-showcase.svg b/frontend/mobile/assets/images/svg/event-showcase.svg deleted file mode 100644 index 8ab566d58..000000000 --- a/frontend/mobile/assets/images/svg/event-showcase.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/expand.svg b/frontend/mobile/assets/images/svg/expand.svg deleted file mode 100644 index ea8e51b43..000000000 --- a/frontend/mobile/assets/images/svg/expand.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/home-selected.svg b/frontend/mobile/assets/images/svg/home-selected.svg deleted file mode 100644 index 44721e51d..000000000 --- a/frontend/mobile/assets/images/svg/home-selected.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/mobile/assets/images/svg/home.svg b/frontend/mobile/assets/images/svg/home.svg deleted file mode 100644 index cf07f3ef0..000000000 --- a/frontend/mobile/assets/images/svg/home.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/mobile/assets/images/svg/instagram.svg b/frontend/mobile/assets/images/svg/instagram.svg deleted file mode 100644 index 5e13e2ef1..000000000 --- a/frontend/mobile/assets/images/svg/instagram.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/mobile/assets/images/svg/leftarrow.svg b/frontend/mobile/assets/images/svg/leftarrow.svg deleted file mode 100644 index e0fc241ee..000000000 --- a/frontend/mobile/assets/images/svg/leftarrow.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/frontend/mobile/assets/images/svg/like.svg b/frontend/mobile/assets/images/svg/like.svg deleted file mode 100644 index 3d86298dd..000000000 --- a/frontend/mobile/assets/images/svg/like.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/frontend/mobile/assets/images/svg/location.svg b/frontend/mobile/assets/images/svg/location.svg deleted file mode 100644 index 9a5f9fafd..000000000 --- a/frontend/mobile/assets/images/svg/location.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/members.svg b/frontend/mobile/assets/images/svg/members.svg deleted file mode 100644 index c51398c05..000000000 --- a/frontend/mobile/assets/images/svg/members.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/mini-location-pin.svg b/frontend/mobile/assets/images/svg/mini-location-pin.svg deleted file mode 100644 index 5063dbe24..000000000 --- a/frontend/mobile/assets/images/svg/mini-location-pin.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/mobile/assets/images/svg/notification.svg b/frontend/mobile/assets/images/svg/notification.svg deleted file mode 100644 index 32d071ac3..000000000 --- a/frontend/mobile/assets/images/svg/notification.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/mobile/assets/images/svg/peace-hand.svg b/frontend/mobile/assets/images/svg/peace-hand.svg deleted file mode 100644 index f445ff242..000000000 --- a/frontend/mobile/assets/images/svg/peace-hand.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/person.svg b/frontend/mobile/assets/images/svg/person.svg deleted file mode 100644 index 10d78584e..000000000 --- a/frontend/mobile/assets/images/svg/person.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/pin.svg b/frontend/mobile/assets/images/svg/pin.svg deleted file mode 100644 index be2ec400d..000000000 --- a/frontend/mobile/assets/images/svg/pin.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/mobile/assets/images/svg/placeholder_location.svg b/frontend/mobile/assets/images/svg/placeholder_location.svg deleted file mode 100644 index c7ace3717..000000000 --- a/frontend/mobile/assets/images/svg/placeholder_location.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/profile-selected.svg b/frontend/mobile/assets/images/svg/profile-selected.svg deleted file mode 100644 index 78a5a2237..000000000 --- a/frontend/mobile/assets/images/svg/profile-selected.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/mobile/assets/images/svg/profile.svg b/frontend/mobile/assets/images/svg/profile.svg deleted file mode 100644 index 8f607b254..000000000 --- a/frontend/mobile/assets/images/svg/profile.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/mobile/assets/images/svg/sandbox-header.svg b/frontend/mobile/assets/images/svg/sandbox-header.svg deleted file mode 100644 index 67aa1d239..000000000 --- a/frontend/mobile/assets/images/svg/sandbox-header.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/sandbox-logo.svg b/frontend/mobile/assets/images/svg/sandbox-logo.svg deleted file mode 100644 index 9c23c8133..000000000 --- a/frontend/mobile/assets/images/svg/sandbox-logo.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/search-selected.svg b/frontend/mobile/assets/images/svg/search-selected.svg deleted file mode 100644 index 725f63085..000000000 --- a/frontend/mobile/assets/images/svg/search-selected.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/mobile/assets/images/svg/search.svg b/frontend/mobile/assets/images/svg/search.svg deleted file mode 100644 index 90fbb18bb..000000000 --- a/frontend/mobile/assets/images/svg/search.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/frontend/mobile/assets/images/svg/searchNew.svg b/frontend/mobile/assets/images/svg/searchNew.svg deleted file mode 100644 index db423cfd6..000000000 --- a/frontend/mobile/assets/images/svg/searchNew.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/mobile/assets/images/svg/share.svg b/frontend/mobile/assets/images/svg/share.svg deleted file mode 100644 index c507936aa..000000000 --- a/frontend/mobile/assets/images/svg/share.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/mobile/assets/images/svg/slack.svg b/frontend/mobile/assets/images/svg/slack.svg deleted file mode 100644 index 3bada626e..000000000 --- a/frontend/mobile/assets/images/svg/slack.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/mobile/assets/images/svg/time.svg b/frontend/mobile/assets/images/svg/time.svg deleted file mode 100644 index 9f137b948..000000000 --- a/frontend/mobile/assets/images/svg/time.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/mobile/babel.config.js b/frontend/mobile/babel.config.js index 94046263e..d133e3756 100644 --- a/frontend/mobile/babel.config.js +++ b/frontend/mobile/babel.config.js @@ -1,7 +1,6 @@ -module.exports = function (api) { +export default function (api) { api.cache(true); return { - presets: ['babel-preset-expo'], - plugins: ['nativewind/babel', 'react-native-reanimated/plugin'] + presets: ['babel-preset-expo'] }; }; diff --git a/frontend/mobile/data/categories.ts b/frontend/mobile/data/categories.ts deleted file mode 100644 index bba81d015..000000000 --- a/frontend/mobile/data/categories.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Category } from '@/types/category'; - -import { tags } from './tags'; - -export const categories: Category[] = []; - -for (let i = 1; i <= 10; i++) { - const category: Category = { - id: i.toString(), - created_at: new Date(), - updated_at: new Date(), - name: `Tag${i}`, - tags: tags.slice(0, Math.floor(Math.random() * tags.length)) - }; - categories.push(category); -} diff --git a/frontend/mobile/data/clubs.ts b/frontend/mobile/data/clubs.ts deleted file mode 100644 index bf565603d..000000000 --- a/frontend/mobile/data/clubs.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Club } from '@/types/club'; -import { Contact } from '@/types/contact'; - -export const clubs: Club[] = []; - -for (let i = 1; i <= 10; i++) { - const club: Club = { - id: i.toString(), - updated_at: new Date(), - created_at: new Date(), - name: `Club ${i}`, - preview: `Preview ${i}`, - description: `Description ${i}`, - num_members: i * 10, - is_recruiting: i % 2 === 0, - recruitment_cycle: - i % 4 === 0 - ? 'always' - : i % 3 === 0 - ? 'fallSpring' - : i % 2 === 0 - ? 'spring' - : 'fall', - recruitment_type: - i % 3 === 0 - ? 'unrestricted' - : i % 2 === 0 - ? 'tryout' - : 'application', - application_link: `https://example.com/club${i}`, - logo: `https://example.com/club${i}.png` - }; - clubs.push(club); -} - -export const contacts: Contact[] = []; - -for (let i = 1; i <= 10; i++) { - const contact: Contact = { - id: i.toString(), - created_at: new Date(), - updated_at: new Date(), - content: `Contact ${i}`, - type: Math.random() > 0.5 ? 'email' : 'slack' - }; - contacts.push(contact); -} - -export const clubContacts: { [key: string]: Contact[] } = {}; - -for (let i = 1; i <= 10; i++) { - const clubContactsArray: Contact[] = []; - const contactIndices: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].filter( - (index) => index % i === 0 - ); - contactIndices.slice(0, 2).forEach((index) => { - clubContactsArray.push(contacts[index]); - }); - clubContacts[i.toString()] = clubContactsArray; -} diff --git a/frontend/mobile/data/events.ts b/frontend/mobile/data/events.ts deleted file mode 100644 index ea6533685..000000000 --- a/frontend/mobile/data/events.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Club } from '@/types/club'; -import { Event } from '@/types/event'; -import { Tag } from '@/types/tag'; - -import { clubs } from './clubs'; -import { tags } from './tags'; - -const Locations = [ - '2435 E. North St., Greenville, SC', - '1234 Main Rd., New York, NY', - '5678 Elm St., Los Angeles, CA', - '91011 Pine Ct., Chicago, IL', - '1213 Oak Ave., Houston, TX', - '1415 Maple Dr., Phoenix, AZ', - '1617 Birch Ln., Philadelphia, PA', - '1819 Cedar Rd., San Antonio, TX', - '2021 Spruce St., San Diego, CA', - '2223 Willow Dr., Dallas, TX' -]; - -const generateLoremIpsum = (paragraphs = 1, sentencesPerParagraph = 3) => { - const loremIpsumText = - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; - const sentences = loremIpsumText.split('. '); - - const getRandomSentence = () => { - return sentences[Math.floor(Math.random() * sentences.length)]; - }; - - let paragraphsText = ''; - for (let i = 0; i < paragraphs; i++) { - let paragraph = ''; - for (let j = 0; j < sentencesPerParagraph; j++) { - paragraph += getRandomSentence() + ' '; - } - paragraphsText += paragraph.trim() + '\n\n'; - } - - return paragraphsText.trim(); -}; - -export const events: Event[] = []; - -for (let i = 1; i <= 10; i++) { - events.push({ - id: i.toString(), - updated_at: new Date(), - created_at: new Date(), - name: `Event ${i}`, - start_time: new Date(), - end_time: new Date(), - location: Locations[i - 1], - preview: `Preview ${i}`, - content: generateLoremIpsum( - Math.floor(Math.random() * 3) + 1, - Math.floor(Math.random() * 3) + 1 - ), - meeting_link: `http://www.example.com/event${i}`, - is_recurring: false, - event_type: 'open' - }); -} - -// Event Hosts - -export const eventHosts: { [key: string]: Club[] } = {}; - -for (let i = 1; i <= 10; i++) { - const hostsArray: Club[] = []; - const hostIndices: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].filter( - (index) => index % i === 0 - ); - hostIndices.forEach((index) => { - hostsArray.push(clubs[index]); - }); - eventHosts[i.toString()] = hostsArray; -} - -// Event Tags - -export const eventTags: { [key: string]: Tag[] } = {}; - -for (let i = 1; i <= 10; i++) { - const tagsArray: Tag[] = []; - const tagIndices: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].filter( - (index) => index % i === 0 - ); - tagIndices.forEach((index) => { - tagsArray.push(tags[index]); - }); - eventTags[i.toString()] = tagsArray; -} diff --git a/frontend/mobile/data/tags.ts b/frontend/mobile/data/tags.ts deleted file mode 100644 index 045b20667..000000000 --- a/frontend/mobile/data/tags.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Tag } from '@/types/tag'; - -export const tags: Tag[] = []; - -for (let i = 1; i <= 10; i++) { - const tag: Tag = { - id: i.toString(), - created_at: new Date(), - updated_at: new Date(), - name: `Tag${i}` - }; - tags.push(tag); -} diff --git a/frontend/mobile/hooks/use-categories.ts b/frontend/mobile/hooks/use-categories.ts deleted file mode 100644 index 928de31eb..000000000 --- a/frontend/mobile/hooks/use-categories.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { type UseQueryResult, useQuery } from '@tanstack/react-query'; - -import { fetchCategories } from '@/services/categories'; -import { Category } from '@/types/category'; - -export const useCategories = (): UseQueryResult => { - return useQuery({ - queryKey: ['category'], - queryFn: fetchCategories - }); -}; diff --git a/frontend/mobile/hooks/use-club-search.ts b/frontend/mobile/hooks/use-club-search.ts deleted file mode 100644 index 1dc205e79..000000000 --- a/frontend/mobile/hooks/use-club-search.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UseQueryResult, useQuery } from '@tanstack/react-query'; - -import { queryClubs } from '@/services/club'; -import { Club } from '@/types/club'; - -export const useClubSearch = (query: string): UseQueryResult => { - return useQuery({ - queryKey: ['useClubSearchQuery', query], - queryFn: () => { - return queryClubs(query); - } - }); -}; diff --git a/frontend/mobile/hooks/use-club-tags.ts b/frontend/mobile/hooks/use-club-tags.ts deleted file mode 100644 index 1fc0f3699..000000000 --- a/frontend/mobile/hooks/use-club-tags.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UseQueryResult, useQuery } from '@tanstack/react-query'; - -import { fetchClubTags } from '@/services/club'; -import { Tag } from '@/types/tag'; - -export const useClubTags = (clubUUID: string): UseQueryResult => { - return useQuery({ - queryKey: ['useClubTagsQueryID', clubUUID], - queryFn: () => { - return fetchClubTags(clubUUID); - } - }); -}; diff --git a/frontend/mobile/hooks/use-club.ts b/frontend/mobile/hooks/use-club.ts deleted file mode 100644 index f21be0e47..000000000 --- a/frontend/mobile/hooks/use-club.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { UseQueryResult, useQuery } from '@tanstack/react-query'; - -import { - fetchClub, - fetchClubContacts, - fetchClubTags, - fetchClubs -} from '@/services/club'; -import { Club } from '@/types/club'; -import { Contact } from '@/types/contact'; -import { Tag } from '@/types/tag'; -import { uuid } from '@/types/uuid'; - -const useClubs = (): UseQueryResult => { - return useQuery({ - queryKey: ['clubs'], - queryFn: () => { - return fetchClubs(); - } - }); -}; - -const useClub = (clubID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['club', clubID], - queryFn: () => { - return fetchClub(clubID); - } - }); -}; - -const useClubContacts = (clubID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['club', clubID, 'contacts'], - queryFn: () => { - return fetchClubContacts(clubID); - } - }); -}; - -const useClubTags = (clubID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['club', clubID, 'tags'], - queryFn: () => { - return fetchClubTags(clubID); - } - }); -}; - -export type Faq = { - id: uuid; - question: string; - answer: string; -}; - -export const useClubFAQs = (clubID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['club', clubID, 'faqs'], - queryFn: async (): Promise => { - return [ - { - id: '1', - question: 'What is the purpose of the club?', - answer: 'The purpose of the club is to provide a platform for like-minded individuals to come together and pursue their interests in a specific field. The purpose of the club is to provide a platform for like-minded individuals to come together and pursue their interests in a specific field. The purpose of the club is to provide a platform for like-minded individuals to come together and pursue their interests in a specific field.' - }, - { - id: '2', - question: 'How can I join the club?', - answer: 'To join the club, you can attend our regular meetings and express your interest in becoming a member. We welcome anyone who shares our passion and is willing to contribute.' - }, - { - id: '3', - question: 'What activities does the club organize?', - answer: 'The club organizes various activities such as workshops, guest lectures, competitions, and networking events to enhance the learning and networking opportunities for its members.' - } - ]; - } - }); -}; - -export const useClubFAQ = (faqID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['faq', faqID], - queryFn: async (): Promise => { - let id = ''; - let question = ''; - let answer = ''; - - if (faqID === '1') { - id = '1'; - question = 'What is the purpose of the club?'; - answer = - 'The purpose of the club is to provide a platform for like-minded individuals to come together and pursue their interests in a specific field. The purpose of the club is to provide a platform for like-minded individuals to come together and pursue their interests in a specific field. The purpose of the club is to provide a platform for like-minded individuals to come together and pursue their interests in a specific field.'; - } else if (faqID === '2') { - id = '2'; - question = 'How can I join the club?'; - answer = - 'To join the club, you can attend our regular meetings and express your interest in becoming a member. We welcome anyone who shares our passion and is willing to contribute.'; - } else if (faqID === '3') { - id = '3'; - question = 'What activities does the club organize?'; - answer = - 'The club organizes various activities such as workshops, guest lectures, competitions, and networking events to enhance the learning and networking opportunities for its members.'; - } - - return { - id, - question, - answer - }; - } - }); -}; - -export type Admin = { - id: uuid; - name: string; - title: string; -}; - -export const useClubAdmin = (clubID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['eboard-members', clubID], - queryFn: async (): Promise => { - return [ - { id: 'alder', name: 'Alder Whiteford', title: 'Project Lead' }, - { id: 'amanda', name: 'Amanda Kerr', title: 'Design Lead' }, - { id: 'david', name: 'David Oduneye', title: 'Tech Lead' }, - { id: 'garrett', name: 'Garrett Ladley', title: 'Tech Lead' } - ]; - } - }); -}; -export { useClub, useClubs, useClubContacts, useClubTags }; diff --git a/frontend/mobile/hooks/use-event.ts b/frontend/mobile/hooks/use-event.ts deleted file mode 100644 index 93ebe0878..000000000 --- a/frontend/mobile/hooks/use-event.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { UseQueryResult, useQuery } from '@tanstack/react-query'; - -import { - fetchEvent, - fetchEventTags, - fetchEvents, - fetchHosts -} from '@/services/event'; -import { Club } from '@/types/club'; -import { Event } from '@/types/event'; -import { Tag } from '@/types/tag'; -import { uuid } from '@/types/uuid'; - -const useEvent = (eventID: string): UseQueryResult => { - return useQuery({ - queryKey: ['event', eventID], - queryFn: () => { - return fetchEvent(eventID); - } - }); -}; - -const useEvents = (): UseQueryResult => { - return useQuery({ - queryKey: ['events'], - queryFn: () => { - return fetchEvents(); - } - }); -}; - -const useEventTags = (eventID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['event', eventID, 'tags'], - queryFn: () => { - return fetchEventTags(eventID); - } - }); -}; - -const useEventHosts = (eventID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['event', eventID, 'hosts'], - queryFn: () => { - return fetchHosts(eventID); - } - }); -}; - -export { useEvent, useEvents, useEventTags, useEventHosts }; diff --git a/frontend/mobile/hooks/use-events.ts b/frontend/mobile/hooks/use-events.ts deleted file mode 100644 index 9bc60fe2b..000000000 --- a/frontend/mobile/hooks/use-events.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { UseQueryResult, useQuery } from '@tanstack/react-query'; - -import { uuid } from '@/types/uuid'; - -export type Event = { - title: string; - time: string; - date: string; - location: string; -}; - -export const useEvents = (clubID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['events', clubID], - queryFn: async (): Promise => { - return [ - { - title: 'Orientation', - time: '8:00 am - 9:30 am', - date: 'February 29', - location: 'Ryder Hall, Room 294' - }, - { - title: 'Breakfast', - time: '9:00 am - 10:30 am', - date: 'March 1', - location: 'Ryder Hall, Room 294' - }, - { - title: 'Orientation', - time: '7:00 am - 11:30 am', - date: 'March 2', - location: 'Ryder Hall, Room 294' - } - ]; - } - }); -}; diff --git a/frontend/mobile/hooks/use-tags.ts b/frontend/mobile/hooks/use-tags.ts deleted file mode 100644 index 4dd389766..000000000 --- a/frontend/mobile/hooks/use-tags.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UseQueryResult, useQuery } from '@tanstack/react-query'; - -import { fetchTags } from '@/services/tags'; -import { Tag } from '@/types/tag'; - -const useTags = (): UseQueryResult => { - return useQuery({ - queryKey: ['tags'], - queryFn: fetchTags - }); -}; - -export { useTags }; diff --git a/frontend/mobile/hooks/use-user.ts b/frontend/mobile/hooks/use-user.ts deleted file mode 100644 index bac4fec97..000000000 --- a/frontend/mobile/hooks/use-user.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { - UseMutationResult, - type UseQueryResult, - useMutation, - useQuery -} from '@tanstack/react-query'; - -import { queryClient } from '@/app/_layout'; -import { - createUserFollowing, - createUserTags, - deleteUserFollowing, - fetchUserFollowing, - updateUser -} from '@/services/user'; -import { Club } from '@/types/club'; -import { uuid } from '@/types/uuid'; - -const useUserFollowing = (userID: uuid): UseQueryResult => { - return useQuery({ - queryKey: ['user', userID, 'following'], - queryFn: async () => await fetchUserFollowing(userID) - }); -}; - -const useUpdateUser = () => { - return useMutation({ - mutationFn: ({ - userID, - updateUserRequestBody - }: { - userID: uuid; - updateUserRequestBody: { - graduation_year: number; - college: string; - graduation_cycle: string; - }; - }) => updateUser(userID, updateUserRequestBody), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['user'] }); - } - }); -}; - -const useCreateUserTags = (): UseMutationResult< - void, - Error, - { - userID: uuid; - tagIDs: uuid[]; - }, - unknown -> => { - return useMutation({ - mutationFn: ({ userID, tagIDs }) => createUserTags(userID, tagIDs), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ['user_tags'] }); - } - }); -}; - -const useCreateClubFollowing = (): UseMutationResult< - void, - Error, - { - userID: uuid; - clubID: uuid; - }, - unknown -> => { - return useMutation({ - mutationFn: ({ userID, clubID }) => createUserFollowing(userID, clubID), - onSuccess: (_, variables: { userID: uuid; clubID: uuid }, __) => { - queryClient.invalidateQueries({ - queryKey: [`user${variables.userID}following`] - }); - } - }); -}; - -const useDeleteClubFollowing = () => { - return useMutation({ - mutationFn: ({ userID, clubID }: { userID: uuid; clubID: uuid }) => - deleteUserFollowing(userID, clubID), - onSuccess: (_, variables: { userID: string; clubID: string }, __) => { - return queryClient.invalidateQueries({ - queryKey: [`user${variables.userID}following`] - }); - } - }); -}; - -export { - useUserFollowing, - useUpdateUser, - useCreateUserTags, - useCreateClubFollowing, - useDeleteClubFollowing -}; diff --git a/frontend/mobile/package.json b/frontend/mobile/package.json index 0025ba2f4..fef289fcc 100644 --- a/frontend/mobile/package.json +++ b/frontend/mobile/package.json @@ -8,85 +8,50 @@ "ios": "expo run:ios", "web": "expo start --web", "test": "echo \"Woah there, we have no frontend tests as of right now. Let's just say we're passing.\" && exit 0", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx --fix", + "lint": "eslint . --ext ts,tsx", "format": "prettier --write ." }, "jest": { "preset": "jest-expo" }, "dependencies": { - "@expo/vector-icons": "^14.0.0", - "@gorhom/bottom-sheet": "^4", - "@react-native-community/masked-view": "^0.1.11", - "@react-native-menu/menu": "^1.0.1", - "@react-native/babel-preset": "^0.74.81", - "@react-navigation/native": "^6.1.17", - "@react-navigation/stack": "^6.3.29", - "@reduxjs/toolkit": "^2.2.3", - "@sac/lib": "*", - "@tanstack/react-query": "^5.32.0", - "@types/uuid": "^9.0.8", - "axios": "^1.6.8", - "calendarize": "^1.1.1", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.0", - "date-fns": "^3.6.0", - "eslint": "^8.56.0", - "expo": "^50.0.17", - "expo-application": "^5.8.4", - "expo-asset": "~9.0.2", - "expo-auth-session": "^5.4.0", - "expo-dev-client": "~3.3.11", - "expo-font": "~11.10.2", - "expo-haptics": "~12.8.1", - "expo-linking": "~6.2.2", - "expo-router": "~3.4.8", - "expo-secure-store": "~12.8.1", - "expo-splash-screen": "~0.26.4", - "expo-status-bar": "~1.11.1", - "expo-system-ui": "~2.9.4", - "expo-web-browser": "~12.8.2", - "install": "^0.13.0", - "nativewind": "^2.0.11", + "@expo/vector-icons": "^14.0.2", + "@generatesac/lib": "^0.0.1", + "@react-navigation/native": "^6.0.2", + "@reduxjs/toolkit": "^2.2.4", + "@shopify/restyle": "^2.4.4", + "expo": "~51.0.2", + "expo-font": "~12.0.4", + "expo-linking": "~6.3.1", + "expo-router": "~3.5.11", + "expo-secure-store": "~13.0.1", + "expo-splash-screen": "~0.27.4", + "expo-status-bar": "~1.12.1", + "expo-system-ui": "~3.0.4", + "expo-web-browser": "~13.0.3", "react": "18.2.0", "react-dom": "18.2.0", - "react-hook-form": "^7.51.2", - "react-native": "0.74.0", - "react-native-calendars": "^1.1304.1", - "react-native-confirmation-code-field": "^7.4.0", - "react-native-element-dropdown": "^2.10.4", - "react-native-gesture-handler": "^2.16.0", - "react-native-loading-spinner-overlay": "^3.0.1", - "react-native-maps": "1.14.0", - "react-native-menu": "^0.23.0", - "react-native-open-maps": "^0.4.3", - "react-native-reanimated": "^3.8.1", - "react-native-safe-area-context": "^4.9.0", - "react-native-screens": "~3.31.1", - "react-native-size-matters": "^0.4.2", - "react-native-svg": "^15.2.0", - "react-native-svg-transformer": "^1.3.0", - "react-native-web": "~0.19.11", - "react-query": "^3.39.3", - "react-redux": "^9.1.1", - "tailwind-merge": "^2.3.0", - "zod": "^3.23.4", - "zustand": "^4.5.2" + "react-native": "0.74.1", + "react-native-gesture-handler": "^2.16.2", + "react-native-reanimated": "~3.11.0", + "react-native-safe-area-context": "4.10.1", + "react-native-screens": "3.31.1", + "react-native-web": "~0.19.10", + "react-redux": "^9.1.2" }, "devDependencies": { - "@babel/core": "^7.24.4", + "@babel/core": "^7.24.0", "@react-native-community/eslint-config": "^3.2.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0", - "@types/react": "~18.2.78", - "eslint": "^8.56.0", + "@types/react": "~18.2.45", + "eslint": "8.57.0", "eslint-plugin-prettier": "^5.1.3", "jest": "^29.2.1", - "jest-expo": "~50.0.4", + "jest-expo": "~51.0.1", "prettier": "^3.2.4", "react-native-svg-transformer": "^1.3.0", - "react-test-renderer": "18.3.1", - "tailwindcss": "3.3.2", - "typescript": "^5.4.5" + "react-test-renderer": "18.2.0", + "typescript": "~5.4.5" }, "private": true } diff --git a/frontend/mobile/services/api.ts b/frontend/mobile/services/api.ts deleted file mode 100644 index 096b7e44c..000000000 --- a/frontend/mobile/services/api.ts +++ /dev/null @@ -1,112 +0,0 @@ -import axios, { InternalAxiosRequestConfig } from 'axios'; - -import { API_BASE_URL } from '@/lib/const'; -import { tokenCache } from '@/lib/utils'; - -// TODO: Add a refresh token interceptor. -// TODO: Add a retry interceptor. - -const api = axios.create({ - baseURL: API_BASE_URL, - withCredentials: true, - timeout: 10000, - headers: { - 'Content-Type': 'application/json' - } -}); - -const addAuthorizationHeaderInterceptor = async ( - config: InternalAxiosRequestConfig -) => { - if ( - (config.url?.includes('/auth/login') && config.method === 'POST') || - (config.url?.includes('/users/') && config.method === 'POST') - ) { - return config; - } - - const refreshToken = await tokenCache.getToken('refreshToken'); - if (!refreshToken) { - console.log('No refresh token'); - return config; - } - - const accessToken = await tokenCache.getToken('accessToken'); - if (!accessToken) { - console.log('No access token'); - return config; - } - - const currentTime = new Date().toLocaleTimeString(); - console.log( - `[${currentTime}] ${config.url} ${config.method?.toUpperCase()} ${JSON.stringify(config.data || {})}` - ); - - config.headers.Authorization = `Bearer ${accessToken}`; - return config; -}; - -// export const refreshTokenInterceptor = async (config: InternalAxiosRequestConfig) => { -// const accessToken = await tokenCache.getToken('accessToken'); -// if (!accessToken) return config; - -// const bufferTime = experationTime(accessToken, 30000); - -// if (bufferTime <= 0) { -// try { -// const refreshToken = await tokenCache.getToken('refreshToken'); -// if (!refreshToken) throw new Error('No refresh token'); - -// const newTokens = await refreshAccessToken(refreshToken); - -// config.headers.Authorization = `Bearer ${newTokens.accessToken}`; -// return config; -// } catch (error) { -// console.log('Error refreshing access token:', error); -// // signOut(); -// return config; -// } -// } - -// config.headers.Authorization = `Bearer ${accessToken}`; -// return config; -// } - -api.interceptors.request.use(addAuthorizationHeaderInterceptor, (error) => - Promise.reject(error) -); -// api.interceptors.request.use(refreshTokenInterceptor, (error) => Promise.reject(error)); - -// export const unauthorizedInterceptor = async (error: AxiosError) => { -// if (error.response?.status !== 401) return Promise.reject(error); - -// const refreshToken = await tokenCache.getToken('refreshToken'); -// if (!refreshToken) return Promise.reject(error); - -// try { -// const newTokens = await refreshAccessToken(refreshToken); -// const config = error.config as InternalAxiosRequestConfig; -// config.headers.Authorization = `Bearer ${newTokens.accessToken}`; -// return axios.request(config); -// } catch (error) { -// return Promise.reject(error); -// } -// } - -// axios.interceptors.response.use(undefined, async (error: AxiosError) => { -// if (error.response?.status !== 401) return Promise.reject(error); - -// const refreshToken = await tokenCache.getToken('refreshToken'); -// if (!refreshToken) return Promise.reject(error); - -// try { -// const newTokens = await refreshAccessToken(refreshToken); -// const config = error.config as InternalAxiosRequestConfig; -// config.headers.Authorization = `Bearer ${newTokens.accessToken}`; -// return axios.request(config); -// } catch (error) { -// return Promise.reject(error); -// } -// }); - -export { api, addAuthorizationHeaderInterceptor }; diff --git a/frontend/mobile/services/auth.ts b/frontend/mobile/services/auth.ts deleted file mode 100644 index ae5991f3a..000000000 --- a/frontend/mobile/services/auth.ts +++ /dev/null @@ -1,349 +0,0 @@ -import { AxiosError } from 'axios'; - -import { extractTokens } from '@/lib/utils'; -import { api } from '@/services/api'; -import { Tokens } from '@/types/auth'; -import { ErrorResponse } from '@/types/error'; -import { User } from '@/types/user'; - -/** - * Creates a new user with the given first name, last name, email, and password. - * @param first_name The first name of the user. - * @param last_name The last name of the user. - * @param email The email of the user. - * @param password The password of the user. - * @returns The user that was created. - */ -export const signUp = async ( - first_name: string, - last_name: string, - email: string, - password: string -): Promise<{ user: User; tokens: Tokens }> => { - try { - const response = await api.post('/users/', { - first_name: first_name, - last_name: last_name, - email: email, - password: password - }); - - const tokens = extractTokens( - response.headers['set-cookie'], - response.headers - ); - const user = response.data; - - return { user, tokens }; - } catch (error: any) { - const axiosErr: AxiosError = error; - const response = axiosErr.response; - if (response) { - const data = response.data as ErrorResponse; - throw new Error(data.error); - } else { - throw new Error('Error signing up'); - } - } -}; - -/** - * Requests a verification code for the user with the given email. - * @param email The email of the user. - */ -export const requestVerification = async (email: string): Promise => { - try { - await api.post('/auth/send-code', { - email - }); - } catch (error: any) { - const axiosErr: AxiosError = error; - const response = axiosErr.response; - if (response) { - const data = response.data as ErrorResponse; - throw new Error(data.error); - } else { - throw new Error('Error requesting verification code'); - } - } -}; - -/** - * Completes the verification process for the user with the given email and code. - * @param email The email of the user. - * @param code The verification code of the user. - * @returns The user that was verified. - */ -export const completeVerification = async ( - email: string, - code: string -): Promise => { - try { - await api.post('/auth/verify-email/', { - email, - token: code - }); - } catch (error: any) { - const axiosErr: AxiosError = error; - const response = axiosErr.response; - if (response) { - const data = response.data as ErrorResponse; - throw new Error(data.error); - } else { - throw new Error('Error completing verification'); - } - } -}; - -/** - * Logins the user with the given email and password. - * @param email The email of the user. - * @param password The password of the user. - * @returns The user that was logged in. - */ -export const login = async ( - email: string, - password: string -): Promise<{ user: User; tokens: Tokens }> => { - try { - const response = await api.post('/auth/login', { - email, - password - }); - - const tokens = extractTokens( - response.headers['set-cookie'], - response.headers - ); - const user = response.data; - - return { user, tokens }; - } catch (error: any) { - console.log('Error logging in:', error); - const axiosErr: AxiosError = error; - const response = axiosErr.response; - if (response) { - const data = response.data as ErrorResponse; - throw new Error(data.error); - } else { - throw new Error('Error logging in'); - } - } -}; - -/** - * Logout the user. - */ -export const logout = async (): Promise => { - try { - await api.post('/auth/logout'); - } catch (error: any) { - console.log('Error logging out:', error); - throw new Error('Error logging out'); - } -}; - -/** - * Refreshes the access token with the given refresh token. - * @param refreshToken The refresh token of the user. - * @returns The new tokens. - */ -export const refreshAccessToken = async ( - refreshToken: string -): Promise => { - try { - const response = await api.post('/auth/refresh', { - refresh_token: refreshToken - }); - - const tokens = extractTokens( - response.headers['set-cookie'], - response.headers - ); - - return tokens; - } catch (error: any) { - console.log('Error refreshing token:', error); - const axiosErr: AxiosError = error; - const response = axiosErr.response; - if (response) { - const data = response.data as ErrorResponse; - throw new Error(data.error); - } else { - throw new Error('Error refreshing token'); - } - } -}; - -// import { AxiosError } from 'axios'; - -// import { extractTokens } from '@/lib/utils'; -// import { api } from '@/services/api'; -// import { Tokens } from '@/types/auth'; -// import { ErrorResponse } from '@/types/error'; -// import { User } from '@/types/user'; - -// /** -// * Creates a new user with the given user information. -// * -// * @param first_name The first name of the user. -// * @param last_name The last name of the user. -// * @param email The email of the user. -// * @param password The password of the user. -// * @returns The user that was created and the tokens. -// * @throws Error if the user cannot be created. -// * @see User -// * @see Tokens -// */ -// const register = async ( -// first_name: string, -// last_name: string, -// email: string, -// password: string -// ): Promise<{ user: User; tokens: Tokens }> => { -// return api -// .post('/users/', { -// first_name: first_name, -// last_name: last_name, -// email: email, -// password: password -// }) -// .then((response) => { -// const tokens = extractTokens( -// response.headers['set-cookie'], -// response.headers -// ); -// const user = response.data; - -// return { user, tokens }; -// }) -// .catch((error: AxiosError) => { -// console.error(error); -// throw new Error('Error fetching clubs'); -// }); -// }; - -// /** -// * Requests a verification code for the user with the given email. -// * -// * @param email The email of the user. -// * @throws Error if the verification code cannot be requested. -// * @see User -// * @see Tokens -// */ -// const requestVerification = async (email: string): Promise => { -// return api -// .post('/auth/send-code', { email }) -// .then(() => { }) -// .catch((error: AxiosError) => { -// console.error(error); -// throw new Error('Error requesting verification code'); -// }); -// }; - -// /** -// * Completes the verification process for the user with the given email and code. -// * -// * @param email The email of the user. -// * @param code The verification code of the user. -// * @throws Error if the verification process cannot be completed. -// * @see User -// * @see Tokens -// */ -// const verifyEmail = async ( -// email: string, -// code: string -// ): Promise => { -// return api -// .post('/auth/verify-email/', { -// email, -// token: code -// }) -// .then(() => { }) -// .catch((error: AxiosError) => { -// console.error(error); -// throw new Error('Error completing verification'); -// }); -// }; - -// /** -// * Logins the user with the given email and password. -// * -// * @param email The email of the user. -// * @param password The password of the user. -// * @returns The user that was logged in. -// * @throws Error if the user cannot be logged in. -// * @see User -// * @see Tokens -// */ -// const login = async ( -// email: string, -// password: string -// ): Promise<{ user: User; tokens: Tokens }> => { -// return api -// .post('/auth/login', { -// email, -// password -// }) -// .then((response) => { -// const tokens = extractTokens( -// response.headers['set-cookie'], -// response.headers -// ); -// const user = response.data; - -// return { user, tokens }; -// }) -// .catch((error: AxiosError) => { -// console.error(error); -// throw new Error('Error logging in'); -// }); -// }; - -// /** -// * Logout the user. -// * -// * @throws Error if the user cannot be logged out. -// * @see User -// * @see Tokens -// */ -// const logout = async (): Promise => { -// return api -// .post('/auth/logout') -// .then(() => { }) -// .catch((error: AxiosError) => { -// console.error(error); -// throw new Error('Error logging out'); -// }); -// } - -// /** -// * Refreshes the access token with the given refresh token. -// * -// * @param refreshToken The refresh token of the user. -// * @returns The new tokens. -// * @throws Error if the tokens cannot be refreshed. -// * @see Tokens -// */ -// const refreshAccessToken = async ( -// refreshToken: string -// ): Promise => { -// return api -// .post('/auth/refresh', { -// refresh_token: refreshToken -// }) -// .then((response) => { -// const tokens = extractTokens( -// response.headers['set-cookie'], -// response.headers -// ); - -// return tokens; -// }) -// .catch((error: AxiosError) => { -// console.error(error); -// throw new Error('Error refreshing token'); -// }); -// }; - -// export { register, requestVerification, verifyEmail, login, logout, refreshAccessToken }; diff --git a/frontend/mobile/services/categories.ts b/frontend/mobile/services/categories.ts deleted file mode 100644 index 1a4e20e62..000000000 --- a/frontend/mobile/services/categories.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AxiosError } from 'axios'; - -import { Category } from '@/types/category'; -import { ErrorResponse } from '@/types/error'; - -import { api } from './api'; - -const fetchCategories = async (): Promise => { - return api - .get(`/categories`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching categories'); - }); -}; - -export { fetchCategories }; diff --git a/frontend/mobile/services/club.ts b/frontend/mobile/services/club.ts deleted file mode 100644 index 0c27d6c75..000000000 --- a/frontend/mobile/services/club.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { AxiosError } from 'axios'; - -import { Club } from '@/types/club'; -import { Contact } from '@/types/contact'; -import { ErrorResponse } from '@/types/error'; -import { Tag } from '@/types/tag'; -import { uuid } from '@/types/uuid'; - -import { api } from './api'; - -/** - * Fetches all clubs. - * - * @returns A Promise that resolves to the fetched clubs or rejects with an error - * @throws Error if the clubs cannot be fetched - * @see Club - */ -// TODO: deal with pagination + deal with other params -const fetchClubs = async (): Promise => { - return api - .get('/clubs') - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching clubs'); - }); -}; - -/** - * Fetches a club by its ID. - * - * @param clubID The ID of the club to fetch - * @returns A Promise that resolves to the fetched club or rejects with an error - * @throws Error if the club cannot be fetched - * @see Club - */ -const fetchClub = async (clubID: uuid): Promise => { - return api - .get(`/clubs/${clubID}`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching club'); - }); -}; - -/** - * Fetches all contacts for a club by its ID. - * - * @param clubID The ID of the club to fetch contacts for - * @returns A Promise that resolves to the fetched contacts or rejects with an error - * @throws Error if the contacts cannot be fetched - * @see Contact - * @see Club - */ -const fetchClubContacts = async (clubID: uuid): Promise => { - return api - .get(`/clubs/${clubID}/contacts`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching contacts'); - }); -}; - -/** - * Fetches all tags for a club by its ID. - * - * @param _clubID The ID of the club to fetch tags for - * @returns A Promise that resolves to the fetched tags or rejects with an error - * @throws Error if the tags cannot be fetched - * @see Tag - * @see Club - */ -const fetchClubTags = async (_clubID: uuid): Promise => { - // return api - // .get(`/clubs/${clubID}/tags`) - // .then((response) => response.data) - // .catch((error: AxiosError) => { - // console.error(error); - // throw new Error('Error fetching tags'); - // }); - - return [ - { - id: '1', - name: 'Software', - created_at: new Date(), - updated_at: new Date(), - category_id: '1' - }, - { - id: '2', - name: 'Design', - created_at: new Date(), - updated_at: new Date(), - category_id: '2' - }, - { - id: '3', - name: 'Professional', - created_at: new Date(), - updated_at: new Date(), - category_id: '3' - }, - { - id: '4', - name: 'Product Development', - created_at: new Date(), - updated_at: new Date(), - category_id: '4' - } - ]; -}; - -/** - * Fetch clubs according to a search query. - * - * @param clubParams The parameters you'd like to search with. - * @returns A Promise that resolves to the fetched clubs or rejects with an error - * @throws Error if the clubs cannot be fetched - * @see Club - * @see Club[] - */ -// TODO: deal with pagination + deal with other params -const queryClubs = async (queryString: string): Promise => { - return api - .get(`/clubs/`, { - params: { search: queryString } - }) - .then((response) => response.data as Club[]) - .catch((error) => { - console.error(error); - throw new Error('Error querying clubs'); - }); -}; - -export { fetchClubContacts, fetchClub, fetchClubs, fetchClubTags, queryClubs }; diff --git a/frontend/mobile/services/event.ts b/frontend/mobile/services/event.ts deleted file mode 100644 index a50271547..000000000 --- a/frontend/mobile/services/event.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AxiosError } from 'axios'; - -import { Club } from '@/types/club'; -import { ErrorResponse } from '@/types/error'; -import { Event } from '@/types/event'; -import { Tag } from '@/types/tag'; -import { uuid } from '@/types/uuid'; - -import { api } from './api'; - -/** - * Fetches an event by its ID. - * - * @param eventID The ID of the event to fetch - * @returns A Promise that resolves to the fetched event or rejects with an error - * @throws Error if the event cannot be fetched - * @see Event - */ -const fetchEvent = async (eventID: uuid): Promise => { - return api - .get(`/events/${eventID}`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching event'); - }); -}; - -/** - * Fetches all events. - * - * @returns A Promise that resolves to the fetched events or rejects with an error - * @throws Error if the events cannot be fetched - * @see Event - */ -const fetchEvents = async (): Promise => { - return api - .get('/events') - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching events'); - }); -}; - -/** - * Fetches the hosts of an event by its ID. - * - * @param eventID The ID of the event whose hosts to fetch - * @returns A Promise that resolves to the fetched hosts or rejects with an error - * @throws Error if the hosts cannot be fetched - * @see Club - */ -const fetchHosts = async (eventID: uuid): Promise => { - return api - .get(`/events/${eventID}/hosts`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching hosts'); - }); -}; - -/** - * Fetches the tags associated with an event. - * - * @param eventID The ID of the event to fetch tags for - * @returns A Promise that resolves to the fetched tags or rejects with an error - * @throws Error if the tags cannot be fetched - * @see Tag - */ -const fetchEventTags = async (eventID: uuid): Promise => { - return api - .get(`/events/${eventID}/tags`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Failed to fetch event tags'); - }); -}; - -export { fetchEvent, fetchEvents, fetchHosts, fetchEventTags }; diff --git a/frontend/mobile/services/tags.ts b/frontend/mobile/services/tags.ts deleted file mode 100644 index 17b179ac0..000000000 --- a/frontend/mobile/services/tags.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AxiosError } from 'axios'; - -import { ErrorResponse } from '@/types/error'; -import { Tag } from '@/types/tag'; - -import { api } from './api'; - -/** - * Fetches all tags. - * - * @returns A Promise that resolves to the fetched tags or rejects with an error - * @throws Error if the tags cannot be fetched - * @see Tag - */ -const fetchTags = async (): Promise => { - return api - .get('/tags') - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error getting all tags'); - }); -}; - -export { fetchTags }; diff --git a/frontend/mobile/services/user.ts b/frontend/mobile/services/user.ts deleted file mode 100644 index 55c5c1fab..000000000 --- a/frontend/mobile/services/user.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { AxiosError } from 'axios'; - -import { api } from '@/services/api'; -import { Club } from '@/types/club'; -import { ErrorResponse } from '@/types/error'; -import { User } from '@/types/user'; -import { uuid } from '@/types/uuid'; - -/** - * Gets the user from the access token. - * - * @returns The user that was retrieved. - * @throws Error if the user cannot be retrieved. - * @see User - */ -const getCurrentUser = async (): Promise => { - return api - .get('/users/me') - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error getting current user'); - }); -}; - -/** - * Associates a user with a tag. - * - * @param userID The ID of the user. - * @param tagIDs The IDs of the tags. - * @throws Error if the user cannot be associated with the tag. - * @see User - * @see Tag - */ -const createUserTags = async (userID: uuid, tagIDs: uuid[]): Promise => { - return api - .post(`/users/${userID}/tags`, { tags: tagIDs }) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error associating users to a tag'); - }); -}; - -/** - * Updates the user's information. - * - * @param userID The ID of the user. - * @param updateUserBody The updated user information. - * @returns The updated user. - * @throws Error if the user cannot be updated. - * @see User - */ -const updateUser = async ( - userID: uuid, - updateUserBody: { - graduation_year: number; - college: string; - graduation_cycle: string; - } -): Promise => { - return api - .patch(`/users/${userID}`, updateUserBody) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error updating user'); - }); -}; - -/** - * Fetches the clubs that a user is following. - * - * @param userID The ID of the user. - * @returns A Promise that resolves to the clubs that the user is following or rejects with an error. - * @throws Error if the clubs cannot be fetched. - * @see Club - */ -const fetchUserFollowing = async (userID: uuid): Promise => { - return api - .get(`/users/${userID}/follower`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error fetching followed clubs'); - }); -}; - -/** - * Creates a user following a club. - * - * @param userID the ID of the user - * @param clubID the ID of the club - * @returns A Promise that resolves to void or rejects with an error - * @throws Error if the user cannot follow the club - * @see Club - * @see User - */ -const createUserFollowing = async ( - userID: uuid, - clubID: uuid -): Promise => { - return api - .post(`/users/${userID}/follower/${clubID}`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error following clubs'); - }); -}; - -/** - * Deletes a user following a club. - * - * @param userID the ID of the user - * @param clubID the ID of the club - * @returns A Promise that resolves to void or rejects with an error - * @throws Error if the user cannot unfollow the club - * @see Club - * @see User - */ -const deleteUserFollowing = async ( - userID: uuid, - clubID: uuid -): Promise => { - return api - .delete(`/users/${userID}/follower/${clubID}`) - .then((response) => response.data) - .catch((error: AxiosError) => { - console.error(error); - throw new Error('Error unfollowing clubs'); - }); -}; - -export { - getCurrentUser, - createUserTags, - updateUser, - fetchUserFollowing, - createUserFollowing, - deleteUserFollowing -}; diff --git a/frontend/mobile/store/store.ts b/frontend/mobile/store/store.ts index c5805a3cd..031415127 100644 --- a/frontend/mobile/store/store.ts +++ b/frontend/mobile/store/store.ts @@ -1,6 +1,6 @@ +import { baseApi } from '@generatesac/lib'; import { configureStore } from '@reduxjs/toolkit'; import { setupListeners } from '@reduxjs/toolkit/query'; -import { baseApi } from '@sac/lib'; export const store = configureStore({ reducer: { diff --git a/frontend/mobile/tailwind.config.js b/frontend/mobile/tailwind.config.js deleted file mode 100644 index 45f11776e..000000000 --- a/frontend/mobile/tailwind.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - './app/**/*.{js,ts,jsx,tsx,mdx}', - './components/**/*.{js,ts,jsx,tsx,mdx}' - ], - theme: { - extend: { - colors: { - 'card-bg': '#D9D9D9' - } - } - }, - plugins: [] -}; diff --git a/frontend/mobile/types/auth.ts b/frontend/mobile/types/auth.ts deleted file mode 100644 index 30635032e..000000000 --- a/frontend/mobile/types/auth.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type Tokens = { - accessToken: string; - refreshToken: string; -}; diff --git a/frontend/mobile/types/category.ts b/frontend/mobile/types/category.ts deleted file mode 100644 index 619032b79..000000000 --- a/frontend/mobile/types/category.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { z } from 'zod'; - -import { tagSchema } from '@/types/tag'; - -import { rootModelSchema } from './root'; - -const categorySchemaIntermediate = z.object({ - name: z.string().min(1), - tags: z.array(tagSchema) -}); - -const categorySchema = categorySchemaIntermediate.merge(rootModelSchema); -type Category = z.infer; - -export { categorySchema, Category }; diff --git a/frontend/mobile/types/club.ts b/frontend/mobile/types/club.ts deleted file mode 100644 index 2bc70ce0a..000000000 --- a/frontend/mobile/types/club.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -const clubSchema = z.object({ - name: z.string().max(255), - preview: z.string().max(255), - description: z.string().max(255), - num_members: z.number(), - is_recruiting: z.boolean(), - recruitment_cycle: z.enum(['fall', 'spring', 'fallSpring', 'always']), - recruitment_type: z.enum(['unrestricted', 'tryout', 'application']), - application_link: z.string().max(255), - logo: z.string().max(255).optional() -}); - -const Club = clubSchema.merge(rootModelSchema); -export type Club = z.infer; diff --git a/frontend/mobile/types/contact.ts b/frontend/mobile/types/contact.ts deleted file mode 100644 index 5084d8d96..000000000 --- a/frontend/mobile/types/contact.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -// TODO: each one needs a svg icons -const ContactTypeValues = [ - // 'facebook', - // 'instagram', - // 'twitter', - // 'linkedin', - // 'youtube', - // 'github', - 'slack', - // 'discord', - 'email' - // 'customSite' -] as const; - -export type ContactType = (typeof ContactTypeValues)[number]; - -const contactSchema = z.object({ - type: z.enum(ContactTypeValues), - content: z.string().max(255) -}); - -const Contact = contactSchema.merge(rootModelSchema); -export type Contact = z.infer; diff --git a/frontend/mobile/types/error.ts b/frontend/mobile/types/error.ts deleted file mode 100644 index aa50e46ac..000000000 --- a/frontend/mobile/types/error.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type ErrorResponse = { - error: string; -}; diff --git a/frontend/mobile/types/event.ts b/frontend/mobile/types/event.ts deleted file mode 100644 index 71d0f24b3..000000000 --- a/frontend/mobile/types/event.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -const eventSchema = z.object({ - name: z.string().max(255), - preview: z.string().max(255), - content: z.string().max(255), - start_time: z.date(), - end_time: z.date(), - location: z.string().max(255), - meeting_link: z.string().max(255).optional(), - event_type: z.enum(['open', 'membersOnly']), - is_recurring: z.boolean(), - host: z.string().max(255) -}); - -const Event = eventSchema.merge(rootModelSchema); -export type Event = z.infer; diff --git a/frontend/mobile/types/faq.ts b/frontend/mobile/types/faq.ts deleted file mode 100644 index 65b06e44c..000000000 --- a/frontend/mobile/types/faq.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type FAQ = { - club_name: string; - question: string; - answer: string; -}; diff --git a/frontend/mobile/types/item.ts b/frontend/mobile/types/item.ts deleted file mode 100644 index 763910602..000000000 --- a/frontend/mobile/types/item.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type Item = { - label: string; - value: string; -}; diff --git a/frontend/mobile/types/root.ts b/frontend/mobile/types/root.ts deleted file mode 100644 index 4003c9d2b..000000000 --- a/frontend/mobile/types/root.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -export const rootModelSchema = z.object({ - id: z.string().uuid(), - created_at: z.date(), - updated_at: z.date() -}); diff --git a/frontend/mobile/types/tag.ts b/frontend/mobile/types/tag.ts deleted file mode 100644 index 9bf3ba92f..000000000 --- a/frontend/mobile/types/tag.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -const tagIntermediate = z.object({ - name: z.string().min(1), - category_id: z.string().uuid() -}); - -const tagSchema = tagIntermediate.merge(rootModelSchema); -type Tag = z.infer; - -export { tagSchema, Tag }; diff --git a/frontend/mobile/types/user.ts b/frontend/mobile/types/user.ts deleted file mode 100644 index c0521aba8..000000000 --- a/frontend/mobile/types/user.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { z } from 'zod'; - -import { rootModelSchema } from './root'; - -export const userSchema = z.object({ - role: z.enum(['super', 'student']), - email: z.string().email(), - first_name: z.string().min(3), - last_name: z.string().min(3), - created_at: z.date(), - updated_at: z.date(), - is_verified: z.boolean() -}); - -export const collegeSchema = z.enum([ - 'CAMD', - 'DMSB', - 'KCCS', - 'CE', - 'BCHS', - 'SL', - 'CPS', - 'CS', - 'CSSH' -]); -export type College = z.infer; - -export const yearSchema = z.enum(['1', '2', '3', '4', '5']); -export type Year = z.infer; - -const User = userSchema.merge(rootModelSchema); -export type User = z.infer; diff --git a/frontend/mobile/types/uuid.ts b/frontend/mobile/types/uuid.ts deleted file mode 100644 index d0ea1399d..000000000 --- a/frontend/mobile/types/uuid.ts +++ /dev/null @@ -1 +0,0 @@ -export type uuid = string; diff --git a/frontend/mobile/yarn.lock b/frontend/mobile/yarn.lock index ebb196877..e7048ffdc 100644 --- a/frontend/mobile/yarn.lock +++ b/frontend/mobile/yarn.lock @@ -3,19 +3,9 @@ "@0no-co/graphql.web@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.6.tgz#3def68bbaf654a301bd910ce3744506cad97ab9a" - integrity sha512-KZ7TnwMcQJcFgzjoY623AVxtlDQonkqp3rSz0wb15/jHPyU1v5gynUibEpuutDeoyGJ5Tp+FwxjGyDGDwq3vIw== - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.7.tgz#c7a762c887b3482a79ffa68f63de5e96059a62e4" + integrity sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ== "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -32,7 +22,7 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -40,26 +30,26 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" - integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.24.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.4" + "@babel/generator" "^7.24.5" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.4" - "@babel/parser" "^7.24.4" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -67,9 +57,9 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" - integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" + integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -84,12 +74,12 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.18.7", "@babel/generator@^7.20.0", "@babel/generator@^7.20.5", "@babel/generator@^7.23.0", "@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== +"@babel/generator@^7.20.0", "@babel/generator@^7.20.5", "@babel/generator@^7.23.0", "@babel/generator@^7.24.5", "@babel/generator@^7.7.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== dependencies: - "@babel/types" "^7.24.0" + "@babel/types" "^7.24.5" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -101,14 +91,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== @@ -119,22 +102,22 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" - integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" + integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.24.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": +"@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== @@ -143,10 +126,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" - integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -159,7 +142,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": +"@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== @@ -174,19 +157,12 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== +"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" + integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== dependencies: - "@babel/types" "^7.23.0" - -"@babel/helper-module-imports@7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.24.5" "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": version "7.24.3" @@ -195,16 +171,16 @@ dependencies: "@babel/types" "^7.24.0" -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== +"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -213,10 +189,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" - integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" @@ -236,12 +212,12 @@ "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== +"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" @@ -250,22 +226,22 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== +"@babel/helper-split-export-declaration@^7.22.6", "@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.5" -"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.23.4": +"@babel/helper-string-parser@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== "@babel/helper-validator-option@^7.23.5": version "7.23.5" @@ -273,69 +249,37 @@ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" + integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" + "@babel/helper-function-name" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/types" "^7.24.5" -"@babel/helpers@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" - integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== dependencies: "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" "@babel/highlight@^7.10.4", "@babel/highlight@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.24.5" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" - integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.20.7" @@ -347,7 +291,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -396,7 +340,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0": +"@babel/plugin-proposal-object-rest-spread@^7.20.0": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -424,11 +368,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -443,20 +382,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-decorators@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" @@ -464,7 +396,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -485,28 +417,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.24.1": +"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz#875c25e3428d7896c87589765fc8b9d32f24bd8d" integrity sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -520,7 +438,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1", "@babel/plugin-syntax-jsx@^7.7.2": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== @@ -548,7 +466,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -576,7 +494,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -590,39 +508,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz" - integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-arrow-functions@^7.0.0-0", "@babel/plugin-transform-arrow-functions@^7.24.1": +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.0.0-0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.24.1": +"@babel/plugin-transform-async-to-generator@^7.20.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== @@ -631,52 +524,28 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" + integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" - integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" - integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== +"@babel/plugin-transform-classes@^7.0.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" + integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.1": +"@babel/plugin-transform-computed-properties@^7.0.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== @@ -684,45 +553,14 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" - integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== +"@babel/plugin-transform-destructuring@^7.20.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" + integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.5" -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-export-namespace-from@^7.22.11", "@babel/plugin-transform-export-namespace-from@^7.24.1": +"@babel/plugin-transform-export-namespace-from@^7.22.11": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== @@ -730,7 +568,7 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.24.1": +"@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc" integrity sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ== @@ -738,15 +576,7 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-flow" "^7.24.1" -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.24.1": +"@babel/plugin-transform-function-name@^7.0.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== @@ -755,44 +585,13 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.24.1": +"@babel/plugin-transform-literals@^7.0.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" @@ -802,25 +601,7 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== @@ -828,14 +609,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": +"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== @@ -843,68 +617,33 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-transform-object-rest-spread@^7.12.13": - version "7.23.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz" - integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== - dependencies: - "@babel/compat-data" "^7.23.3" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.23.3" - -"@babel/plugin-transform-object-rest-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" - integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" + integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== dependencies: "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.5" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== +"@babel/plugin-transform-optional-chaining@^7.0.0-0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" + integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" - -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.0.0-0", "@babel/plugin-transform-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" - integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.15", "@babel/plugin-transform-parameters@^7.23.3", "@babel/plugin-transform-parameters@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" - integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.15", "@babel/plugin-transform-parameters@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" + integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" -"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.24.1": +"@babel/plugin-transform-private-methods@^7.22.5": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== @@ -912,23 +651,16 @@ "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-property-in-object@^7.22.11", "@babel/plugin-transform-private-property-in-object@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" - integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" + integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" @@ -944,11 +676,11 @@ "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz#a21d866d8167e752c6a7c4555dba8afcdfce6268" - integrity sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz#22cc7572947895c8e4cd034462e65d8ecf857756" + integrity sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-react-jsx-source@^7.0.0": version "7.24.1" @@ -976,21 +708,6 @@ "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - regenerator-transform "^0.15.2" - -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-transform-runtime@^7.0.0": version "7.24.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" @@ -1003,21 +720,14 @@ babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz" - integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-shorthand-properties@^7.0.0-0", "@babel/plugin-transform-shorthand-properties@^7.24.1": +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.0.0-0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.24.1": +"@babel/plugin-transform-spread@^7.0.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== @@ -1025,60 +735,31 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.24.1": +"@babel/plugin-transform-sticky-regex@^7.0.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz" - integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-template-literals@^7.0.0-0", "@babel/plugin-transform-template-literals@^7.24.1": +"@babel/plugin-transform-template-literals@^7.0.0-0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" - integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-transform-typescript@^7.24.1", "@babel/plugin-transform-typescript@^7.5.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15" - integrity sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz#bcba979e462120dc06a75bd34c473a04781931b8" + integrity sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-typescript" "^7.24.1" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.24.1": +"@babel/plugin-transform-unicode-regex@^7.0.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== @@ -1086,101 +767,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/preset-env@^7.20.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" - integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== - dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.4" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.1" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.1" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.1" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - "@babel/plugin-transform-parameters" "^7.24.1" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.1" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.1" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" - semver "^6.3.1" - "@babel/preset-flow@^7.13.13": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.1.tgz#da7196c20c2d7dd4e98cfd8b192fe53b5eb6f0bb" @@ -1190,15 +776,6 @@ "@babel/helper-validator-option" "^7.23.5" "@babel/plugin-transform-flow-strip-types" "^7.24.1" -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - "@babel/preset-react@^7.22.15": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" @@ -1211,7 +788,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.22.5" "@babel/plugin-transform-react-pure-annotations" "^7.24.1" -"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7": +"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7", "@babel/preset-typescript@^7.23.0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== @@ -1238,10 +815,10 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.23.8", "@babel/runtime@^7.24.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.13": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" @@ -1270,19 +847,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.20.0", "@babel/traverse@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" - integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== +"@babel/traverse@^7.20.0", "@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== dependencies: - "@babel/code-frame" "^7.24.1" - "@babel/generator" "^7.24.1" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" debug "^4.3.1" globals "^11.1.0" @@ -1294,22 +871,13 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" - integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== +"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.18.6", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1317,6 +885,69 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@blocknote/core@^0.12.4": + version "0.12.4" + resolved "https://registry.yarnpkg.com/@blocknote/core/-/core-0.12.4.tgz#339e01a7a7b34caab322e02abe78c2940bf9e619" + integrity sha512-njnrEZUZ7sPm0CIwxSfFfnP1IgB+H+Kvk5+2Etr3tozuQgwdQ0X6wn6E+MTCP97Nxl/aPA7S1F/XUoy1L8ICXQ== + dependencies: + "@tiptap/core" "^2.0.3" + "@tiptap/extension-bold" "^2.0.3" + "@tiptap/extension-code" "^2.0.3" + "@tiptap/extension-collaboration" "^2.0.3" + "@tiptap/extension-collaboration-cursor" "^2.0.3" + "@tiptap/extension-dropcursor" "^2.0.3" + "@tiptap/extension-gapcursor" "^2.0.3" + "@tiptap/extension-hard-break" "^2.0.3" + "@tiptap/extension-history" "^2.0.3" + "@tiptap/extension-horizontal-rule" "^2.0.3" + "@tiptap/extension-italic" "^2.0.3" + "@tiptap/extension-link" "^2.0.3" + "@tiptap/extension-paragraph" "^2.0.3" + "@tiptap/extension-strike" "^2.0.3" + "@tiptap/extension-table-cell" "^2.0.3" + "@tiptap/extension-table-header" "^2.0.3" + "@tiptap/extension-table-row" "^2.0.3" + "@tiptap/extension-text" "^2.0.3" + "@tiptap/extension-underline" "^2.0.3" + "@tiptap/pm" "^2.0.3" + hast-util-from-dom "^4.2.0" + prosemirror-model "^1.18.3" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.3.4" + prosemirror-transform "^1.7.2" + prosemirror-view "^1.31.4" + rehype-format "^5.0.0" + rehype-parse "^8.0.4" + rehype-remark "^9.1.2" + rehype-stringify "^9.0.3" + remark-gfm "^3.0.1" + remark-parse "^10.0.1" + remark-rehype "^10.1.0" + remark-stringify "^10.0.2" + unified "^10.1.2" + uuid "^8.3.2" + y-prosemirror "1.2.1" + y-protocols "^1.0.5" + yjs "^13.6.1" + +"@blocknote/react@^0.12.4": + version "0.12.4" + resolved "https://registry.yarnpkg.com/@blocknote/react/-/react-0.12.4.tgz#572f8d6ddf500fde17743cbe2b04af8ba457c7da" + integrity sha512-cgtQmPUhRmWwHifskhfuwq7SflXTagilblzkfKmkvHYsldeH2WcOHGbgskX5bdx7ulvryrLnTSbXszLuTGd5Hw== + dependencies: + "@blocknote/core" "^0.12.4" + "@floating-ui/react" "^0.26.4" + "@mantine/core" "^7.7.1" + "@mantine/hooks" "^7.7.1" + "@mantine/utils" "^6.0.21" + "@tiptap/core" "^2.0.3" + "@tiptap/react" "^2.0.3" + lodash.merge "^4.6.2" + react "^18" + react-dom "^18.2.0" + react-icons "^4.3.1" + use-prefers-color-scheme "^1.1.3" + "@egjs/hammerjs@^2.0.17": version "2.0.17" resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" @@ -1366,28 +997,28 @@ mv "~2" safe-json-stringify "~1" -"@expo/cli@0.17.8": - version "0.17.8" - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.17.8.tgz#4abe0d8c604b73a6e1d0a10f34e993cbf1cbad42" - integrity sha512-yfkoghCltbGPDbRI71Qu3puInjXx4wO82+uhW82qbWLvosfIN7ep5Gr0Lq54liJpvlUG6M0IXM1GiGqcCyP12w== +"@expo/cli@0.18.10": + version "0.18.10" + resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.18.10.tgz#b3dc9061af1a501576761e65087ffba117f71d45" + integrity sha512-cuAE060tcX4Mn+sF+tGAchGDsTNzwCUB7ioFGB3OrvxoU3idsqZJPs6xMt5Utuuy7QDGPnOn68H0vC4kDsXkUQ== dependencies: "@babel/runtime" "^7.20.0" "@expo/code-signing-certificates" "0.0.5" - "@expo/config" "~8.5.0" - "@expo/config-plugins" "~7.8.0" + "@expo/config" "~9.0.0-beta.0" + "@expo/config-plugins" "~8.0.0-beta.0" "@expo/devcert" "^1.0.0" - "@expo/env" "~0.2.2" - "@expo/image-utils" "^0.4.0" - "@expo/json-file" "^8.2.37" - "@expo/metro-config" "~0.17.0" + "@expo/env" "~0.3.0" + "@expo/image-utils" "^0.5.0" + "@expo/json-file" "^8.3.0" + "@expo/metro-config" "~0.18.0" "@expo/osascript" "^2.0.31" - "@expo/package-manager" "^1.1.1" + "@expo/package-manager" "^1.5.0" "@expo/plist" "^0.1.0" - "@expo/prebuild-config" "6.7.4" + "@expo/prebuild-config" "7.0.3" "@expo/rudder-sdk-node" "1.1.1" - "@expo/spawn-async" "1.5.0" + "@expo/spawn-async" "^1.7.2" "@expo/xcpretty" "^4.3.0" - "@react-native/dev-middleware" "^0.73.6" + "@react-native/dev-middleware" "~0.74.75" "@urql/core" "2.3.6" "@urql/exchange-retry" "0.3.0" accepts "^1.3.8" @@ -1400,6 +1031,7 @@ connect "^3.7.0" debug "^4.3.4" env-editor "^0.4.1" + fast-glob "^3.3.2" find-yarn-workspace-root "~2.0.0" form-data "^3.0.1" freeport-async "2.0.0" @@ -1417,7 +1049,6 @@ lodash.debounce "^4.0.8" md5hex "^1.0.0" minimatch "^3.0.4" - minipass "3.3.6" node-fetch "^2.6.7" node-forge "^1.3.1" npm-package-arg "^7.0.0" @@ -1433,7 +1064,7 @@ resolve "^1.22.2" resolve-from "^5.0.0" resolve.exports "^2.0.2" - semver "^7.5.3" + semver "^7.6.0" send "^0.18.0" slugify "^1.3.4" source-map-support "~0.5.21" @@ -1456,48 +1087,46 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@7.8.4", "@expo/config-plugins@~7.8.0", "@expo/config-plugins@~7.8.2": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.8.4.tgz#533b5d536c1dc8b5544d64878b51bda28f2e1a1f" - integrity sha512-hv03HYxb/5kX8Gxv/BTI8TLc9L06WzqAfHRRXdbar4zkLcP2oTzvsLEF4/L/TIpD3rsnYa0KU42d0gWRxzPCJg== +"@expo/config-plugins@8.0.4", "@expo/config-plugins@~8.0.0-beta.0": + version "8.0.4" + resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.4.tgz#1e781cd971fab27409ed2f8d621db6d29cce3036" + integrity sha512-Hi+xuyNWE2LT4LVbGttHJgl9brnsdWAhEB42gWKb5+8ae86Nr/KwUBQJsJppirBYTeLjj5ZlY0glYnAkDa2jqw== dependencies: - "@expo/config-types" "^50.0.0-alpha.1" - "@expo/fingerprint" "^0.6.0" + "@expo/config-types" "^51.0.0-unreleased" "@expo/json-file" "~8.3.0" "@expo/plist" "^0.1.0" "@expo/sdk-runtime-versions" "^1.0.0" - "@react-native/normalize-color" "^2.0.0" chalk "^4.1.2" debug "^4.3.1" find-up "~5.0.0" getenv "^1.0.0" glob "7.1.6" resolve-from "^5.0.0" - semver "^7.5.3" + semver "^7.5.4" slash "^3.0.0" slugify "^1.6.6" xcode "^3.0.1" xml2js "0.6.0" -"@expo/config-types@^50.0.0", "@expo/config-types@^50.0.0-alpha.1": - version "50.0.0" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.0.tgz#b534d3ec997ec60f8af24f6ad56244c8afc71a0b" - integrity sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw== +"@expo/config-types@^51.0.0-unreleased": + version "51.0.0" + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-51.0.0.tgz#f5df238cd1237d7e4d9cc8217cdef3383c2a00cf" + integrity sha512-acn03/u8mQvBhdTQtA7CNhevMltUhbSrpI01FYBJwpVntufkU++ncQujWKlgY/OwIajcfygk1AY4xcNZ5ImkRA== -"@expo/config@8.5.4", "@expo/config@~8.5.0": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.5.4.tgz#bb5eb06caa36e4e35dc8c7647fae63e147b830ca" - integrity sha512-ggOLJPHGzJSJHVBC1LzwXwR6qUn8Mw7hkc5zEKRIdhFRuIQ6s2FE4eOvP87LrNfDF7eZGa6tJQYsiHSmZKG+8Q== +"@expo/config@9.0.1", "@expo/config@~9.0.0-beta.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-9.0.1.tgz#e7b79de5af29d5ab2a98a62c3cda31f03bd75827" + integrity sha512-0tjaXBstTbXmD4z+UMFBkh2SZFwilizSQhW6DlaTMnPG5ezuw93zSFEWAuEC3YzkpVtNQTmYzxAYjxwh6seOGg== dependencies: "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "~7.8.2" - "@expo/config-types" "^50.0.0" - "@expo/json-file" "^8.2.37" + "@expo/config-plugins" "~8.0.0-beta.0" + "@expo/config-types" "^51.0.0-unreleased" + "@expo/json-file" "^8.3.0" getenv "^1.0.0" glob "7.1.6" require-from-string "^2.0.2" resolve-from "^5.0.0" - semver "7.5.3" + semver "^7.6.0" slugify "^1.3.4" sucrase "3.34.0" @@ -1520,10 +1149,10 @@ tmp "^0.0.33" tslib "^2.4.0" -"@expo/env@~0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@expo/env/-/env-0.2.3.tgz#59ffe29ffe58f8ee9ee99581a6cb6e003831d469" - integrity sha512-a+uJ/e6MAVxPVVN/HbXU5qxzdqrqDwNQYxCfxtAufgmd5VZj54e5f3TJA3LEEUW3pTSZR8xK0H0EtVN297AZnw== +"@expo/env@~0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@expo/env/-/env-0.3.0.tgz#a66064e5656e0e48197525f47f3398034fdf579e" + integrity sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q== dependencies: chalk "^4.0.0" debug "^4.3.4" @@ -1531,25 +1160,12 @@ dotenv-expand "~11.0.6" getenv "^1.0.0" -"@expo/fingerprint@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.6.0.tgz#77366934673d4ecea37284109b4dd67f9e6a7487" - integrity sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA== +"@expo/image-utils@^0.5.0": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.5.1.tgz#06fade141facebcd8431355923d30f3839309942" + integrity sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A== dependencies: - "@expo/spawn-async" "^1.5.0" - chalk "^4.1.2" - debug "^4.3.4" - find-up "^5.0.0" - minimatch "^3.0.4" - p-limit "^3.1.0" - resolve-from "^5.0.0" - -"@expo/image-utils@^0.4.0": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.4.1.tgz#78c54b8aaa974d0ac37fee5285683b54ff161b2c" - integrity sha512-EZb+VHSmw+a5s2hS9qksTcWylY0FDaIAVufcxoaRS9tHIXLjW5zcKW7Rhj9dSEbZbRVy9yXXdHKa3GQdUQIOFw== - dependencies: - "@expo/spawn-async" "1.5.0" + "@expo/spawn-async" "^1.7.2" chalk "^4.0.0" fs-extra "9.0.0" getenv "^1.0.0" @@ -1557,32 +1173,31 @@ node-fetch "^2.6.0" parse-png "^2.1.0" resolve-from "^5.0.0" - semver "7.3.2" + semver "^7.6.0" tempy "0.3.0" -"@expo/json-file@^8.2.37", "@expo/json-file@~8.3.0": - version "8.3.0" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.0.tgz#fc84af77b532a4e9bfb5beafd0e3b7f692b6bd7e" - integrity sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g== +"@expo/json-file@^8.3.0", "@expo/json-file@~8.3.0": + version "8.3.3" + resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.3.tgz#7926e3592f76030ce63d6b1308ac8f5d4d9341f4" + integrity sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A== dependencies: "@babel/code-frame" "~7.10.4" json5 "^2.2.2" write-file-atomic "^2.3.0" -"@expo/metro-config@0.17.6", "@expo/metro-config@~0.17.0": - version "0.17.6" - resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.17.6.tgz#f1f4ef056aa357c1dba3841de465f5d319f17216" - integrity sha512-WaC1C+sLX/Wa7irwUigLhng3ckmXIEQefZczB8DfYmleV6uhfWWo2kz/HijFBpV7FKs2cW6u8J/aBQpFkxlcqg== +"@expo/metro-config@0.18.3", "@expo/metro-config@~0.18.0": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.18.3.tgz#fa198b9bf806df44fd7684f1df9af2535c107aa8" + integrity sha512-E4iW+VT/xHPPv+t68dViOsW7egtGIr+sRElcym0iGpC4goLz9WBux/xGzWgxvgvvHEWa21uSZQPM0jWla0OZXg== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.5" "@babel/parser" "^7.20.0" "@babel/types" "^7.20.0" - "@expo/config" "~8.5.0" - "@expo/env" "~0.2.2" + "@expo/config" "~9.0.0-beta.0" + "@expo/env" "~0.3.0" "@expo/json-file" "~8.3.0" "@expo/spawn-async" "^1.7.2" - babel-preset-fbjs "^3.4.0" chalk "^4.1.0" debug "^4.3.2" find-yarn-workspace-root "~2.0.0" @@ -1593,28 +1208,27 @@ lightningcss "~1.19.0" postcss "~8.4.32" resolve-from "^5.0.0" - sucrase "3.34.0" -"@expo/metro-runtime@3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-3.1.3.tgz#e29503808bd8ffeb706ef9a17b644230a379f298" - integrity sha512-u1CaQJJlSgvxBB5NJ6YMVvSDTTRzjT71dHpEBnKPZhpFv5ebVry52FZ2sEeEEA6mHG5zGxWXmHImW3hNKHh8EA== +"@expo/metro-runtime@3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-3.2.1.tgz#bbab2ca9d0c8d256172eb4688123af6be67c7674" + integrity sha512-L7xNo5SmK+rcuXDm/+VBBImpA7FZsVB+m/rNr3fNl5or+1+yrZe99ViF7LZ8DOoVqAqcb4aCAXvGrP2JNYo1/Q== "@expo/osascript@^2.0.31": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.1.0.tgz#c407dfe839b5e898829d31e6accd962f91adac1c" - integrity sha512-bOhuFnlRaS7CU33+rFFIWdcET/Vkyn1vsN8BYFwCDEF5P1fVVvYN7bFOsQLTMD3nvi35C1AGmtqUr/Wfv8Xaow== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.1.2.tgz#ceb7faf260e28a9cd84b834a42d81a18f429cf93" + integrity sha512-/ugqDG+52uzUiEpggS9GPdp9g0U9EQrXcTdluHDmnlGmR2nV/F83L7c+HCUyPnf77QXwkr8gQk16vQTbxBQ5eA== dependencies: - "@expo/spawn-async" "^1.5.0" + "@expo/spawn-async" "^1.7.2" exec-async "^2.2.0" -"@expo/package-manager@^1.1.1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.4.2.tgz#8c12a9163c5ff7c7cc89806c4b75cff4974c57fc" - integrity sha512-LKdo/6y4W7llZ6ghsg1kdx2CeH/qR/c6QI/JI8oPUvppsZoeIYjSkdflce978fAMfR8IXoi0wt0jA2w0kWpwbg== +"@expo/package-manager@^1.5.0": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.5.2.tgz#6015963669977a188bbbac930aa0dc103162ee73" + integrity sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA== dependencies: - "@expo/json-file" "^8.2.37" - "@expo/spawn-async" "^1.5.0" + "@expo/json-file" "^8.3.0" + "@expo/spawn-async" "^1.7.2" ansi-regex "^5.0.0" chalk "^4.0.0" find-up "^5.0.0" @@ -1627,28 +1241,29 @@ sudo-prompt "9.1.1" "@expo/plist@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.0.tgz#eabc95f951d14e10c87fd0443ee01d567371f058" - integrity sha512-xWD+8vIFif0wKyuqe3fmnmnSouXYucciZXFzS0ZD5OV9eSAS1RGQI5FaGGJ6zxJ4mpdy/4QzbLdBjnYE5vxA0g== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.3.tgz#b4fbee2c4f7a88512a4853d85319f4d95713c529" + integrity sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg== dependencies: "@xmldom/xmldom" "~0.7.7" base64-js "^1.2.3" xmlbuilder "^14.0.0" -"@expo/prebuild-config@6.7.4": - version "6.7.4" - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-6.7.4.tgz#b3e4c8545d7a101bf1fc263c5b7290abc4635e69" - integrity sha512-x8EUdCa8DTMZ/dtEXjHAdlP+ljf6oSeSKNzhycXiHhpMSMG9jEhV28ocCwc6cKsjK5GziweEiHwvrj6+vsBlhA== - dependencies: - "@expo/config" "~8.5.0" - "@expo/config-plugins" "~7.8.0" - "@expo/config-types" "^50.0.0-alpha.1" - "@expo/image-utils" "^0.4.0" - "@expo/json-file" "^8.2.37" +"@expo/prebuild-config@7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.3.tgz#d7f66745de6f0b17b15ed2f1417f91c6ba0b591b" + integrity sha512-Kvxy/oQzkxwXLvAmwb+ygxuRn4xUUN2+mVJj3KDe4bRVCNyDPs7wlgdokF3twnWjzRZssUzseMkhp+yHPjAEhA== + dependencies: + "@expo/config" "~9.0.0-beta.0" + "@expo/config-plugins" "~8.0.0-beta.0" + "@expo/config-types" "^51.0.0-unreleased" + "@expo/image-utils" "^0.5.0" + "@expo/json-file" "^8.3.0" + "@react-native/normalize-colors" "~0.74.83" debug "^4.3.1" fs-extra "^9.0.0" resolve-from "^5.0.0" - semver "7.5.3" + semver "^7.6.0" xml2js "0.6.0" "@expo/rudder-sdk-node@1.1.1": @@ -1669,34 +1284,29 @@ resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== -"@expo/server@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@expo/server/-/server-0.3.1.tgz#dbdb23af31877aeb35e8ea31a4962e128c8fa920" - integrity sha512-cCKyVA2IR9J4hDFPXzj3L08+Ngd/7z2F+JtdW0NLy03qShXBI5NSEEcaiHtjrgsLXPDe9PBw5Xgsfmxuduyggg== +"@expo/server@^0.4.0": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@expo/server/-/server-0.4.2.tgz#48cad430b78bcfd23ca01494ed991b9b52c23fd3" + integrity sha512-HuXbzXTJh1/JG8FRuxcBqTNEuiriMhNhvh68CNCUXMR/s1f29DmZPBq+/IbG8yk+TkXvKIHjmUGAqqz/ddfyvA== dependencies: - "@remix-run/node" "^1.19.3" + "@remix-run/node" "^2.7.2" abort-controller "^3.0.0" debug "^4.3.4" source-map-support "~0.5.21" -"@expo/spawn-async@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.5.0.tgz#799827edd8c10ef07eb1a2ff9dcfe081d596a395" - integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== - dependencies: - cross-spawn "^6.0.5" - -"@expo/spawn-async@^1.5.0", "@expo/spawn-async@^1.7.2": +"@expo/spawn-async@^1.7.2": version "1.7.2" resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.7.2.tgz#fcfe66c3e387245e72154b1a7eae8cada6a47f58" integrity sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew== dependencies: cross-spawn "^7.0.3" -"@expo/vector-icons@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-14.0.0.tgz#48ce0aa5c05873b07c0c78bfe16c870388f4de9a" - integrity sha512-5orm59pdnBQlovhU9k4DbjMUZBHNlku7IRgFY56f7pcaaCnXq9yaLJoOQl9sMwNdFzf4gnkTyHmR5uN10mI9rA== +"@expo/vector-icons@^14.0.0", "@expo/vector-icons@^14.0.2": + version "14.0.2" + resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-14.0.2.tgz#f7f6c4cb5ef356d1171d2b4e059217556738fd3b" + integrity sha512-70LpmXQu4xa8cMxjp1fydgRPsalefnHaXLzIwaHMEzcZhnyjw2acZz8azRrZOslPVAWlxItOa2Dd7WtD/kI+CA== + dependencies: + prop-types "^15.8.1" "@expo/xcpretty@^4.3.0": version "4.3.1" @@ -1708,25 +1318,61 @@ find-up "^5.0.0" js-yaml "^4.1.0" +"@floating-ui/core@^1.0.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.1.tgz#a4e6fef1b069cda533cbc7a4998c083a37f37573" + integrity sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A== + dependencies: + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/dom@^1.0.0": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.5.tgz#323f065c003f1d3ecf0ff16d2c2c4d38979f4cb9" + integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/react-dom@^2.0.0": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.9.tgz#264ba8b061000baa132b5910f0427a6acf7ad7ce" + integrity sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.4", "@floating-ui/react@^0.26.9": + version "0.26.13" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.13.tgz#81dc03b08ec8db40c48bf2e1f2a2e1a5e9a1997a" + integrity sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@floating-ui/utils" "^0.2.0" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.0": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5" + integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== + "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@gorhom/bottom-sheet@^4": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-4.6.1.tgz#e45e2183246e338cf732fe4f8f2c91875b22ddce" - integrity sha512-sXqsYqX1/rAbmCC5fb9o6hwSF3KXriC0EGUGvLlhFvjaEEMBrRKFTNndiluRK1HmpUzazVaYdTm/lLkSiA2ooQ== - dependencies: - "@gorhom/portal" "1.0.14" - invariant "^2.2.4" - -"@gorhom/portal@1.0.14": - version "1.0.14" - resolved "https://registry.yarnpkg.com/@gorhom/portal/-/portal-1.0.14.tgz#1953edb76aaba80fb24021dc774550194a18e111" - integrity sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A== - dependencies: - nanoid "^3.3.1" +"@generatesac/lib@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@generatesac/lib/-/lib-0.0.1.tgz#ffcbed9a98669ee46d8c639c4d2cf178ec21b1b8" + integrity sha512-E7Vw3fZlRdxdBUl06H4s/0IzFb7BCAAWP/iHwA/ju0p4ILy0f6mq2hpWvIDqRFLri6NFWdO3eCd23yjN1VQFNQ== + dependencies: + "@blocknote/core" "^0.12.4" + "@blocknote/react" "^0.12.4" + "@reduxjs/toolkit" "^2.2.3" + "@tiptap/pm" "^2.3.1" + react "^18.2.0" + react-dom "^18.2.0" + react-icons "^5.2.1" + react-redux "^9.1.2" + zod "^3.23.6" "@graphql-typed-document-node/core@^3.1.0": version "3.2.0" @@ -1764,18 +1410,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - "@isaacs/ttlcache@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" @@ -2047,6 +1681,28 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mantine/core@^7.7.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@mantine/core/-/core-7.9.1.tgz#778a9117267ef7db37e6f18dfff47be5d322fbc9" + integrity sha512-UXK11t1fAQ2ROQ9HTIZfyU52XdwS8sFJ2SRUh5uHMWSahJo3wTdKzaCvYN7wg+ONM9p6ENT0hC0dfv5qXoKU4w== + dependencies: + "@floating-ui/react" "^0.26.9" + clsx "2.1.0" + react-number-format "^5.3.1" + react-remove-scroll "^2.5.7" + react-textarea-autosize "8.5.3" + type-fest "^4.12.0" + +"@mantine/hooks@^7.7.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-7.9.1.tgz#9946432d017d56afe28f3980d1c64af0153a2128" + integrity sha512-nb2Ar+2HfGxLjGZgObapeUeqcQsUWJ+rvj4X2KNTUy3+YpvLIMD3CqREowWHF7/5OTGh4BCyBqQNZ9JFpnMeHQ== + +"@mantine/utils@^6.0.21": + version "6.0.21" + resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.21.tgz#6185506e91cba3e308aaa8ea9ababc8e767995d6" + integrity sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ== + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -2091,16 +1747,16 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - "@pkgr/core@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@popperjs/core@^2.9.0": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + "@radix-ui/react-compose-refs@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" @@ -2116,45 +1772,45 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.0" -"@react-native-community/cli-clean@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.4.tgz#53c07c6f2834a971dc40eab290edcf8ccc5d1e00" - integrity sha512-nS1BJ+2Z+aLmqePxB4AYgJ+C/bgQt02xAgSYtCUv+lneRBGhL2tHRrK8/Iolp0y+yQoUtHHf4txYi90zGXLVfw== +"@react-native-community/cli-clean@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.6.tgz#87c7ad8746c38dab0fe7b3c6ff89d44351d5d943" + integrity sha512-cBwJTwl0NyeA4nyMxbhkWZhxtILYkbU3TW3k8AXLg+iGphe0zikYMGB3T+haTvTc6alTyEFwPbimk9bGIqkjAQ== dependencies: - "@react-native-community/cli-tools" "13.6.4" + "@react-native-community/cli-tools" "13.6.6" chalk "^4.1.2" execa "^5.0.0" fast-glob "^3.3.2" -"@react-native-community/cli-config@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.6.4.tgz#3004c7bca55cb384b3a99c38c1a48dad24533237" - integrity sha512-GGK415WoTx1R9FXtfb/cTnan9JIWwSm+a5UCuFd6+suzS0oIt1Md1vCzjNh6W1CK3b43rZC2e+3ZU7Ljd7YtyQ== +"@react-native-community/cli-config@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.6.6.tgz#69f590694b3a079c74f781baab3b762db74f5dbd" + integrity sha512-mbG425zCKr8JZhv/j11382arezwS/70juWMsn8j2lmrGTrP1cUdW0MF15CCIFtJsqyK3Qs+FTmqttRpq81QfSg== dependencies: - "@react-native-community/cli-tools" "13.6.4" + "@react-native-community/cli-tools" "13.6.6" chalk "^4.1.2" cosmiconfig "^5.1.0" deepmerge "^4.3.0" fast-glob "^3.3.2" joi "^17.2.1" -"@react-native-community/cli-debugger-ui@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.4.tgz#3881b9cfe14e66b3ee827a84f19ca9d0283fd764" - integrity sha512-9Gs31s6tA1kuEo69ay9qLgM3x2gsN/RI994DCUKnFSW+qSusQJyyrmfllR2mGU3Wl1W09/nYpIg87W9JPf5y4A== +"@react-native-community/cli-debugger-ui@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.6.tgz#ac021ebd795b0fd66fb52a8987d1d41c5a4b8cb3" + integrity sha512-Vv9u6eS4vKSDAvdhA0OiQHoA7y39fiPIgJ6biT32tN4avHDtxlc6TWZGiqv7g98SBvDWvoVAmdPLcRf3kU+c8g== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-doctor@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.6.4.tgz#07e5c2f163807e61ce0ba12901903e591177e3d3" - integrity sha512-lWOXCISH/cHtLvO0cWTr+IPSzA54FewVOw7MoCMEvWusH+1n7c3hXTAve78mLozGQ7iuUufkHFWwKf3dzOkflQ== +"@react-native-community/cli-doctor@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.6.6.tgz#ac0febff05601d9b86af3e03460e1a6b0a1d33a5" + integrity sha512-TWZb5g6EmQe2Ua2TEWNmyaEayvlWH4GmdD9ZC+p8EpKFpB1NpDGMK6sXbpb42TDvwZg5s4TDRplK0PBEA/SVDg== dependencies: - "@react-native-community/cli-config" "13.6.4" - "@react-native-community/cli-platform-android" "13.6.4" - "@react-native-community/cli-platform-apple" "13.6.4" - "@react-native-community/cli-platform-ios" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" + "@react-native-community/cli-config" "13.6.6" + "@react-native-community/cli-platform-android" "13.6.6" + "@react-native-community/cli-platform-apple" "13.6.6" + "@react-native-community/cli-platform-ios" "13.6.6" + "@react-native-community/cli-tools" "13.6.6" chalk "^4.1.2" command-exists "^1.2.8" deepmerge "^4.3.0" @@ -2168,66 +1824,66 @@ wcwidth "^1.0.1" yaml "^2.2.1" -"@react-native-community/cli-hermes@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.6.4.tgz#6d3e9b5c251461e9bb35b04110544db8a4f5968f" - integrity sha512-VIAufA/2wTccbMYBT9o+mQs9baOEpTxCiIdWeVdkPWKzIwtKsLpDZJlUqj4r4rI66mwjFyQ60PhwSzEJ2ApFeQ== +"@react-native-community/cli-hermes@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.6.6.tgz#590f55f151fec23b55498228f92d100a0e71d474" + integrity sha512-La5Ie+NGaRl3klei6WxKoOxmCUSGGxpOk6vU5pEGf0/O7ky+Ay0io+zXYUZqlNMi/cGpO7ZUijakBYOB/uyuFg== dependencies: - "@react-native-community/cli-platform-android" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" + "@react-native-community/cli-platform-android" "13.6.6" + "@react-native-community/cli-tools" "13.6.6" chalk "^4.1.2" hermes-profile-transformer "^0.0.6" -"@react-native-community/cli-platform-android@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.4.tgz#78ab4c840f4f1f5252ad2fcc5a55f7681ec458cb" - integrity sha512-WhknYwIobKKCqaGCN3BzZEQHTbaZTDiGvcXzevvN867ldfaGdtbH0DVqNunbPoV1RNzeV9qKoQHFdWBkg83tpg== +"@react-native-community/cli-platform-android@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.6.tgz#9e3863cb092709021f11848890bff0fc16fc1609" + integrity sha512-/tMwkBeNxh84syiSwNlYtmUz/Ppc+HfKtdopL/5RB+fd3SV1/5/NPNjMlyLNgFKnpxvKCInQ7dnl6jGHJjeHjg== dependencies: - "@react-native-community/cli-tools" "13.6.4" + "@react-native-community/cli-tools" "13.6.6" chalk "^4.1.2" execa "^5.0.0" fast-glob "^3.3.2" fast-xml-parser "^4.2.4" logkitty "^0.7.1" -"@react-native-community/cli-platform-apple@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.4.tgz#4912eaf519800a957745192718822b94655c8119" - integrity sha512-TLBiotdIz0veLbmvNQIdUv9fkBx7m34ANGYqr5nH7TFxdmey+Z+omoBqG/HGpvyR7d0AY+kZzzV4k+HkYHM/aQ== +"@react-native-community/cli-platform-apple@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.6.tgz#d445fd6ed02c5ae2f43f9c45501e04fee53a2790" + integrity sha512-bOmSSwoqNNT3AmCRZXEMYKz1Jf1l2F86Nhs7qBcXdY/sGiJ+Flng564LOqvdAlVLTbkgz47KjNKCS2pP4Jg0Mg== dependencies: - "@react-native-community/cli-tools" "13.6.4" + "@react-native-community/cli-tools" "13.6.6" chalk "^4.1.2" execa "^5.0.0" fast-glob "^3.3.2" fast-xml-parser "^4.0.12" ora "^5.4.1" -"@react-native-community/cli-platform-ios@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.4.tgz#96ec915c6df23b2b7b7e0d8cb3db7368e448d620" - integrity sha512-8Dlva8RY+MY5nhWAj6V7voG3+JOEzDTJmD0FHqL+4p0srvr9v7IEVcxfw5lKBDIUNd0OMAHNevGA+cyz1J60jg== +"@react-native-community/cli-platform-ios@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.6.tgz#0cd700f36483ca37dda7ec044377f8a926b1df1f" + integrity sha512-vjDnRwhlSN5ryqKTas6/DPkxuouuyFBAqAROH4FR1cspTbn6v78JTZKDmtQy9JMMo7N5vZj1kASU5vbFep9IOQ== dependencies: - "@react-native-community/cli-platform-apple" "13.6.4" + "@react-native-community/cli-platform-apple" "13.6.6" -"@react-native-community/cli-server-api@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.6.4.tgz#6bcec7ae387fc3aeb3e78f62561a91962e6fadf7" - integrity sha512-D2qSuYCFwrrUJUM0SDc9l3lEhU02yjf+9Peri/xhspzAhALnsf6Z/H7BCjddMV42g9/eY33LqiGyN5chr83a+g== +"@react-native-community/cli-server-api@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.6.6.tgz#467993006ef82361cdf7a9817999d5a09e85ca6a" + integrity sha512-ZtCXxoFlM7oDv3iZ3wsrT3SamhtUJuIkX2WePLPlN5bcbq7zimbPm2lHyicNJtpcGQ5ymsgpUWPCNZsWQhXBqQ== dependencies: - "@react-native-community/cli-debugger-ui" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" + "@react-native-community/cli-debugger-ui" "13.6.6" + "@react-native-community/cli-tools" "13.6.6" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.1" nocache "^3.0.1" pretty-format "^26.6.2" serve-static "^1.13.1" - ws "^7.5.1" + ws "^6.2.2" -"@react-native-community/cli-tools@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.4.tgz#ab396604b6dcf215790807fe89656e779b11f0ec" - integrity sha512-N4oHLLbeTdg8opqJozjClmuTfazo1Mt+oxU7mr7m45VCsFgBqTF70Uwad289TM/3l44PP679NRMAHVYqpIRYtQ== +"@react-native-community/cli-tools@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.6.tgz#55c40cbabafbfc56cfb95a4d5fbf73ef60ec3cbc" + integrity sha512-ptOnn4AJczY5njvbdK91k4hcYazDnGtEPrqIwEI+k/CTBHNdb27Rsm2OZ7ye6f7otLBqF8gj/hK6QzJs8CEMgw== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" @@ -2241,26 +1897,26 @@ shell-quote "^1.7.3" sudo-prompt "^9.0.0" -"@react-native-community/cli-types@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.6.4.tgz#e499a3691ee597aa4b93196ff182a4782fae7afb" - integrity sha512-NxGCNs4eYtVC8x0wj0jJ/MZLRy8C+B9l8lY8kShuAcvWTv5JXRqmXjg8uK1aA+xikPh0maq4cc/zLw1roroY/A== +"@react-native-community/cli-types@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.6.6.tgz#b45af119d61888fea1074a7c32ddb093e3f119a9" + integrity sha512-733iaYzlmvNK7XYbnWlMjdE+2k0hlTBJW071af/xb6Bs+hbJqBP9c03FZuYH2hFFwDDntwj05bkri/P7VgSxug== dependencies: joi "^17.2.1" -"@react-native-community/cli@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.4.tgz#dabe2749470a34533e18aada51d97c94b3568307" - integrity sha512-V7rt2N5JY7M4dJFgdNfR164r3hZdR/Z7V54dv85TFQHRbdwF4QrkG+GeagAU54qrkK/OU8OH3AF2+mKuiNWpGA== - dependencies: - "@react-native-community/cli-clean" "13.6.4" - "@react-native-community/cli-config" "13.6.4" - "@react-native-community/cli-debugger-ui" "13.6.4" - "@react-native-community/cli-doctor" "13.6.4" - "@react-native-community/cli-hermes" "13.6.4" - "@react-native-community/cli-server-api" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" - "@react-native-community/cli-types" "13.6.4" +"@react-native-community/cli@13.6.6": + version "13.6.6" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.6.tgz#b929c8668e88344c03a46a3e635cb382dba16773" + integrity sha512-IqclB7VQ84ye8Fcs89HOpOscY4284VZg2pojHNl8H0Lzd4DadXJWQoxC7zWm8v2f8eyeX2kdhxp2ETD5tceIgA== + dependencies: + "@react-native-community/cli-clean" "13.6.6" + "@react-native-community/cli-config" "13.6.6" + "@react-native-community/cli-debugger-ui" "13.6.6" + "@react-native-community/cli-doctor" "13.6.6" + "@react-native-community/cli-hermes" "13.6.6" + "@react-native-community/cli-server-api" "13.6.6" + "@react-native-community/cli-tools" "13.6.6" + "@react-native-community/cli-types" "13.6.6" chalk "^4.1.2" commander "^9.4.1" deepmerge "^4.3.0" @@ -2295,44 +1951,22 @@ resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz#9e558170c106bbafaa1ef502bd8e6d4651012bf9" integrity sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg== -"@react-native-community/masked-view@^0.1.11": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@react-native-community/masked-view/-/masked-view-0.1.11.tgz#2f4c6e10bee0786abff4604e39a37ded6f3980ce" - integrity sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw== - -"@react-native-menu/menu@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@react-native-menu/menu/-/menu-1.0.0.tgz#10a7ef82752bd0a297c5d1886e22d47f0cf2900a" - integrity sha512-DFtREX4I4w4Vh89ohnhvxzYtf4iPmJVILpTbpBOx0iDuVO94NFF1pqtULdlhzdqeJlyuE1FwTlBifziD9ZBx6g== - -"@react-native/assets-registry@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.81.tgz#76b17f8f79b366ec4f18a0f4e99b7cd466aa5aa7" - integrity sha512-ms+D6pJ6l30epm53pwnAislW79LEUHJxWfe1Cu0LWyTTBlg1OFoqXfB3eIbpe4WyH3nrlkQAh0yyk4huT2mCvw== - -"@react-native/assets-registry@~0.73.1": - version "0.73.1" - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.73.1.tgz#e2a6b73b16c183a270f338dc69c36039b3946e85" - integrity sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg== +"@react-native/assets-registry@0.74.83", "@react-native/assets-registry@~0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.83.tgz#c1815dc10f9e1075e0d03b4c8a9619145969522e" + integrity sha512-2vkLMVnp+YTZYTNSDIBZojSsjz8sl5PscP3j4GcV6idD8V978SZfwFlk8K0ti0BzRs11mzL0Pj17km597S/eTQ== -"@react-native/babel-plugin-codegen@0.73.4": - version "0.73.4" - resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz#8a2037d5585b41877611498ae66adbf1dddfec1b" - integrity sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ== +"@react-native/babel-plugin-codegen@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.83.tgz#971f9cfec980dd05598d81964c05a26c6166f9fb" + integrity sha512-+S0st3t4Ro00bi9gjT1jnK8qTFOU+CwmziA7U9odKyWrCoRJrgmrvogq/Dr1YXlpFxexiGIupGut1VHxr+fxJA== dependencies: - "@react-native/codegen" "0.73.3" + "@react-native/codegen" "0.74.83" -"@react-native/babel-plugin-codegen@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.81.tgz#80484fb9029038694a92193ae2653529e44aab64" - integrity sha512-Bj6g5/xkLMBAdC6665TbD3uCKCQSmLQpGv3gyqya/ydZpv3dDmDXfkGmO4fqTwEMunzu09Sk55st2ipmuXAaAg== - dependencies: - "@react-native/codegen" "0.74.81" - -"@react-native/babel-preset@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.81.tgz#80d0b96eef35d671f97eaf223c4d770170d7f23f" - integrity sha512-H80B3Y3lBBVC4x9tceTEQq/04lx01gW6ajWCcVbd7sHvGEAxfMFEZUmVZr0451Cafn02wVnDJ8psto1F+0w5lw== +"@react-native/babel-preset@0.74.83", "@react-native/babel-preset@~0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.83.tgz#9828457779b4ce0219078652327ce3203115cdf9" + integrity sha512-KJuu3XyVh3qgyUer+rEqh9a/JoUxsDOzkJNfRpDyXiAyjDRoVch60X/Xa/NcEQ93iCVHAWs0yQ+XGNGIBCYE6g== dependencies: "@babel/core" "^7.20.0" "@babel/plugin-proposal-async-generator-functions" "^7.0.0" @@ -2374,75 +2008,14 @@ "@babel/plugin-transform-typescript" "^7.5.0" "@babel/plugin-transform-unicode-regex" "^7.0.0" "@babel/template" "^7.0.0" - "@react-native/babel-plugin-codegen" "0.74.81" - babel-plugin-transform-flow-enums "^0.0.2" - react-refresh "^0.14.0" - -"@react-native/babel-preset@^0.73.18": - version "0.73.21" - resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.73.21.tgz#174c16493fa4e311b2f5f0c58d4f3c6a5a68bbea" - integrity sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.18.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.20.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.20.0" - "@babel/plugin-transform-flow-strip-types" "^7.20.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - "@react-native/babel-plugin-codegen" "0.73.4" + "@react-native/babel-plugin-codegen" "0.74.83" babel-plugin-transform-flow-enums "^0.0.2" react-refresh "^0.14.0" -"@react-native/codegen@0.73.3": - version "0.73.3" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.73.3.tgz#cc984a8b17334d986cc600254a0d4b7fa7d68a94" - integrity sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg== - dependencies: - "@babel/parser" "^7.20.0" - flow-parser "^0.206.0" - glob "^7.1.1" - invariant "^2.2.4" - jscodeshift "^0.14.0" - mkdirp "^0.5.1" - nullthrows "^1.1.1" - -"@react-native/codegen@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.81.tgz#1025ffd41f2b4710fd700c9e8e85210b9651a7c4" - integrity sha512-hhXo4ccv2lYWaJrZDsdbRTZ5SzSOdyZ0MY6YXwf3xEFLuSunbUMu17Rz5LXemKXlpVx4KEgJ/TDc2pPVaRPZgA== +"@react-native/codegen@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.83.tgz#7c56a82fe7603f0867f0d80ff29db3757b71be55" + integrity sha512-GgvgHS3Aa2J8/mp1uC/zU8HuTh8ZT5jz7a4mVMWPw7+rGyv70Ba8uOVBq6UH2Q08o617IATYc+0HfyzAfm4n0w== dependencies: "@babel/parser" "^7.20.0" glob "^7.1.1" @@ -2452,15 +2025,15 @@ mkdirp "^0.5.1" nullthrows "^1.1.1" -"@react-native/community-cli-plugin@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.81.tgz#4177207374942c52a86ad52c8c915f46729305ab" - integrity sha512-ezPOwPxbDgrBZLJJMcXryXJXjv3VWt+Mt4jRZiEtvy6pAoi2owSH0b178T5cEZaWsxQN0BbyJ7F/xJsNiF4z0Q== +"@react-native/community-cli-plugin@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.83.tgz#58808a58a5288895627548338731e72ebb5b507c" + integrity sha512-7GAFjFOg1mFSj8bnFNQS4u8u7+QtrEeflUIDVZGEfBZQ3wMNI5ycBzbBGycsZYiq00Xvoc6eKFC7kvIaqeJpUQ== dependencies: - "@react-native-community/cli-server-api" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" - "@react-native/dev-middleware" "0.74.81" - "@react-native/metro-babel-transformer" "0.74.81" + "@react-native-community/cli-server-api" "13.6.6" + "@react-native-community/cli-tools" "13.6.6" + "@react-native/dev-middleware" "0.74.83" + "@react-native/metro-babel-transformer" "0.74.83" chalk "^4.0.0" execa "^5.1.1" metro "^0.80.3" @@ -2470,86 +2043,59 @@ querystring "^0.2.1" readline "^1.3.0" -"@react-native/debugger-frontend@0.73.3": - version "0.73.3" - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz#033757614d2ada994c68a1deae78c1dd2ad33c2b" - integrity sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw== - -"@react-native/debugger-frontend@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.81.tgz#17cefe2b3ff485071bd30d819995867fd145da27" - integrity sha512-HCYF1/88AfixG75558HkNh9wcvGweRaSZGBA71KoZj03umXM8XJy0/ZpacGOml2Fwiqpil72gi6uU+rypcc/vw== - -"@react-native/dev-middleware@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.81.tgz#120ab62982a48cba90c7724d099ddaa50184c200" - integrity sha512-x2IpvUJN1LJE0WmPsSfQIbQaa9xwH+2VDFOUrzuO9cbQap8rNfZpcvVNbrZgrlKbgS4LXbbsj6VSL8b6SnMKMA== - dependencies: - "@isaacs/ttlcache" "^1.4.1" - "@react-native/debugger-frontend" "0.74.81" - "@rnx-kit/chromium-edge-launcher" "^1.0.0" - chrome-launcher "^0.15.2" - connect "^3.6.5" - debug "^2.2.0" - node-fetch "^2.2.0" - nullthrows "^1.1.1" - open "^7.0.3" - selfsigned "^2.4.1" - serve-static "^1.13.1" - temp-dir "^2.0.0" - ws "^6.2.2" - -"@react-native/dev-middleware@^0.73.6": - version "0.73.8" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.73.8.tgz#2e43722a00c7b8db753f747f40267cbad6caba4d" - integrity sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg== +"@react-native/debugger-frontend@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.83.tgz#48050afa4e086438073b95f041c0cc84fe3f20de" + integrity sha512-RGQlVUegBRxAUF9c1ss1ssaHZh6CO+7awgtI9sDeU0PzDZY/40ImoPD5m0o0SI6nXoVzbPtcMGzU+VO590pRfA== + +"@react-native/dev-middleware@0.74.83", "@react-native/dev-middleware@~0.74.75": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.83.tgz#9d09cfdb763e8ef81c003b0f99ae4ed1a3539639" + integrity sha512-UH8iriqnf7N4Hpi20D7M2FdvSANwTVStwFCSD7VMU9agJX88Yk0D1T6Meh2RMhUu4kY2bv8sTkNRm7LmxvZqgA== dependencies: "@isaacs/ttlcache" "^1.4.1" - "@react-native/debugger-frontend" "0.73.3" + "@react-native/debugger-frontend" "0.74.83" + "@rnx-kit/chromium-edge-launcher" "^1.0.0" chrome-launcher "^0.15.2" - chromium-edge-launcher "^1.0.0" connect "^3.6.5" debug "^2.2.0" node-fetch "^2.2.0" + nullthrows "^1.1.1" open "^7.0.3" + selfsigned "^2.4.1" serve-static "^1.13.1" temp-dir "^2.0.0" ws "^6.2.2" -"@react-native/gradle-plugin@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.81.tgz#aac01999b1005bba3213f504deee7efaadb62c1e" - integrity sha512-7YQ4TLnqfe2kplWWzBWO6k0rPSrWEbuEiRXSJNZQCtCk+t2YX985G62p/9jWm3sGLN4UTcpDXaFNTTPBvlycoQ== +"@react-native/gradle-plugin@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.83.tgz#4ac60a6d6295d5b920173cbf184ee32e53690810" + integrity sha512-Pw2BWVyOHoBuJVKxGVYF6/GSZRf6+v1Ygc+ULGz5t20N8qzRWPa2fRZWqoxsN7TkNLPsECYY8gooOl7okOcPAQ== -"@react-native/js-polyfills@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.81.tgz#64780497be4ecbff1b27076294e3ebd7df1ba485" - integrity sha512-o4MiR+/kkHoeoQ/zPwt81LnTm6pqdg0wOhU7S7vIZUqzJ7YUpnpaAvF+/z7HzUOPudnavoCN0wvcZPe/AMEyCA== +"@react-native/js-polyfills@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.83.tgz#0e189ce3ab0efecd00223f3bfc53663ce08ba013" + integrity sha512-/t74n8r6wFhw4JEoOj3bN71N1NDLqaawB75uKAsSjeCwIR9AfCxlzZG0etsXtOexkY9KMeZIQ7YwRPqUdNXuqw== -"@react-native/metro-babel-transformer@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.81.tgz#f724eab91e6de82f8d098e6de57f25bb7501d2d6" - integrity sha512-PVcMjj23poAK6Uemflz4MIJdEpONpjqF7JASNqqQkY6wfDdaIiZSNk8EBCWKb0t7nKqhMvtTq11DMzYJ0JFITg== +"@react-native/metro-babel-transformer@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.83.tgz#ba87c3cf041f4c0d2b991231af1a6b4a216e9b5d" + integrity sha512-hGdx5N8diu8y+GW/ED39vTZa9Jx1di2ZZ0aapbhH4egN1agIAusj5jXTccfNBwwWF93aJ5oVbRzfteZgjbutKg== dependencies: "@babel/core" "^7.20.0" - "@react-native/babel-preset" "0.74.81" + "@react-native/babel-preset" "0.74.83" hermes-parser "0.19.1" nullthrows "^1.1.1" -"@react-native/normalize-color@^2.0.0", "@react-native/normalize-color@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91" - integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== - -"@react-native/normalize-colors@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.81.tgz#0b7c440b6e126f79036cbe74a88791aba72b9fcf" - integrity sha512-g3YvkLO7UsSWiDfYAU+gLhRHtEpUyz732lZB+N8IlLXc5MnfXHC8GKneDGY3Mh52I3gBrs20o37D5viQX9E1CA== +"@react-native/normalize-colors@0.74.83", "@react-native/normalize-colors@^0.74.1", "@react-native/normalize-colors@~0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.83.tgz#86ef925bacf219d74df115bcfb615f62d8142e85" + integrity sha512-jhCY95gRDE44qYawWVvhTjTplW1g+JtKTKM3f8xYT1dJtJ8QWv+gqEtKcfmOHfDkSDaMKG0AGBaDTSK8GXLH8Q== -"@react-native/virtualized-lists@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.81.tgz#8e43d4c72ec561754491eae731f40877f03d05fb" - integrity sha512-5jF9S10Ug2Wl+L/0+O8WmbC726sMMX8jk/1JrvDDK+0DRLMobfjLc1L26fONlVBF7lE5ctqvKZ9TlKdhPTNOZg== +"@react-native/virtualized-lists@0.74.83": + version "0.74.83" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.83.tgz#5595d6aefd9679d1295c56a1d1653b1fb261bd62" + integrity sha512-rmaLeE34rj7py4FxTod7iMTC7BAsm+HrGA8WxYmEJeyTV7WSaxAkosKoYBz8038mOiwnG9VwA/7FrB6bEQvn1A== dependencies: invariant "^2.2.4" nullthrows "^1.1.1" @@ -2588,7 +2134,7 @@ "@react-navigation/elements" "^1.3.30" warn-once "^0.1.0" -"@react-navigation/native@^6.1.17", "@react-navigation/native@~6.1.6": +"@react-navigation/native@^6.0.2", "@react-navigation/native@~6.1.6": version "6.1.17" resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.17.tgz#439f15a99809d26ea4682d2a3766081cf2ca31cf" integrity sha512-mer3OvfwWOHoUSMJyLa4vnBH3zpFmCwuzrBPlw7feXklurr/ZDiLjLxUScOot6jLRMz/67GyilEYMmP99LL0RQ== @@ -2605,46 +2151,51 @@ dependencies: nanoid "^3.1.23" -"@react-navigation/stack@^6.3.29": - version "6.3.29" - resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.3.29.tgz#b03b2f2baa36c06e4c9e8c7da80d62f83ad0b835" - integrity sha512-tzlGkoRgB6P7vgw7rHuWo3TL7Gzu6xh5LMf+zSdCuEiKp/qASzxYfnTEr9tOLbVs/gf+qeukEDheCSAJKVpBXw== +"@reduxjs/toolkit@^2.2.3", "@reduxjs/toolkit@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.4.tgz#d9c25c2811d5aa92ff18f9483fe2223b0dbd33d5" + integrity sha512-EoIC9iC2V/DLRBVMXRHrO/oM3QBT7RuJNeBRx8Cpnz/NHINeZBEqgI8YOxAYUjLp+KYxGgc4Wd6KoAKsaUBGhg== dependencies: - "@react-navigation/elements" "^1.3.30" - color "^4.2.3" - warn-once "^0.1.0" + immer "^10.0.3" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.1.0" + +"@remirror/core-constants@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.2.tgz#f05eccdc69e3a65e7d524b52548f567904a11a1a" + integrity sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== -"@remix-run/node@^1.19.3": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@remix-run/node/-/node-1.19.3.tgz#d27e2f742fc45379525cb3fca466a883ca06d6c9" - integrity sha512-z5qrVL65xLXIUpU4mkR4MKlMeKARLepgHAk4W5YY3IBXOreRqOGUC70POViYmY7x38c2Ia1NwqL80H+0h7jbMw== +"@remix-run/node@^2.7.2": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@remix-run/node/-/node-2.9.2.tgz#0dedfb0d2177ebe71de16dba00abe941081b3ba8" + integrity sha512-2Mt2107pfelz4T+ziDBef3P4A7kgPqCDshnEYCVGxInivJ3HHwAKUcb7MhGa8uMMMA6LMWxbAPYNHPzC3iKv2A== dependencies: - "@remix-run/server-runtime" "1.19.3" - "@remix-run/web-fetch" "^4.3.6" - "@remix-run/web-file" "^3.0.3" - "@remix-run/web-stream" "^1.0.4" + "@remix-run/server-runtime" "2.9.2" + "@remix-run/web-fetch" "^4.4.2" "@web3-storage/multipart-parser" "^1.0.0" - abort-controller "^3.0.0" cookie-signature "^1.1.0" source-map-support "^0.5.21" stream-slice "^0.1.2" + undici "^6.10.1" -"@remix-run/router@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.7.2.tgz#cba1cf0a04bc04cb66027c51fa600e9cbc388bc8" - integrity sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A== +"@remix-run/router@1.16.1": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" + integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== -"@remix-run/server-runtime@1.19.3": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-1.19.3.tgz#206b55337c266c5bc254878f8ff3cd5677cc60fb" - integrity sha512-KzQ+htUsKqpBgKE2tWo7kIIGy3MyHP58Io/itUPvV+weDjApwr9tQr9PZDPA3yAY6rAzLax7BU0NMSYCXWFY5A== +"@remix-run/server-runtime@2.9.2": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-2.9.2.tgz#40e62f0005bcd7ee5d72f4f85249a7dec6405dad" + integrity sha512-dX37FEeMVVg7KUbpRhX4hD0nUY0Sscz/qAjU4lYCdd6IzwJGariTmz+bQTXKCjploZuXj09OQZHSOS/ydkUVDA== dependencies: - "@remix-run/router" "1.7.2" - "@types/cookie" "^0.4.1" + "@remix-run/router" "1.16.1" + "@types/cookie" "^0.6.0" "@web3-storage/multipart-parser" "^1.0.0" - cookie "^0.4.1" + cookie "^0.6.0" set-cookie-parser "^2.4.8" source-map "^0.7.3" + turbo-stream "^2.0.0" "@remix-run/web-blob@^3.1.0": version "3.1.0" @@ -2654,7 +2205,7 @@ "@remix-run/web-stream" "^1.1.0" web-encoding "1.1.5" -"@remix-run/web-fetch@^4.3.6": +"@remix-run/web-fetch@^4.4.2": version "4.4.2" resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz#ce7aedef72cc26e15060e8cf84674029f92809b6" integrity sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA== @@ -2668,7 +2219,7 @@ data-uri-to-buffer "^3.0.1" mrmime "^1.0.0" -"@remix-run/web-file@^3.0.3", "@remix-run/web-file@^3.1.0": +"@remix-run/web-file@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@remix-run/web-file/-/web-file-3.1.0.tgz#07219021a2910e90231bc30ca1ce693d0e9d3825" integrity sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ== @@ -2682,7 +2233,7 @@ dependencies: web-encoding "1.1.5" -"@remix-run/web-stream@^1.0.4", "@remix-run/web-stream@^1.1.0": +"@remix-run/web-stream@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@remix-run/web-stream/-/web-stream-1.1.0.tgz#b93a8f806c2c22204930837c44d81fdedfde079f" integrity sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA== @@ -2709,6 +2260,11 @@ component-type "^1.2.1" join-component "^1.1.0" +"@shopify/restyle@^2.4.4": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@shopify/restyle/-/restyle-2.4.4.tgz#a94dde4e7fcfa03bc5f06648b70ecf47caa661ba" + integrity sha512-Y64T8pCSKZi7ChMMfCfe+EJJsqeF+lNLsxYDHbuU63ffLHN7wRwIALJY6VqzcJWZX3fhCztX7AqOkgc7CetfPg== + "@sideway/address@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" @@ -2837,17 +2393,148 @@ deepmerge "^4.3.1" svgo "^3.0.2" -"@tanstack/query-core@5.29.0": - version "5.29.0" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.29.0.tgz#d0b3d12c07d5a47f42ab0c1ed4f317106f3d4b20" - integrity sha512-WgPTRs58hm9CMzEr5jpISe8HXa3qKQ8CxewdYZeVnA54JrPY9B1CZiwsCoLpLkf0dGRZq+LcX5OiJb0bEsOFww== - -"@tanstack/react-query@^5.29.0": - version "5.29.2" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.29.2.tgz#c55ffbfaf9d8cf34212428db2b6c61ca6b545188" - integrity sha512-nyuWILR4u7H5moLGSiifLh8kIqQDLNOHGuSz0rcp+J75fNc8aQLyr5+I2JCHU3n+nJrTTW1ssgAD8HiKD7IFBQ== - dependencies: - "@tanstack/query-core" "5.29.0" +"@tiptap/core@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.3.2.tgz#729e7f0efd199406e580f8edf15fa5744991a52b" + integrity sha512-4sMpzYuxiG+fYMwPRXy+mLRVU315KEqzQUcBc2FEgSsmw9Kionykmkq3DvEco7rH8r0NdV/l9R49wVEtX54VqQ== + +"@tiptap/extension-bold@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.3.2.tgz#ebe13406db8e7d906ad80ad7640b2e80dd6e92ce" + integrity sha512-Mdc0qOPeJxxt5kSYKpNs7TzbQHeVpbpxwafUrxrvfD2iOnJlwlNxVWsVulc1t5EA8NpbTqYJTPmAtv2h/qmsfw== + +"@tiptap/extension-bubble-menu@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.3.2.tgz#58580c93b08b8953d2f9a98b35f7fd86decc252a" + integrity sha512-hg+ncQmoNngdeoUWBQs2AWzDO8YIrlAIgLmIponC+OSCZoVrri7LZ4N1uSp5B/U0lz5fSGUvsUNUs0le+MMr/Q== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-code@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.3.2.tgz#36689994b76550e068ca9cc29cc8721e441bf2b5" + integrity sha512-LyIRBFJCxbgi96ejoeewESvfUf5igfngamZJK+uegfTcznimP0AjSWs3whJwZ9QXUsQrB9tIrWIG4GBtatp6qw== + +"@tiptap/extension-collaboration-cursor@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.3.2.tgz#be0edb52c3a58301c822e0b41f95517f0cf1d879" + integrity sha512-Dbf3913S+Oqb/1sNshIMipR7OPJp7UD9Uu7RAX8m5BUEGBXwoNLJDnCo8EXKsgAU6nAsGTaoyQ1HyRkG+8DFqg== + +"@tiptap/extension-collaboration@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration/-/extension-collaboration-2.3.2.tgz#0780eabbe2e72665ed83f86dc70790589d1d0ff1" + integrity sha512-1vN+crj5KgqoJhDV+CrfIrBWDIjfpVxiEWHBk+yQU/G2vmyQfbN/R/5gH6rOw5GT3mHqgWFtCDJo4+H/2Ete4w== + +"@tiptap/extension-dropcursor@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.2.tgz#3f12430fb5fa7e436726c66c53fe0334f97e1834" + integrity sha512-r7JJn9dEnIRDdbnTCAUFCWX4OPsR48+4OEm5eGlysEaD2h4z0G1AaK5XXwOoQhP3WP2LHHjL4LahlYZvltzFzw== + +"@tiptap/extension-floating-menu@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.3.2.tgz#9ccb16e12a205f141e071621b76028d539da9a29" + integrity sha512-7MerFtr+7y0lThKEcNeM0B5LMWqP3RqmMZYJEOCIL20mIINYz5JzSIMQQujmeU5tcqI12O1u7jbRoxRmZrsXxw== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-gapcursor@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.2.tgz#e16256c5fa46dd62d65357cf8c62482b0f183dac" + integrity sha512-PSry4JHUIOhXytvYUQGtYgfIKCIhnmbKksZ8/CfCaKgGJpjOpnzqRG5FnYXZB7NiqouABreM7+IgkH0mOLq6HQ== + +"@tiptap/extension-hard-break@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.3.2.tgz#1ad683a63c7760cdb075733cdb035d18328c8042" + integrity sha512-Oy/Dj75kw/tyNyrcFf97r872NZggISfvabTptH8j1gFPg/XzT5ERcT2fvgpbsBx0WWlXOaFkC1owta6kS6MZpg== + +"@tiptap/extension-history@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.3.2.tgz#6c36093287fd8bfc2b2970b438ece9ffa8805c00" + integrity sha512-LTon7ys+C6wLmN/nXYkr1pDxIiIv0Czn4US7I/1b8Ws2N6PU+nMm4r7Uj8hKrDYL8yPQUaS4gIs1hhOwJ8UjtA== + +"@tiptap/extension-horizontal-rule@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.2.tgz#04da4de4b5006203b8a4e4d354ec2788df30b0f2" + integrity sha512-nz4GcYvZmJOX20GAjR5ymZgzQCbhnK/rmcunQf4zkl4LA5sXm70P70I9bDtrT/mgmz5dnBUTkVAkLTtKbovdDQ== + +"@tiptap/extension-italic@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.3.2.tgz#d68977f19aac0d87daf1ce831caf2217a569a61c" + integrity sha512-6RJmexu/E+JP2+lhzJLV+5KZJiTrJE+p/hnDk13CBK2VgiwcJYmcZSVk+Yk6Suwrb1qTAosu8paKIwVJa/VMUg== + +"@tiptap/extension-link@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.3.2.tgz#d46a816efae75a0cbb27d9f561d3f88ee35193c6" + integrity sha512-Bs3PbYmXj5bzUzPdFkcuflxZkdI2nCIJY2YO5TykANos68FrRtxyRKCxSxyZABzKjctT/UUVSap7JUVQ+i/bSw== + dependencies: + linkifyjs "^4.1.0" + +"@tiptap/extension-paragraph@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.3.2.tgz#2141b3fcf3ca74cadf8703c07582585407de723d" + integrity sha512-bKzL4NXp0pDM/Q5ZCpjLxjQU4DwoWc6CDww1M4B4dp1sfiXiE2P7EOCMM2TfJOqNPUFpp5RcFKKcxC2Suj8W4w== + +"@tiptap/extension-strike@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.3.2.tgz#44d7e5eac5a9dc8969895b85e4e37546d0e9b140" + integrity sha512-gi16YtLnXKPubxafvcGSAELac4i8S6Eb9Av0AaH6QH9H9zzSHN7qOrX930Tp2Pod5a/a82kk7kN7IB6htAeaYA== + +"@tiptap/extension-table-cell@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.3.2.tgz#684899a1e0d39c8fda8371536c7454f742253abe" + integrity sha512-kWwozAjEI3RNwOseQPjq8LEwb4gJwn6Y4HKlya2nshHPK2gk7lXQgjm6npqYEsv7C0+e3m9T60MlfGeOyvEqfQ== + +"@tiptap/extension-table-header@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.3.2.tgz#2108319600261cdb39d2194e180130951c767970" + integrity sha512-6ivB0RR+cvq58wnkNkNWx/Wbv2Ue6S84sBuMxcNUBZxSQpNB9pmMVPYVLtw1uT1/z91n63ohsahmBQs1e1+aHw== + +"@tiptap/extension-table-row@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.3.2.tgz#319157bd495ec5b0584689cc4cc89e34bf977ace" + integrity sha512-BI5bloqMbGmJJj0QX8Iq3OrJhqS9YbrhMxEpWPteeZfmela7VPU1bhdH2C2BVdL3v9LpRIoWk+VCirzzwJUGfg== + +"@tiptap/extension-text@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.3.2.tgz#000c1c4d5ae21b8ddef777b8298b67260e13274f" + integrity sha512-a3whwDyyOsrmOQbfeY+Fm5XypSRgT3IGqWgz0r4U7oko57/X6Env08F1Ie2e2UkQw9B1MoW9cm3dC6jvrdzzYA== + +"@tiptap/extension-underline@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-2.3.2.tgz#52ad67365c604a9afeb63600a30d13141594278a" + integrity sha512-ZmhWG8gMXk62AhpIMuOofe8GWbkXBW1uYHG55Q9r7MmglESLJm13S5k8JVfOmOMKGzfE23A6yQkojnksAiSGoQ== + +"@tiptap/pm@^2.0.3", "@tiptap/pm@^2.3.1": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.3.2.tgz#3da84a19bf141ebfbea7b38aec7fc2bbdf8b3690" + integrity sha512-39Bmg7XqWWJg/G5YvWc3QVEPmFNpuMa05gw0Ap7KAKHnHiwl87hosOIDD8dtdcMrtgJL9NwBfUjEJ3ne53U9Ag== + dependencies: + prosemirror-changeset "^2.2.1" + prosemirror-collab "^1.3.1" + prosemirror-commands "^1.5.2" + prosemirror-dropcursor "^1.8.1" + prosemirror-gapcursor "^1.3.2" + prosemirror-history "^1.3.2" + prosemirror-inputrules "^1.3.0" + prosemirror-keymap "^1.2.2" + prosemirror-markdown "^1.12.0" + prosemirror-menu "^1.2.4" + prosemirror-model "^1.19.4" + prosemirror-schema-basic "^1.2.2" + prosemirror-schema-list "^1.3.0" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.3.5" + prosemirror-trailing-node "^2.0.7" + prosemirror-transform "^1.8.0" + prosemirror-view "^1.32.7" + +"@tiptap/react@^2.0.3": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@tiptap/react/-/react-2.3.2.tgz#2d9bfe05cec5dc33dc034013222c71666d9dcefd" + integrity sha512-NDvt3XfPn/6V3iAX3lqYGIuFPQgirUGKRyzfHl7ssIfpoY5VR5tRJkU4NigOr63NONrsgCgqJISG/nPY6YGw8w== + dependencies: + "@tiptap/extension-bubble-menu" "^2.3.2" + "@tiptap/extension-floating-menu" "^2.3.2" "@tootallnate/once@2": version "2.0.0" @@ -2904,15 +2591,22 @@ dependencies: "@babel/types" "^7.20.7" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" -"@types/geojson@^7946.0.13": - version "7946.0.14" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" - integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== +"@types/extend@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/extend/-/extend-3.0.4.tgz#5f9aa502299e1b9beb9ade57ea9e36898de0ff52" + integrity sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA== "@types/graceful-fs@^4.1.3": version "4.1.9" @@ -2926,6 +2620,20 @@ resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.45.tgz#ffa764bb68a66c08db6efb9c816eb7be850577b1" integrity sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ== +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== + dependencies: + "@types/unist" "^2" + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" @@ -2959,6 +2667,18 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + "@types/node-forge@^1.3.0": version "1.3.11" resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" @@ -2967,25 +2687,30 @@ "@types/node" "*" "@types/node@*": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + version "20.12.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" + integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== dependencies: undici-types "~5.26.4" "@types/node@^18.0.0": - version "18.19.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" - integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== + version "18.19.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.33.tgz#98cd286a1b8a5e11aa06623210240bcc28e95c48" + integrity sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A== dependencies: undici-types "~5.26.4" +"@types/parse5@^6.0.0": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== + "@types/prop-types@*": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react@~18.2.78": +"@types/react@~18.2.45": version "18.2.79" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== @@ -3008,10 +2733,20 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== -"@types/uuid@^9.0.8": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== "@types/yargs-parser@*": version "21.0.3" @@ -3130,9 +2865,9 @@ wonka "^4.0.14" "@urql/core@>=2.3.1": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.0.tgz#690e664cf66f733077c558bf685adbdac2b25823" - integrity sha512-kFkZxusq/VBQKEUcQFtf7AilMotLO+oGpE4WFhCiminZm8ZU2aulXSDWla50TaD0pj704FnWlXts6lRm0uHdDg== + version "5.0.3" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.3.tgz#80e390399f6aa32757c42733deb5f029bf0406ad" + integrity sha512-NZ3YqRr6IphbpFjGqujJOuVuV8/QegYxfjy1zdmOSWpYYFLpmMBfVtzZ/L8IiqPERVAEAIKjUsryLnVtXJQo4w== dependencies: "@0no-co/graphql.web" "^1.0.5" wonka "^6.3.2" @@ -3237,16 +2972,6 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -3258,14 +2983,14 @@ ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" + uri-js "^4.4.1" anser@^1.4.9: version "1.4.10" @@ -3327,17 +3052,12 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -3355,7 +3075,7 @@ application-config-path@^0.1.0: resolved "https://registry.yarnpkg.com/application-config-path/-/application-config-path-0.1.1.tgz#8b5ac64ff6afdd9bd70ce69f6f64b6998f5f756e" integrity sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw== -arg@5.0.2, arg@^5.0.2: +arg@5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== @@ -3503,15 +3223,6 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axios@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -3552,15 +3263,15 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" - integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: +babel-plugin-polyfill-corejs3@^0.10.1: version "0.10.4" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== @@ -3569,21 +3280,16 @@ babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: core-js-compat "^3.36.1" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" - integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" -babel-plugin-react-native-web@~0.18.10: - version "0.18.12" - resolved "https://registry.yarnpkg.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.18.12.tgz#3e9764484492ea612a16b40135b07c2d05b7969d" - integrity sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw== - -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-plugin-react-native-web@~0.19.10: + version "0.19.11" + resolved "https://registry.yarnpkg.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.11.tgz#32316f51de0053bba6815f6522bf7b17c483bf17" + integrity sha512-0sHf8GgDhsRZxGwlwHHdfL3U8wImFaLw4haEa60U9M3EiO3bg6u3BJ+1vXhwgrevqSq76rMb5j1HJs+dNvMj5g== babel-plugin-transform-flow-enums@^0.0.2: version "0.0.2" @@ -3610,53 +3316,20 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-expo@~10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-10.0.1.tgz#a0e7ad0119f46e58cb3f0738c3ca0c6e97b69c11" - integrity sha512-uWIGmLfbP3dS5+8nesxaW6mQs41d4iP7X82ZwRdisB/wAhKQmuJM9Y1jQe4006uNYkw6Phf2TT03ykLVro7KuQ== +babel-preset-expo@~11.0.5: + version "11.0.5" + resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-11.0.5.tgz#aadc9aec722333a03a5939d9f91dcc51cc42ff85" + integrity sha512-IjqR4B7wnBU55pofLeLGjwUGrWJE1buamgzE9CYpYCNicZmJcNjXUcinQiurXCMuClF2hOff3QfZsLxnGj1UaA== dependencies: "@babel/plugin-proposal-decorators" "^7.12.9" "@babel/plugin-transform-export-namespace-from" "^7.22.11" "@babel/plugin-transform-object-rest-spread" "^7.12.13" "@babel/plugin-transform-parameters" "^7.22.15" - "@babel/preset-env" "^7.20.0" "@babel/preset-react" "^7.22.15" - "@react-native/babel-preset" "^0.73.18" - babel-plugin-react-native-web "~0.18.10" - react-refresh "0.14.0" - -babel-preset-fbjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + "@babel/preset-typescript" "^7.23.0" + "@react-native/babel-preset" "~0.74.83" + babel-plugin-react-native-web "~0.19.10" + react-refresh "^0.14.2" babel-preset-jest@^29.6.3: version "29.6.3" @@ -3666,12 +3339,17 @@ babel-preset-jest@^29.6.3: babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.2.3, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -3683,16 +3361,11 @@ better-opn@~3.0.2: dependencies: open "^8.0.4" -big-integer@1.6.x, big-integer@^1.6.16: +big-integer@1.6.x: version "1.6.52" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -3702,11 +3375,6 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -blueimp-md5@^2.10.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" - integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -3741,34 +3409,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -broadcast-channel@^3.4.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - browserslist@^4.22.2, browserslist@^4.23.0: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" @@ -3851,11 +3498,6 @@ cacache@^15.3.0: tar "^6.0.2" unique-filename "^1.1.1" -calendarize@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/calendarize/-/calendarize-1.1.1.tgz#0fa8b8de6b5e6ff9f9fbb89cc3a8c01aace291c2" - integrity sha512-C2JyBAtNp2NG4DX4fA1EILggLt/5PlYzvQR0crHktoAPBc9TlIfdhzg7tWekCbe+pH6+9qoK+FhPbi+vYJJlqw== - call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -3891,11 +3533,6 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3906,15 +3543,15 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - caniuse-lite@^1.0.30001587: - version "1.0.30001610" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz#2f44ed6e21d359e914271ae35b68903632628ccf" - integrity sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA== + version "1.0.30001617" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" + integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" @@ -3951,26 +3588,26 @@ char-regex@^2.0.0: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + charenc@0.0.2, charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -3986,18 +3623,6 @@ chrome-launcher@^0.15.2: is-wsl "^2.2.0" lighthouse-logger "^1.0.0" -chromium-edge-launcher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz#0443083074715a13c669530b35df7bfea33b1509" - integrity sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA== - dependencies: - "@types/node" "*" - escape-string-regexp "^4.0.0" - is-wsl "^2.2.0" - lighthouse-logger "^1.0.0" - mkdirp "^1.0.4" - rimraf "^3.0.2" - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -4009,16 +3634,9 @@ ci-info@^3.2.0, ci-info@^3.3.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== - -class-variance-authority@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" - integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== - dependencies: - clsx "2.0.0" + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== clean-stack@^2.0.0: version "2.2.0" @@ -4081,12 +3699,7 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -clsx@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - -clsx@^2.1.0: +clsx@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== @@ -4153,6 +3766,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + command-exists@^1.2.4, command-exists@^1.2.8: version "1.2.9" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" @@ -4183,13 +3801,6 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -compare-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-urls/-/compare-urls-2.0.0.tgz#9b378c4abd43980a8700fffec9afb85de4df9075" - integrity sha512-eCJcWn2OYFEIqbm70ta7LQowJOOZZqq1a2YbbFCFI1uwSvj+TWMwXVn7vPR1ceFNcAIt5RSTDbwdlX82gYLTkA== - dependencies: - normalize-url "^2.0.1" - component-type@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.2.2.tgz#4458ecc0c1871efc6288bfaff0cbdab08141d079" @@ -4240,15 +3851,15 @@ cookie-signature@^1.1.0: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.1.tgz#790dea2cce64638c7ae04d9fabed193bd7ccf3b4" integrity sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw== -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.36.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" - integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== +core-js-compat@^3.36.1: + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: browserslist "^4.23.0" @@ -4290,13 +3901,10 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" -create-react-class@^15.6.0: - version "15.7.0" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" - integrity sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng== - dependencies: - loose-envify "^1.3.1" - object-assign "^4.1.1" +crelt@^1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== cross-fetch@^3.1.5: version "3.1.8" @@ -4305,7 +3913,7 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -4316,7 +3924,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4340,11 +3948,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - css-in-js-utils@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" @@ -4352,11 +3955,6 @@ css-in-js-utils@^3.1.0: dependencies: hyphenate-style-name "^1.0.3" -css-mediaquery@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" - integrity sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q== - css-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" @@ -4368,23 +3966,6 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-to-react-native@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - css-tree@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" @@ -4406,11 +3987,6 @@ css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - csso@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" @@ -4486,15 +4062,10 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -date-fns@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" - integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== - dayjs@^1.8.15: - version "1.11.10" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + version "1.11.11" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" + integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" @@ -4503,7 +4074,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4527,7 +4098,14 @@ decimal.js@^10.4.2: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -4581,7 +4159,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4619,6 +4197,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -4634,21 +4217,21 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -detect-node@^2.0.4, detect-node@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +diff@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4656,11 +4239,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -4732,20 +4310,15 @@ dotenv@^16.4.4, dotenv@~16.4.5: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.668: - version "1.4.737" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.737.tgz#3a774a58e04980741f65d440f5fdf57af18b6dde" - integrity sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw== + version "1.4.763" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz#64f2041ed496fd6fc710b9be806fe91da9334f91" + integrity sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ== emittery@^0.13.1: version "0.13.1" @@ -4757,11 +4330,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -4785,9 +4353,9 @@ env-editor@^0.4.1: integrity sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA== envinfo@^7.10.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" - integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== + version "7.13.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" + integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== eol@^0.9.1: version "0.9.1" @@ -4816,7 +4384,7 @@ errorhandler@^1.5.1: accepts "~1.3.7" escape-html "~1.0.3" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -4881,13 +4449,13 @@ es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.3" es-errors "^1.3.0" es-set-tostringtag "^2.0.3" function-bind "^1.1.2" @@ -4932,7 +4500,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== @@ -4942,7 +4510,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -4957,6 +4525,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + escodegen@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" @@ -5012,9 +4585,9 @@ eslint-plugin-prettier@^5.1.3: synckit "^0.8.6" eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react-native-globals@^0.1.1: version "0.1.2" @@ -5078,7 +4651,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.56.0: +eslint@8.57.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -5224,221 +4797,133 @@ expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -expo-application@^5.8.4, expo-application@~5.8.0: - version "5.8.4" - resolved "https://registry.yarnpkg.com/expo-application/-/expo-application-5.8.4.tgz#9c43c4a778a5ccf5a88afb36d6547dfdc34b5494" - integrity sha512-mH0gSlFzMuiT20TkZnBppzUtdF6TFHwcaTRnvkSZanN9iTOeEEfQQ60hHT4lBizHjFWRs/QYZVtXGvkQ/cyMpg== - -expo-asset@~9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-9.0.2.tgz#e8a6b6da356d5fc97955599d2fa49af78c7f0bfd" - integrity sha512-PzYKME1MgUOoUvwtdzhAyXkjXOXGiSYqGKG/MsXwWr0Ef5wlBaBm2DCO9V6KYbng5tBPFu6hTjoRNil1tBOSow== +expo-asset@~10.0.6: + version "10.0.6" + resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-10.0.6.tgz#0894c4e824ce90e130852e6eecaba386e9f2e5aa" + integrity sha512-waP73/ccn/HZNNcGM4/s3X3icKjSSbEQ9mwc6tX34oYNg+XE5WdwOuZ9wgVVFrU7wZMitq22lQXd2/O0db8bxg== dependencies: - "@react-native/assets-registry" "~0.73.1" - blueimp-md5 "^2.10.0" - expo-constants "~15.4.0" - expo-file-system "~16.0.0" + "@react-native/assets-registry" "~0.74.83" + expo-constants "~16.0.0" invariant "^2.2.4" md5-file "^3.2.3" -expo-auth-session@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/expo-auth-session/-/expo-auth-session-5.4.0.tgz#caae0bae4eeae649d320124ba8cd623c40c6cf0a" - integrity sha512-ZwjPMsMgCqdMi+vnhDbtjOAF12Y9+y1bYvorn/jQs47aFg6yeIRHycSOM/WL4hpFr+fAxycP3mIJeHVYfF3zuQ== - dependencies: - expo-application "~5.8.0" - expo-constants "~15.4.0" - expo-crypto "~12.8.0" - expo-linking "~6.2.0" - expo-web-browser "~12.8.0" - invariant "^2.2.4" - -expo-constants@~15.4.0, expo-constants@~15.4.3: - version "15.4.5" - resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-15.4.5.tgz#81756a4c4e1c020f840a419cd86a124a6d1fb35b" - integrity sha512-1pVVjwk733hbbIjtQcvUFCme540v4gFemdNlaxM2UXKbfRCOh2hzgKN5joHMOysoXQe736TTUrRj7UaZI5Yyhg== - dependencies: - "@expo/config" "~8.5.0" - -expo-crypto@~12.8.0: - version "12.8.1" - resolved "https://registry.yarnpkg.com/expo-crypto/-/expo-crypto-12.8.1.tgz#c7de01a61e89a0600f8f62ef6e71de4e6d3fcbae" - integrity sha512-EJEzmfBUSkGfALTlZRKUbh1RMKF7mWI12vkhO2w6bhGO4bjgGB8XzUHgLfrvSjphDFMx/lwaR6bAQDmXKO9UkQ== - dependencies: - base64-js "^1.3.0" - -expo-dev-client@~3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-3.3.11.tgz#f2541ccbcfc2ba32bcea47293bc9beae4e10db60" - integrity sha512-9nhhbfbskfmjp/tlRS5KvDpCoW0BREJBxpu2GyjKu7nDB33W8fJLL0wXgNhP+QEb93r37o3uezKmUm2kibOvTw== - dependencies: - expo-dev-launcher "3.6.9" - expo-dev-menu "4.5.8" - expo-dev-menu-interface "1.7.2" - expo-manifests "~0.13.0" - expo-updates-interface "~0.15.1" - -expo-dev-launcher@3.6.9: - version "3.6.9" - resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-3.6.9.tgz#5e104e0533a46f3614c1691673da3351092e8d1d" - integrity sha512-MBDMAqjCMVYt1Zv47u2dJTp4d8gCZMfM4GWAFhfQy3G6XzkUlFtewaQefAqy93FcYOv6BYdC9yZOLOb06tqTfA== - dependencies: - ajv "8.11.0" - expo-dev-menu "4.5.8" - expo-manifests "~0.13.0" - resolve-from "^5.0.0" - semver "^7.5.3" - -expo-dev-menu-interface@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-1.7.2.tgz#772fb97c6b0a44c27965cdfcfa078f316b0930ca" - integrity sha512-V/geSB9rW0IPTR+d7E5CcvkV0uVUCE7SMHZqE/J0/dH06Wo8AahB16fimXeh5/hTL2Qztq8CQ41xpFUBoA9TEw== - -expo-dev-menu@4.5.8: - version "4.5.8" - resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-4.5.8.tgz#21940385124c7d2745066bbcb42185ebd35f66bc" - integrity sha512-GXfI0CmYlqjOqyFjtplXO9PSoJQoy89+50lbUSNZykDsGyvzCPzl4txdQcdHHSglKYr7lWV7aeMVeehuSct60w== +expo-constants@~16.0.0: + version "16.0.1" + resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-16.0.1.tgz#1285e29c85513c6e88e118289e2baab72596d3f7" + integrity sha512-s6aTHtglp926EsugWtxN7KnpSsE9FCEjb7CgEjQQ78Gpu4btj4wB+IXot2tlqNwqv+x7xFe5veoPGfJDGF/kVg== dependencies: - expo-dev-menu-interface "1.7.2" - semver "^7.5.3" + "@expo/config" "~9.0.0-beta.0" -expo-file-system@~16.0.0, expo-file-system@~16.0.8: - version "16.0.8" - resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-16.0.8.tgz#13c79a8e06e42a8e76e9297df6920597a011d989" - integrity sha512-yDbVT0TUKd7ewQjaY5THum2VRFx2n/biskGhkUmLh3ai21xjIVtaeIzHXyv9ir537eVgt4ReqDNWi7jcXjdUcA== +expo-file-system@~17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-17.0.1.tgz#b9f8af8c1c06ec71d96fd7a0d2567fa9e1c88f15" + integrity sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw== -expo-font@~11.10.2, expo-font@~11.10.3: - version "11.10.3" - resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-11.10.3.tgz#a3115ebda8e09bd7cb8052619a4bbe606f0c17f4" - integrity sha512-q1Td2zUvmLbCA9GV4OG4nLPw5gJuNY1VrPycsnemN1m8XWTzzs8nyECQQqrcBhgulCgcKZZJJ6U0kC2iuSoQHQ== +expo-font@~12.0.4: + version "12.0.4" + resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-12.0.4.tgz#c3d9b7fc152286c1e2beae80f97b94ca4622db34" + integrity sha512-VtOQB7MEeFMVwo46/9/ntqzrgraTE7gAsnfi2NukFcCpDmyAU3G1R7m287LUXltE46SmGkMgAvM6+fflXFjaJA== dependencies: fontfaceobserver "^2.1.0" -expo-haptics@~12.8.1: - version "12.8.1" - resolved "https://registry.yarnpkg.com/expo-haptics/-/expo-haptics-12.8.1.tgz#42b996763be33d661bd33bbc3b3958c3f2734b9d" - integrity sha512-ntLsHkfle8K8w9MW8pZEw92ZN3sguaGUSSIxv30fPKNeQFu7Cq/h47Qv3tONv2MO3wU48N9FbKnant6XlfptpA== - -expo-json-utils@~0.12.0: - version "0.12.3" - resolved "https://registry.yarnpkg.com/expo-json-utils/-/expo-json-utils-0.12.3.tgz#cabb704a344d6d75f225cf4032c64479e442a2a9" - integrity sha512-4pypQdinpNc6XY9wsZk56njvzDh+B/9mISr7FPP3CVk1QGB1nSLh883/BCDSgnsephATZkC5HG+cdE60kCAR6A== +expo-keep-awake@~13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-13.0.1.tgz#6c0a0d1fe388fe5a63e2089ade66798eba23f089" + integrity sha512-Kqv8Bf1f5Jp7YMUgTTyKR9GatgHJuAcC8vVWDEkgVhB3O7L3pgBy5MMSMUhkTmRRV6L8TZe/rDmjiBoVS/soFA== -expo-keep-awake@~12.8.2: - version "12.8.2" - resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-12.8.2.tgz#6cfdf8ad02b5fa130f99d4a1eb98e459d5b4332e" - integrity sha512-uiQdGbSX24Pt8nGbnmBtrKq6xL/Tm3+DuDRGBk/3ZE/HlizzNosGRIufIMJ/4B4FRw4dw8KU81h2RLuTjbay6g== - -expo-linking@~6.2.0, expo-linking@~6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-6.2.2.tgz#b7e148068ae49fd9ad814428c16fdf7a236e8aca" - integrity sha512-FEe6lP4f7xFT/vjoHRG+tt6EPVtkEGaWNK1smpaUevmNdyCJKqW0PDB8o8sfG6y7fly8ULe8qg3HhKh5J7aqUQ== +expo-linking@~6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-6.3.1.tgz#05aef8a42bd310391d0b00644be40d80ece038d9" + integrity sha512-xuZCntSBGWCD/95iZ+mTUGTwHdy8Sx+immCqbUBxdvZ2TN61P02kKg7SaLS8A4a/hLrSCwrg5tMMwu5wfKr35g== dependencies: - expo-constants "~15.4.3" + expo-constants "~16.0.0" invariant "^2.2.4" -expo-manifests@~0.13.0: - version "0.13.2" - resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-0.13.2.tgz#02b28bb2fb002ef93a03faf1ede9ecaa43e5d6c0" - integrity sha512-l0Sia1WmLULx8V41K8RzGLsFoTe4qqthPRGpHjItsYn8ZB6lRrdTBM9OYp2McIflgqN1HAimUCQMFIwJyH+UmA== - dependencies: - "@expo/config" "~8.5.0" - expo-json-utils "~0.12.0" - -expo-modules-autolinking@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-1.10.3.tgz#19f349884a90f3f27ec9d64e8f2fa6be609558c5" - integrity sha512-pn4n2Dl4iRh/zUeiChjRIe1C7EqOw1qhccr85viQV7W6l5vgRpY0osE51ij5LKg/kJmGRcJfs12+PwbdTplbKw== +expo-modules-autolinking@1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-1.11.1.tgz#4a867f727d9dfde07de8dde14b333a3cbf82ce3c" + integrity sha512-2dy3lTz76adOl7QUvbreMCrXyzUiF8lygI7iFJLjgIQIVH+43KnFWE5zBumpPbkiaq0f0uaFpN9U0RGQbnKiMw== dependencies: - "@expo/config" "~8.5.0" chalk "^4.1.0" commander "^7.2.0" fast-glob "^3.2.5" find-up "^5.0.0" fs-extra "^9.1.0" -expo-modules-core@1.11.13: - version "1.11.13" - resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.11.13.tgz#a8e63ad844e966dce78dea40b50839af6c3bc518" - integrity sha512-2H5qrGUvmLzmJNPDOnovH1Pfk5H/S/V0BifBmOQyDc9aUh9LaDwkqnChZGIXv8ZHDW8JRlUW0QqyWxTggkbw1A== +expo-modules-core@1.12.10: + version "1.12.10" + resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.12.10.tgz#44c5510e8fa16936c48fa986b3a3429c207381be" + integrity sha512-aS4imfr7fuUtcx+j/CHuG6ohNSThyCzGRh1kKjQTDcO0/CqDO2cSFnxf7n2vpiRFgyoMFJvFFtW/zIzVXiC2Tw== dependencies: invariant "^2.2.4" -expo-router@~3.4.8: - version "3.4.8" - resolved "https://registry.yarnpkg.com/expo-router/-/expo-router-3.4.8.tgz#c7e55f500467985950760d325f75d06f8dfc17e7" - integrity sha512-fOOAWHH4LSPjPFtIZbApxdTNU8xSS8qKvhZ7PfWNMfx9510J1R1Ce/nwENPzcRLHRuVofDsSAEBfi4kV03fJwg== +expo-router@~3.5.11: + version "3.5.11" + resolved "https://registry.yarnpkg.com/expo-router/-/expo-router-3.5.11.tgz#5e66aaea954f6e5e4e23b5047138f424d9a2d0ca" + integrity sha512-6N6G4w+xsI3jVn4RoNDHyLmbEfoXvXKGzPOhuBicoblU8Utoa5hFI/tnEjxXfhlqz+zjAs6lCv3Ff0wzv/KYoQ== dependencies: - "@expo/metro-runtime" "3.1.3" - "@expo/server" "^0.3.0" + "@expo/metro-runtime" "3.2.1" + "@expo/server" "^0.4.0" "@radix-ui/react-slot" "1.0.1" "@react-navigation/bottom-tabs" "~6.5.7" "@react-navigation/native" "~6.1.6" "@react-navigation/native-stack" "~6.9.12" - expo-splash-screen "0.26.4" - react-helmet-async "^1.3.0" + expo-splash-screen "0.27.4" + react-native-helmet-async "2.0.4" schema-utils "^4.0.1" -expo-secure-store@~12.8.1: - version "12.8.1" - resolved "https://registry.yarnpkg.com/expo-secure-store/-/expo-secure-store-12.8.1.tgz#369a570702fa1dc0c49ea41a5ab18aca2a986d38" - integrity sha512-Ju3jmkHby4w7rIzdYAt9kQyQ7HhHJ0qRaiQOInknhOLIltftHjEgF4I1UmzKc7P5RCfGNmVbEH729Pncp/sHXQ== +expo-secure-store@~13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/expo-secure-store/-/expo-secure-store-13.0.1.tgz#fc886d3e0ed12890c8dd74e7cc44e35b03f2d79b" + integrity sha512-5DTKjbv98X7yPbm+1jER/sOEIlt2Ih7qwabTvkWDXry5bPcQGoulxH5zIX9+JvVH7of8GI4t7NSEbpAO3P7FZA== -expo-splash-screen@0.26.4, expo-splash-screen@~0.26.4: - version "0.26.4" - resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.26.4.tgz#bc1fb226c6eae03ee351a3ebe5521a37f868cbc7" - integrity sha512-2DwofTQ0FFQCsvDysm/msENsbyNsJiAJwK3qK/oXeizECAPqD7bK19J4z9kuEbr7ORPX9MLnTQYKl6kmX3keUg== +expo-splash-screen@0.27.4, expo-splash-screen@~0.27.4: + version "0.27.4" + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.27.4.tgz#d7a86a2a1a87824ed47388aa8836e91b61268c62" + integrity sha512-JwepK1FjbwiOK2nwIFanfzj9s7UXYnpTwLX8A9v7Ec3K4V28yu8HooSc9X60cftBw9UZrs8Gwj4PgTpQabBS9A== dependencies: - "@expo/prebuild-config" "6.7.4" + "@expo/prebuild-config" "7.0.3" -expo-status-bar@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/expo-status-bar/-/expo-status-bar-1.11.1.tgz#a11318741d361048c11db2b16c4364a79a74af30" - integrity sha512-ddQEtCOgYHTLlFUe/yH67dDBIoct5VIULthyT3LRJbEwdpzAgueKsX2FYK02ldh440V87PWKCamh7R9evk1rrg== +expo-status-bar@~1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/expo-status-bar/-/expo-status-bar-1.12.1.tgz#52ce594aab5064a0511d14375364d718ab78aa66" + integrity sha512-/t3xdbS8KB0prj5KG5w7z+wZPFlPtkgs95BsmrP/E7Q0xHXTcDcQ6Cu2FkFuRM+PKTb17cJDnLkawyS5vDLxMA== -expo-system-ui@~2.9.4: - version "2.9.4" - resolved "https://registry.yarnpkg.com/expo-system-ui/-/expo-system-ui-2.9.4.tgz#f5f210805527e728f47edcd6a5aba3c1e83c9465" - integrity sha512-ExJ8AzEZjb/zbg6nRLrN/mqxWr6e4fAcT0LBN/YvPZljbMo23HU+/lPy0/YctF1tRRvQ3Z95ABSNjnx9ajQBjg== +expo-system-ui@~3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/expo-system-ui/-/expo-system-ui-3.0.4.tgz#5ace49d38eb03c09a8041b3b82c581a6b974741a" + integrity sha512-v1n6hBO30k9qw6RE8/au4yNoovs71ExGuXizJUlR5KSo4Ruogpb+0/2q3uRZMDIYWWCANvms8L0UOh6fQJ5TXg== dependencies: - "@react-native/normalize-color" "^2.0.0" + "@react-native/normalize-colors" "~0.74.83" debug "^4.3.2" -expo-updates-interface@~0.15.1: - version "0.15.3" - resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-0.15.3.tgz#cdee536dea0a8692833a4d074005bf9c6bbbdd99" - integrity sha512-uLvsbaCmUsXgJqeen8rYH/jPr874ZUCXEvWpKHxrCv5/XATPlYEaDuecbNSGQ+cu78i6MdtB4BHOwZmoH2d47A== - -expo-web-browser@~12.8.0, expo-web-browser@~12.8.2: - version "12.8.2" - resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-12.8.2.tgz#f34fb85c80031e0dddd4f9b9efd03cb60333b089" - integrity sha512-Mw8WoFMSADecNjtC4PZVsVj1/lYdxIAH1jOVV+F8v8SEWYxORWofoShfXg7oUxRLu0iUG8JETfO5y4m8+fOgdg== - dependencies: - compare-urls "^2.0.0" - url "^0.11.0" +expo-web-browser@~13.0.3: + version "13.0.3" + resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-13.0.3.tgz#dceb05dbc187b498ca937b02adf385b0232a4e92" + integrity sha512-HXb7y82ApVJtqk8tManyudtTrCtx8xcUnVzmJECeHCB0SsWSQ+penVLZxJkcyATWoJOsFMnfVSVdrTcpKKGszQ== -expo@^50.0.14: - version "50.0.15" - resolved "https://registry.yarnpkg.com/expo/-/expo-50.0.15.tgz#18c5c3ee0125fd42fe828b6791410eed68f7e74a" - integrity sha512-tsyRmMHjA8lPlM7AsqH1smSH8hzmn1+x/vsP+xgbKYJTGtYccdY/wsm6P84VJWeK5peWSVqrWNos+YuPqXKLSQ== +expo@~51.0.2: + version "51.0.2" + resolved "https://registry.yarnpkg.com/expo/-/expo-51.0.2.tgz#14de27d8d8addec5848285a6e4bd8792d07fc3f2" + integrity sha512-aRKrheMMQBcNDg2SBjW5kcSN5G58bdIpsxeSQ65Bx18DFLXjPv5UaU9kzIWRAcxaPtgictn9ut9IJQVZKChNxQ== dependencies: "@babel/runtime" "^7.20.0" - "@expo/cli" "0.17.8" - "@expo/config" "8.5.4" - "@expo/config-plugins" "7.8.4" - "@expo/metro-config" "0.17.6" + "@expo/cli" "0.18.10" + "@expo/config" "9.0.1" + "@expo/config-plugins" "8.0.4" + "@expo/metro-config" "0.18.3" "@expo/vector-icons" "^14.0.0" - babel-preset-expo "~10.0.1" - expo-asset "~9.0.2" - expo-file-system "~16.0.8" - expo-font "~11.10.3" - expo-keep-awake "~12.8.2" - expo-modules-autolinking "1.10.3" - expo-modules-core "1.11.13" + babel-preset-expo "~11.0.5" + expo-asset "~10.0.6" + expo-file-system "~17.0.1" + expo-font "~12.0.4" + expo-keep-awake "~13.0.1" + expo-modules-autolinking "1.11.1" + expo-modules-core "1.12.10" fbemitter "^3.0.0" whatwg-url-without-unicode "8.0.0-3" -extend@^3.0.1: +extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -5453,7 +4938,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -5621,19 +5106,9 @@ flow-enums-runtime@^0.0.6: integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw== flow-parser@0.*: - version "0.233.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.233.0.tgz#b983e65812d5ecae79f08ae3ed8ad2e131a9b966" - integrity sha512-E/mv51GYJfLuRX6fZnw4M52gBxYa8pkHUOgNEZOcQK2RTXS8YXeU5rlalkTcY99UpwbeNVCSUFKaavpOksi/pQ== - -flow-parser@^0.206.0: - version "0.206.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" - integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== - -follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "0.236.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.236.0.tgz#8e8e6c59ff7e8d196c0ed215b3919320a1c6e332" + integrity sha512-0OEk9Gr+Yj7wjDW2KgaNYUypKau71jAfFyeLQF5iVtxqc6uJHag/MT7pmaEApf4qM7u86DkBcd4ualddYMfbLw== fontfaceobserver@^2.1.0: version "2.3.0" @@ -5647,14 +5122,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - form-data@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -5724,7 +5191,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -5770,6 +5237,11 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -5806,7 +5278,7 @@ getenv@^1.0.0: resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -5832,17 +5304,6 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.3.10: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.10.2" - glob@^6.0.1: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" @@ -5879,11 +5340,12 @@ globals@^13.19.0: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.0.1, globby@^11.1.0: version "11.1.0" @@ -5965,12 +5427,220 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hast-util-embedded@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-2.0.1.tgz#979e07ecc6bc42b560ccac755cab926c354f24c7" + integrity sha512-QUdSOP1/o+/TxXtpPFXR2mUg2P+ySrmlX7QjwHZCXqMFyYk7YmcGSvqRW+4XgXAoHifdE1t2PwFaQK33TqVjSw== + dependencies: + hast-util-is-element "^2.0.0" + +hast-util-embedded@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz#be4477780fbbe079cdba22982e357a0de4ba853e" + integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-from-dom@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz#25836ddecc3cc0849d32749c2a7aec03e94b59a7" + integrity sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ== + dependencies: + hastscript "^7.0.0" + web-namespaces "^2.0.0" + +hast-util-from-parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" + integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hastscript "^7.0.0" + property-information "^6.0.0" + vfile "^5.0.0" + vfile-location "^4.0.0" + web-namespaces "^2.0.0" + +hast-util-has-property@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz#8ec99c3e8f02626304ee438cdb9f0528b017e083" + integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== + +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-body-ok-link@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-2.0.0.tgz#e0df6947b2676d2acac55c611755d359f264958e" + integrity sha512-S58hCexyKdD31vMsErvgLfflW6vYWo/ixRLPJTtkOvLld24vyI8vmYmkgLA5LG3la2ME7nm7dLGdm48gfLRBfw== + dependencies: + "@types/hast" "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-element "^2.0.0" + +hast-util-is-body-ok-link@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz#6b2d808813a6f73eb20e61bdd2b203591af85eb4" + integrity sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-element@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" + integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-parse-selector@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== + dependencies: + "@types/hast" "^2.0.0" + +hast-util-phrasing@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-2.0.2.tgz#0747ba8000a8d5598bef4000819d92fda8f8843c" + integrity sha512-yGkCfPkkfCyiLfK6KEl/orMDr/zgCnq/NaO9HfULx6/Zga5fso5eqQA5Ov/JZVqACygvw9shRYWgXNcG2ilo7w== + dependencies: + "@types/hast" "^2.0.0" + hast-util-embedded "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-body-ok-link "^2.0.0" + hast-util-is-element "^2.0.0" + +hast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz#fa284c0cd4a82a0dd6020de8300a7b1ebffa1690" + integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-has-property "^3.0.0" + hast-util-is-body-ok-link "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-raw@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" + integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + hast-util-from-parse5 "^7.0.0" + hast-util-to-parse5 "^7.0.0" + html-void-elements "^2.0.0" + parse5 "^6.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-html@^8.0.0: + version "8.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc" + integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-raw "^7.0.0" + hast-util-whitespace "^2.0.0" + html-void-elements "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-mdast@^8.3.0: + version "8.4.1" + resolved "https://registry.yarnpkg.com/hast-util-to-mdast/-/hast-util-to-mdast-8.4.1.tgz#f953027e0688c52439b11a433ab9ed8b43e1e17b" + integrity sha512-tfmBLASuCgyhCzpkTXM5kU8xeuS5jkMZ17BYm2YftGT5wvgc7uHXTZ/X8WfNd6F5NV/IGmrLsuahZ+jXQir4zQ== + dependencies: + "@types/extend" "^3.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + extend "^3.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-element "^2.0.0" + hast-util-phrasing "^2.0.0" + hast-util-to-text "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + rehype-minify-whitespace "^5.0.0" + trim-trailing-lines "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit "^4.0.0" + +hast-util-to-parse5@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" + integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-text@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz#ecf30c47141f41e91a5d32d0b1e1859fd2ac04f2" + integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hast-util-is-element "^2.0.0" + unist-util-find-after "^4.0.0" + +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: - function-bind "^1.1.2" + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" hermes-estree@0.19.1: version "0.19.1" @@ -6003,7 +5673,7 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1: +hoist-non-react-statics@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -6029,6 +5699,16 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== + +html-whitespace-sensitive-tag-names@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz#c7c8c11d93c014fba642e240d7f3da39656ab301" + integrity sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -6091,6 +5771,11 @@ image-size@^1.0.2: dependencies: queue "6.0.2" +immer@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -6156,11 +5841,6 @@ inline-style-prefixer@^6.0.1: css-in-js-utils "^3.1.0" fast-loops "^1.1.3" -install@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/install/-/install-0.13.0.tgz#6af6e9da9dd0987de2ab420f78e60d9c17260776" - integrity sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA== - internal-ip@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -6235,13 +5915,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" @@ -6250,6 +5923,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-buffer@~1.1.1, is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -6337,7 +6015,7 @@ is-glob@^2.0.0: dependencies: is-extglob "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -6388,10 +6066,10 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-plain-object@^2.0.4: version "2.0.4" @@ -6520,6 +6198,11 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic.js@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" + integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -6584,15 +6267,6 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" -jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - javascript-natural-sort@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" @@ -6732,13 +6406,13 @@ jest-environment-node@^29.6.3, jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" -jest-expo@~50.0.4: - version "50.0.4" - resolved "https://registry.yarnpkg.com/jest-expo/-/jest-expo-50.0.4.tgz#3e72524982487dd1fa2a77de716c86f0a5fd2b1a" - integrity sha512-qtCqtdGaQtEcA3vc6UPN5Xn78jAyoBJj6Pxpk2raizdwI7carsg9Us9Wc+D4kl+7+ffhBMeS3cYWeJqVIZl1pA== +jest-expo@~51.0.1: + version "51.0.1" + resolved "https://registry.yarnpkg.com/jest-expo/-/jest-expo-51.0.1.tgz#d47a9ec67fb3245c9849f686253e36bc16d981c9" + integrity sha512-dnLditgU4RXeQnz5XmyMm1EoOn8k1i7F1DSxA3edjIqK5lydzjfeUHwef7Bs0ToOMIIqm5Bs37i7tsHYpMNLCw== dependencies: - "@expo/config" "~8.5.0" - "@expo/json-file" "^8.2.37" + "@expo/config" "~9.0.0-beta.0" + "@expo/json-file" "^8.3.0" "@jest/create-cache-key-function" "^29.2.1" babel-jest "^29.2.1" find-up "^5.0.0" @@ -7015,15 +6689,10 @@ jimp-compact@0.16.1: resolved "https://registry.yarnpkg.com/jimp-compact/-/jimp-compact-0.16.1.tgz#9582aea06548a2c1e04dd148d7c3ab92075aefa3" integrity sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww== -jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - joi@^17.2.1: - version "17.12.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.12.3.tgz#944646979cd3b460178547b12ba37aca8482f63d" - integrity sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g== + version "17.13.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.1.tgz#9c7b53dc3b44dd9ae200255cc3b398874918a6ca" + integrity sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg== dependencies: "@hapi/hoek" "^9.3.0" "@hapi/topo" "^5.1.0" @@ -7036,11 +6705,6 @@ join-component@^1.1.0: resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5" integrity sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ== -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7230,6 +6894,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -7243,6 +6912,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lib0@^0.2.42, lib0@^0.2.85, lib0@^0.2.86: + version "0.2.93" + resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.93.tgz#95487c2a97657313cb1d91fbcf9f6d64b7fcd062" + integrity sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q== + dependencies: + isomorphic.js "^0.2.4" + lighthouse-logger@^1.0.0: version "1.4.2" resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz#aef90f9e97cd81db367c7634292ee22079280aaa" @@ -7307,21 +6983,23 @@ lightningcss@~1.19.0: lightningcss-linux-x64-musl "1.19.0" lightningcss-win32-x64-msvc "1.19.0" -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + +linkifyjs@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.3.tgz#0edbc346428a7390a23ea2e5939f76112c9ae07f" + integrity sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -7344,7 +7022,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.debounce@4.0.8, lodash.debounce@^4.0.8: +lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== @@ -7359,7 +7037,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== -lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.13, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7388,7 +7066,12 @@ logkitty@^0.7.1: dayjs "^1.8.15" yargs "^15.1.0" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -7402,11 +7085,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7443,19 +7121,28 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +markdown-it@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + marky@^1.2.2: version "1.2.5" resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.5.tgz#55796b688cbd72390d2d399eaaf1832c9413e3c0" integrity sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q== -match-sorter@^6.0.2: - version "6.3.4" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.4.tgz#afa779d8e922c81971fbcb4781c7003ace781be7" - integrity sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg== - dependencies: - "@babel/runtime" "^7.23.8" - remove-accents "0.5.0" - md5-file@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" @@ -7486,10 +7173,143 @@ md5hex@^1.0.0: resolved "https://registry.yarnpkg.com/md5hex/-/md5hex-1.0.0.tgz#ed74b477a2ee9369f75efee2f08d5915e52a42e8" integrity sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ== -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + +mdast-util-find-and-replace@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== + dependencies: + "@types/mdast" "^3.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" + +mdast-util-from-markdown@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== + dependencies: + "@types/mdast" "^3.0.0" + ccount "^2.0.0" + mdast-util-find-and-replace "^2.0.0" + micromark-util-character "^1.0.0" + +mdast-util-gfm-footnote@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-util-normalize-identifier "^1.0.0" + +mdast-util-gfm-strikethrough@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== + dependencies: + "@types/mdast" "^3.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm-task-list-item@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + +mdast-util-gfm@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-gfm-autolink-literal "^1.0.0" + mdast-util-gfm-footnote "^1.0.0" + mdast-util-gfm-strikethrough "^1.0.0" + mdast-util-gfm-table "^1.0.0" + mdast-util-gfm-task-list-item "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + +mdast-util-to-hast@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" mdn-data@2.0.28: version "2.0.28" @@ -7501,7 +7321,12 @@ mdn-data@2.0.30: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== -memoize-one@^5.0.0, memoize-one@^5.2.1: +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + +memoize-one@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== @@ -7526,53 +7351,53 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-transformer@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.8.tgz#2951eeab76630b3c59f3874d04f4f12a6e73b2bd" - integrity sha512-TTzNwRZb2xxyv4J/+yqgtDAP2qVqH3sahsnFu6Xv4SkLqzrivtlnyUbaeTdJ9JjtADJUEjCbgbFgUVafrXdR9Q== +metro-babel-transformer@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.9.tgz#7051ba377b7d2140abd23f4846bbbb1e81fea99b" + integrity sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ== dependencies: "@babel/core" "^7.20.0" hermes-parser "0.20.1" nullthrows "^1.1.1" -metro-cache-key@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.8.tgz#d57af9c25f9fe7e755644594d602ef89124ee06b" - integrity sha512-qWKzxrLsRQK5m3oH8ePecqCc+7PEhR03cJE6Z6AxAj0idi99dHOSitTmY0dclXVB9vP2tQIAE8uTd8xkYGk8fA== +metro-cache-key@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.9.tgz#a04cbb0a7828509bb10dde9789ef761c0c60bc3d" + integrity sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg== -metro-cache@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.8.tgz#bc7d38611e4f31686a99045d4f2956c0bff4dd3b" - integrity sha512-5svz+89wSyLo7BxdiPDlwDTgcB9kwhNMfNhiBZPNQQs1vLFXxOkILwQiV5F2EwYT9DEr6OPZ0hnJkZfRQ8lDYQ== +metro-cache@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.9.tgz#b914318a90dbcd51b4c27836184519c441ba5123" + integrity sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w== dependencies: - metro-core "0.80.8" + metro-core "0.80.9" rimraf "^3.0.2" -metro-config@0.80.8, metro-config@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.8.tgz#1961feed6334601951ea72600901dafade56a973" - integrity sha512-VGQJpfJawtwRzGzGXVUoohpIkB0iPom4DmSbAppKfumdhtLA8uVeEPp2GM61kL9hRvdbMhdWA7T+hZFDlo4mJA== +metro-config@0.80.9, metro-config@^0.80.3: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.9.tgz#4eb6948b0ddc7c38d9d4ba8ddf22a67ca1c2bc06" + integrity sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg== dependencies: connect "^3.6.5" cosmiconfig "^5.0.5" jest-validate "^29.6.3" - metro "0.80.8" - metro-cache "0.80.8" - metro-core "0.80.8" - metro-runtime "0.80.8" + metro "0.80.9" + metro-cache "0.80.9" + metro-core "0.80.9" + metro-runtime "0.80.9" -metro-core@0.80.8, metro-core@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.8.tgz#85cf9745e767a33fe96bc5f166b71e213a482978" - integrity sha512-g6lud55TXeISRTleW6SHuPFZHtYrpwNqbyFIVd9j9Ofrb5IReiHp9Zl8xkAfZQp8v6ZVgyXD7c130QTsCz+vBw== +metro-core@0.80.9, metro-core@^0.80.3: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.9.tgz#3af21d0b09d71ec9c0840f028bffb36bc3619727" + integrity sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg== dependencies: lodash.throttle "^4.1.1" - metro-resolver "0.80.8" + metro-resolver "0.80.9" -metro-file-map@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.8.tgz#216e54db4dc8496815bd38bb806d469c5f5b66fd" - integrity sha512-eQXMFM9ogTfDs2POq7DT2dnG7rayZcoEgRbHPXvhUWkVwiKkro2ngcBE++ck/7A36Cj5Ljo79SOkYwHaWUDYDw== +metro-file-map@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.9.tgz#ed8783f6e35dfc005794344c2a9fcd6e914885aa" + integrity sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ== dependencies: anymatch "^3.0.3" debug "^2.2.0" @@ -7587,55 +7412,55 @@ metro-file-map@0.80.8: optionalDependencies: fsevents "^2.3.2" -metro-minify-terser@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.8.tgz#166413d2286900e7fd764aa30497a1596bc18c00" - integrity sha512-y8sUFjVvdeUIINDuW1sejnIjkZfEF+7SmQo0EIpYbWmwh+kq/WMj74yVaBWuqNjirmUp1YNfi3alT67wlbBWBQ== +metro-minify-terser@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.9.tgz#2b7798cba2bd4bd69cc5ce05a45bf66291542f83" + integrity sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A== dependencies: terser "^5.15.0" -metro-resolver@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.8.tgz#bcc8f8d7f874a9c5fee9ebbde8541d6dc88783df" - integrity sha512-JdtoJkP27GGoZ2HJlEsxs+zO7jnDUCRrmwXJozTlIuzLHMRrxgIRRby9fTCbMhaxq+iA9c+wzm3iFb4NhPmLbQ== +metro-resolver@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.9.tgz#bae9120a0553e0cb59da6429e83a7e97465cc1a8" + integrity sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w== -metro-runtime@0.80.8, metro-runtime@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.8.tgz#8f265369c05d9a3f05f9915842fac5d4e93f44bd" - integrity sha512-2oScjfv6Yb79PelU1+p8SVrCMW9ZjgEiipxq7jMRn8mbbtWzyv3g8Mkwr+KwOoDFI/61hYPUbY8cUnu278+x1g== +metro-runtime@0.80.9, metro-runtime@^0.80.3: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.9.tgz#665312bd4e4d38fea921b3153d6ab47846eb4f08" + integrity sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg== dependencies: "@babel/runtime" "^7.0.0" -metro-source-map@0.80.8, metro-source-map@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.8.tgz#fe92c2b82739c34cf46372a2be07d4e9cac8eb09" - integrity sha512-+OVISBkPNxjD4eEKhblRpBf463nTMk3KMEeYS8Z4xM/z3qujGJGSsWUGRtH27+c6zElaSGtZFiDMshEb8mMKQg== +metro-source-map@0.80.9, metro-source-map@^0.80.3: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.9.tgz#df8f673137548f37ab9f9dcfa771b354a452cfab" + integrity sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw== dependencies: "@babel/traverse" "^7.20.0" "@babel/types" "^7.20.0" invariant "^2.2.4" - metro-symbolicate "0.80.8" + metro-symbolicate "0.80.9" nullthrows "^1.1.1" - ob1 "0.80.8" + ob1 "0.80.9" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.8.tgz#881afc90453450208bf519b22e54962fc909d432" - integrity sha512-nwhYySk79jQhwjL9QmOUo4wS+/0Au9joEryDWw7uj4kz2yvw1uBjwmlql3BprQCBzRdB3fcqOP8kO8Es+vE31g== +metro-symbolicate@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.9.tgz#8d1d19d26ebb36b9d13dbd29814fdd71d6009db7" + integrity sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA== dependencies: invariant "^2.2.4" - metro-source-map "0.80.8" + metro-source-map "0.80.9" nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.8.tgz#2ed3162cec7fa7549279a6031e6d910198332a77" - integrity sha512-sSu8VPL9Od7w98MftCOkQ1UDeySWbsIAS5I54rW22BVpPnI3fQ42srvqMLaJUQPjLehUanq8St6OMBCBgH/UWw== +metro-transform-plugins@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.9.tgz#473a2c0a9e48043210547abe61cdeedb77725422" + integrity sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" @@ -7643,28 +7468,28 @@ metro-transform-plugins@0.80.8: "@babel/traverse" "^7.20.0" nullthrows "^1.1.1" -metro-transform-worker@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.8.tgz#df3bc21928e1c99b077cd1e2feec9f13d6c351c6" - integrity sha512-+4FG3TQk3BTbNqGkFb2uCaxYTfsbuFOCKMMURbwu0ehCP8ZJuTUramkaNZoATS49NSAkRgUltgmBa4YaKZ5mqw== +metro-transform-worker@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.9.tgz#f1d8ef4f77228bb7e1d20d3c06934166e8ee3b28" + integrity sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/parser" "^7.20.0" "@babel/types" "^7.20.0" - metro "0.80.8" - metro-babel-transformer "0.80.8" - metro-cache "0.80.8" - metro-cache-key "0.80.8" - metro-minify-terser "0.80.8" - metro-source-map "0.80.8" - metro-transform-plugins "0.80.8" + metro "0.80.9" + metro-babel-transformer "0.80.9" + metro-cache "0.80.9" + metro-cache-key "0.80.9" + metro-minify-terser "0.80.9" + metro-source-map "0.80.9" + metro-transform-plugins "0.80.9" nullthrows "^1.1.1" -metro@0.80.8, metro@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.8.tgz#42faa80ea8f1c43bea022b55baa3162e90878868" - integrity sha512-in7S0W11mg+RNmcXw+2d9S3zBGmCARDxIwoXJAmLUQOQoYsRP3cpGzyJtc7WOw8+FXfpgXvceD0u+PZIHXEL7g== +metro@0.80.9, metro@^0.80.3: + version "0.80.9" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.9.tgz#de3c2011df62036520d51d040d2dde0d015aecb6" + integrity sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.20.0" @@ -7687,18 +7512,18 @@ metro@0.80.8, metro@^0.80.3: jest-worker "^29.6.3" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.80.8" - metro-cache "0.80.8" - metro-cache-key "0.80.8" - metro-config "0.80.8" - metro-core "0.80.8" - metro-file-map "0.80.8" - metro-resolver "0.80.8" - metro-runtime "0.80.8" - metro-source-map "0.80.8" - metro-symbolicate "0.80.8" - metro-transform-plugins "0.80.8" - metro-transform-worker "0.80.8" + metro-babel-transformer "0.80.9" + metro-cache "0.80.9" + metro-cache-key "0.80.9" + metro-config "0.80.9" + metro-core "0.80.9" + metro-file-map "0.80.9" + metro-resolver "0.80.9" + metro-runtime "0.80.9" + metro-source-map "0.80.9" + metro-symbolicate "0.80.9" + metro-transform-plugins "0.80.9" + metro-transform-worker "0.80.9" mime-types "^2.1.27" node-fetch "^2.2.0" nullthrows "^1.1.1" @@ -7710,7 +7535,280 @@ metro@0.80.8, metro@^0.80.3: ws "^7.5.1" yargs "^17.6.2" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-extension-gfm-autolink-literal@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-extension-gfm-footnote@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-strikethrough@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-tagfilter@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-gfm-task-list-item@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== + dependencies: + micromark-extension-gfm-autolink-literal "^1.0.0" + micromark-extension-gfm-footnote "^1.0.0" + micromark-extension-gfm-strikethrough "^1.0.0" + micromark-extension-gfm-table "^1.0.0" + micromark-extension-gfm-tagfilter "^1.0.0" + micromark-extension-gfm-task-list-item "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -7718,11 +7816,6 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== - mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -7762,13 +7855,6 @@ mimic-fn@^2.1.0: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -7795,7 +7881,7 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@3.3.6, minipass@^3.0.0, minipass@^3.1.1: +minipass@^3.0.0, minipass@^3.1.1: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -7807,11 +7893,6 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -7832,10 +7913,10 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -moment@^2.29.4: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== mrmime@^1.0.0: version "1.0.1" @@ -7875,37 +7956,11 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" - integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== - dependencies: - big-integer "^1.6.16" - -nanoid@^3.1.23, nanoid@^3.3.1, nanoid@^3.3.7: +nanoid@^3.1.23, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -nativewind@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/nativewind/-/nativewind-2.0.11.tgz#aaa80a65b663a49856b26bd4f3153161f70299d7" - integrity sha512-qCEXUwKW21RYJ33KRAJl3zXq2bCq82WoI564fI21D/TiqhfmstZOqPN53RF8qK1NDK6PGl56b2xaTxgObEePEg== - dependencies: - "@babel/generator" "^7.18.7" - "@babel/helper-module-imports" "7.18.6" - "@babel/types" "7.19.0" - css-mediaquery "^0.1.2" - css-to-react-native "^3.0.0" - micromatch "^4.0.5" - postcss "^8.4.12" - postcss-calc "^8.2.4" - postcss-color-functional-notation "^4.2.2" - postcss-css-variables "^0.18.0" - postcss-nested "^5.0.6" - react-is "^18.1.0" - use-sync-external-store "^1.1.0" - natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -7993,20 +8048,11 @@ node-stream-zip@^1.9.1: resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== -normalize-path@^3.0.0, normalize-path@~3.0.0: +normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - npm-package-arg@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-7.0.0.tgz#52cdf08b491c0c59df687c4c925a89102ef794a5" @@ -8044,25 +8090,20 @@ nullthrows@^1.1.1: integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== nwsapi@^2.2.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + version "2.2.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.9.tgz#7f3303218372db2e9f27c27766bcfc59ae7e61c6" + integrity sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg== -ob1@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.8.tgz#08be1b8398d004719074ad702c975a5c7e1b29f2" - integrity sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA== +ob1@0.80.9: + version "0.80.9" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.9.tgz#4ae3edd807536097674ff943509089f5d4e0649f" + integrity sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" @@ -8120,11 +8161,6 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== - on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -8190,16 +8226,16 @@ open@^8.0.4, open@^8.3.0: is-wsl "^2.2.0" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" ora@3.4.0, ora@^3.4.0: version "3.4.0" @@ -8228,6 +8264,11 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +orderedmap@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" + integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -8330,6 +8371,11 @@ parse-png@^2.1.0: dependencies: pngjs "^3.3.0" +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^7.0.0, parse5@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" @@ -8385,14 +8431,6 @@ path-parse@^1.0.5, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" - integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -8403,7 +8441,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -8413,11 +8451,6 @@ picomatch@^3.0.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -8461,82 +8494,12 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-calc@^8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-color-functional-notation@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" - integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-css-variables@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz#d97b6da19e86245eb817006e11117382f997bb93" - integrity sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q== - dependencies: - balanced-match "^1.0.0" - escape-string-regexp "^1.0.3" - extend "^3.0.1" - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" - integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== - dependencies: - postcss-selector-parser "^6.0.6" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.12, postcss@^8.4.23, postcss@~8.4.32: +postcss@~8.4.32: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -8550,11 +8513,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -8628,19 +8586,172 @@ prompts@^2.0.1, prompts@^2.2.1, prompts@^2.3.2, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@15.8.1, prop-types@^15.5.10, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +prosemirror-changeset@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz#dae94b63aec618fac7bb9061648e6e2a79988383" + integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== + dependencies: + prosemirror-transform "^1.0.0" + +prosemirror-collab@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz#0e8c91e76e009b53457eb3b3051fb68dad029a33" + integrity sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ== + dependencies: + prosemirror-state "^1.0.0" + +prosemirror-commands@^1.0.0, prosemirror-commands@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz#e94aeea52286f658cd984270de9b4c3fff580852" + integrity sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-dropcursor@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz#49b9fb2f583e0d0f4021ff87db825faa2be2832d" + integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" + +prosemirror-gapcursor@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz#5fa336b83789c6199a7341c9493587e249215cb4" + integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== + dependencies: + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" + +prosemirror-history@^1.0.0, prosemirror-history@^1.3.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.4.0.tgz#1edbce630aaf21b808e5a5cd798a09976ecb1827" + integrity sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ== + dependencies: + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.31.0" + rope-sequence "^1.3.0" + +prosemirror-inputrules@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz#ef1519bb2cb0d1e0cec74bad1a97f1c1555068bb" + integrity sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz#14a54763a29c7b2704f561088ccf3384d14eb77e" + integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== + dependencies: + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" + +prosemirror-markdown@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz#d2de09d37897abf7adb6293d925ff132dac5b0a6" + integrity sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ== + dependencies: + markdown-it "^14.0.0" + prosemirror-model "^1.0.0" + +prosemirror-menu@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz#3cfdc7c06d10f9fbd1bce29082c498bd11a0a79a" + integrity sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA== + dependencies: + crelt "^1.0.0" + prosemirror-commands "^1.0.0" + prosemirror-history "^1.0.0" + prosemirror-state "^1.0.0" + +prosemirror-model@^1.0.0, prosemirror-model@^1.18.3, prosemirror-model@^1.19.0, prosemirror-model@^1.19.4, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.8.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.21.0.tgz#2d69ed04b4e7c441c3eb87c1c964fab4f9b217df" + integrity sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA== + dependencies: + orderedmap "^2.0.0" + +prosemirror-schema-basic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz#6695f5175e4628aab179bf62e5568628b9cfe6c7" + integrity sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw== + dependencies: + prosemirror-model "^1.19.0" + +prosemirror-schema-list@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz#05374702cf35a3ba5e7ec31079e355a488d52519" + integrity sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.7.3" + +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.3.tgz#94aecf3ffd54ec37e87aa7179d13508da181a080" + integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.27.0" + +prosemirror-tables@^1.3.4, prosemirror-tables@^1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz#9d296bd432d2bc7dca90f14e5c3b5c5f61277f7a" + integrity sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA== + dependencies: + prosemirror-keymap "^1.1.2" + prosemirror-model "^1.8.1" + prosemirror-state "^1.3.1" + prosemirror-transform "^1.2.1" + prosemirror-view "^1.13.3" + +prosemirror-trailing-node@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz#233ddcbda72de06f9b5d758d2a65a8cac482ea10" + integrity sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA== + dependencies: + "@remirror/core-constants" "^2.0.2" + escape-string-regexp "^4.0.0" + +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.2, prosemirror-transform@^1.7.3, prosemirror-transform@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz#81fd1fbd887929a95369e6dd3d240c23c19313f8" + integrity sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg== + dependencies: + prosemirror-model "^1.21.0" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.31.4, prosemirror-view@^1.32.7: + version "1.33.6" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.33.6.tgz#85804eb922411af8e300a07f4f376722b15900b9" + integrity sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw== + dependencies: + prosemirror-model "^1.20.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" psl@^1.1.33: version "1.9.0" @@ -8655,10 +8766,10 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== punycode@^2.1.0, punycode@^2.1.1: version "2.3.1" @@ -8675,23 +8786,7 @@ qrcode-terminal@0.11.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz#ffc6c28a2fc0bfb47052b47e23f4f446a5fbdb9e" integrity sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ== -qs@^6.11.2: - version "6.12.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== - dependencies: - side-channel "^1.0.6" - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -query-string@^7.1.0, query-string@^7.1.3: +query-string@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== @@ -8739,9 +8834,9 @@ rc@~1.2.7: strip-json-comments "~2.0.1" react-devtools-core@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.1.0.tgz#3396494ac94b21602cac4fd657d600e0b52f4a0b" - integrity sha512-NRtLBqYVLrIY+lOa2oTpFiAhI7Hru0AUXI0tP9neCyaPPAzlZyeH0i+VZ0shIyRTJbpvyqbD/uCsewA2hpfZHw== + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.2.0.tgz#072ecd2d84d3653817cc11e4b16f60a3c2b705f9" + integrity sha512-vZK+/gvxxsieAoAyYaiRIVFxlajb7KXhgBDV7OsoMzaAE+IqGpoxusBjIgq5ibqA2IloKu0p9n7tE68z1xs18A== dependencies: shell-quote "^1.6.1" ws "^7" @@ -8754,7 +8849,15 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-fast-compare@^3.2.0: +react-dom@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-fast-compare@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== @@ -8764,26 +8867,20 @@ react-freeze@^1.0.0: resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.4.tgz#cbbea2762b0368b05cbe407ddc9d518c57c6f3ad" integrity sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA== -react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" +react-icons@^4.3.1: + version "4.12.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" + integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== -react-hook-form@^7.51.2: - version "7.51.3" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.3.tgz#7486dd2d52280b6b28048c099a98d2545931cab3" - integrity sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ== +react-icons@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.2.1.tgz#28c2040917b2a2eda639b0f797bff1888e018e4a" + integrity sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw== -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.1.0, react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" @@ -8795,37 +8892,10 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-native-calendars@^1.1304.1: - version "1.1304.1" - resolved "https://registry.yarnpkg.com/react-native-calendars/-/react-native-calendars-1.1304.1.tgz#a09f7f8eee84d8634c3fe2de5e293fa7e8f12077" - integrity sha512-D1aU5lLhi7KCCCeHhKOkcC41K8s3paiiIfMaOQx6NezCbgKHelqT01WPpAZLh3Cm0QTC5EZo0oDPD0mCdKrDgQ== - dependencies: - hoist-non-react-statics "^3.3.1" - lodash "^4.17.15" - memoize-one "^5.2.1" - prop-types "^15.5.10" - react-native-swipe-gestures "^1.0.5" - recyclerlistview "^4.0.0" - xdate "^0.8.0" - optionalDependencies: - moment "^2.29.4" - -react-native-confirmation-code-field@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/react-native-confirmation-code-field/-/react-native-confirmation-code-field-7.4.0.tgz#58cc2d5adad59882d1805bf164cd6099d432d21e" - integrity sha512-Kw7rD0RXi6vZnt0Y67nkSW2wYmZFdnxJ23yxkKm3jqwvSxAvaA1NP3h3MHSPmJd25l0WK/+fjXOeCliDqWZ9rw== - -react-native-element-dropdown@^2.10.4: - version "2.10.4" - resolved "https://registry.yarnpkg.com/react-native-element-dropdown/-/react-native-element-dropdown-2.10.4.tgz#58d8a5e38d2a3fb74498c195bd775d9e1536e6bd" - integrity sha512-sbzByNSQmS3iZuNxzeqs0L04MrYQt8uSNUcmnAZAN/vi5IqZ7N0TPHzZ996PSttpYrF2NkiByd+Zlw9Em+VgAw== - dependencies: - lodash "^4.17.21" - -react-native-gesture-handler@^2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.16.0.tgz#45a00b5988e74ebc58f130c8d1443319c8e678db" - integrity sha512-1hFkx7RIfeJSyTQQ0Nkv4icFVZ5+XjQkd47OgZMBFzoB7ecL+nFSz8KLi3OCWOhq+nbHpSPlSG5VF3CQNCJpWA== +react-native-gesture-handler@^2.16.2: + version "2.16.2" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.16.2.tgz#032bd2a07334292d7f6cff1dc9d1ec928f72e26d" + integrity sha512-vGFlrDKlmyI+BT+FemqVxmvO7nqxU33cgXVsn6IKAFishvlG3oV2Ds67D5nPkHMea8T+s1IcuMm0bF8ntZtAyg== dependencies: "@egjs/hammerjs" "^2.0.17" hoist-non-react-statics "^3.3.0" @@ -8833,38 +8903,19 @@ react-native-gesture-handler@^2.16.0: lodash "^4.17.21" prop-types "^15.7.2" -react-native-loading-spinner-overlay@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/react-native-loading-spinner-overlay/-/react-native-loading-spinner-overlay-3.0.1.tgz#092481b8cce157d3af5ef942f845ad981f96bd36" - integrity sha512-4GdR54HQnKg2HPSSisVizfTLuyhSh4splY9eb8mKiYF1Ihjn/5EmdNo5bN3S7uKPFRC3WLzIZIouX6G6fXfnjw== - -react-native-maps@1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/react-native-maps/-/react-native-maps-1.14.0.tgz#1e5cac8e88d80002c512dd4763a205493a1ae58d" - integrity sha512-ai7h4UdRLGPFCguz1fI8n4sKLEh35nZXHAH4nSWyAeHGrN8K9GjICu9Xd4Q5Ok4h+WwrM6Xz5pGbF3Qm1tO6iQ== - dependencies: - "@types/geojson" "^7946.0.13" - -react-native-menu@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/react-native-menu/-/react-native-menu-0.23.0.tgz#3c023239aed95d419275df50c199982ad7eb062b" - integrity sha512-sSNqvyTH7HT/8n2MPn14ysg5FEgM4yvV5dYXT515WQGMSFm1K35Rvi4G2Ku+EW9pSyDgRvFSCgJnWHWi0gtmSQ== - dependencies: - create-react-class "^15.6.0" - prop-types "^15.5.10" - react-timer-mixin "^0.13.3" - -react-native-open-maps@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/react-native-open-maps/-/react-native-open-maps-0.4.3.tgz#767c6621dcf558241afe78a62c5f7924031f270e" - integrity sha512-v0F6NHABCG8/7112baa3LqH29fndxSLb2PGWGTPa/QGoQ3rPiXQgCGsASUQmUpQkrSL5DnnmXo5w2d06Q6euBA== +react-native-helmet-async@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-native-helmet-async/-/react-native-helmet-async-2.0.4.tgz#93f53a1ff22d6898039688a541653a2d6b6866bb" + integrity sha512-m3CkXWss6B1dd6mCMleLpzDCJJGGaHOLQsUzZv8kAASJmMfmVT4d2fx375iXKTRWT25ThBfae3dECuX5cq/8hg== dependencies: - query-string "^7.1.0" + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" -react-native-reanimated@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.8.1.tgz#45c13d4bedebef8df3d5a8756f25072de65960d7" - integrity sha512-EdM0vr3JEaNtqvstqESaPfOBy0gjYBkr1iEolWJ82Ax7io8y9OVUIphgsLKTB36CtR1XtmBw0RZVj7KArc7ZVA== +react-native-reanimated@~3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.11.0.tgz#d4265d4e0232623f5958ed60e1686ca884fc3452" + integrity sha512-BNw/XDgUfs8UhfY1X6IniU8kWpnotWGyt8qmQviaHisTi5lvwnaOdXQKfN1KGONx6ekdFRHRP5EFwLi0UajwKA== dependencies: "@babel/plugin-transform-arrow-functions" "^7.0.0-0" "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" @@ -8875,24 +8926,19 @@ react-native-reanimated@^3.8.1: convert-source-map "^2.0.0" invariant "^2.2.4" -react-native-safe-area-context@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.9.0.tgz#21a570ca3594cb4259ba65f93befaa60d91bcbd0" - integrity sha512-/OJD9Pb8IURyvn+1tWTszWPJqsbZ4hyHBU9P0xhOmk7h5owSuqL0zkfagU0pg7Vh0G2NKQkaPpUKUMMCUMDh/w== +react-native-safe-area-context@4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.10.1.tgz#29fb27395ff7dfa2fa38788a27226330d73a81cc" + integrity sha512-w8tCuowDorUkPoWPXmhqosovBr33YsukkwYCDERZFHAxIkx6qBadYxfeoaJ91nCQKjkNzGrK5qhoNOeSIcYSpA== -react-native-screens@~3.30.1: - version "3.30.1" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.30.1.tgz#254f5cbbeed649492da112756f85ecae3ccf313e" - integrity sha512-/muEvjocCtFb+j5J3YmLvB25+f4rIU8hnnxgGTkXcAf2omPBY8uhPjJaaFUlvj64VEoEzJcRpugbXWsjfPPIFg== +react-native-screens@3.31.1: + version "3.31.1" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.31.1.tgz#909a890f669e32b0fb1b1410278b71ad2f8238f6" + integrity sha512-8fRW362pfZ9y4rS8KY5P3DFScrmwo/vu1RrRMMx0PNHbeC9TLq0Kw1ubD83591yz64gLNHFLTVkTJmWeWCXKtQ== dependencies: react-freeze "^1.0.0" warn-once "^0.1.0" -react-native-size-matters@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/react-native-size-matters/-/react-native-size-matters-0.4.2.tgz#4348bdd6fc47383f60326d58ad69870c998a5f9a" - integrity sha512-DKE3f/sdcozd24oASgkP1iGg+YU3HoajRa5k3a4wkRzpiqREq8SGX12Y5zBgAt/8IivLQoTMYkyQu1/Giuy+zQ== - react-native-svg-transformer@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/react-native-svg-transformer/-/react-native-svg-transformer-1.3.0.tgz#ef01cdd82c1fc0611dd91950457b61cf74c4df3a" @@ -8903,26 +8949,13 @@ react-native-svg-transformer@^1.3.0: "@svgr/plugin-svgo" "^8.1.0" path-dirname "^1.0.2" -react-native-svg@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-15.1.0.tgz#07c75f29b1d641faba50144c7ccd21604b368420" - integrity sha512-p0Sx0EpQNk1nu6UcMEiB8K9P04n3J7s+pNYUwf1d/Yz+v4hk961VjuVqjyndgiEbHZyWiKWLZRVNuvLpwjPY2A== - dependencies: - css-select "^5.1.0" - css-tree "^1.1.3" - -react-native-swipe-gestures@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/react-native-swipe-gestures/-/react-native-swipe-gestures-1.0.5.tgz#a172cb0f3e7478ccd681fd36b8bfbcdd098bde7c" - integrity sha512-Ns7Bn9H/Tyw278+5SQx9oAblDZ7JixyzeOczcBK8dipQk2pD7Djkcfnf1nB/8RErAmMLL9iXgW0QHqiII8AhKw== - -react-native-web@~0.19.6: - version "0.19.10" - resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.19.10.tgz#5f7205f8909c0889bc89c9fde7c6e287defa7c63" - integrity sha512-IQoHiTQq8egBCVVwmTrYcFLgEFyb4LMZYEktHn4k22JMk9+QTCEz5WTfvr+jdNoeqj/7rtE81xgowKbfGO74qg== +react-native-web@~0.19.10: + version "0.19.11" + resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.19.11.tgz#1b96ac3cea9af4e1280fd5fa3b606b471f66edc3" + integrity sha512-51Qcjr0AtIgskwLqLsBByUMPs2nAWZ+6QF7x/siC72svNPcJ1/daXoPTNuHR2fX4oOrDATC4Vmc/SXOYPH19rw== dependencies: "@babel/runtime" "^7.18.6" - "@react-native/normalize-color" "^2.1.0" + "@react-native/normalize-colors" "^0.74.1" fbjs "^3.0.4" inline-style-prefixer "^6.0.1" memoize-one "^6.0.0" @@ -8930,22 +8963,22 @@ react-native-web@~0.19.6: postcss-value-parser "^4.2.0" styleq "^0.1.3" -react-native@0.74.0: - version "0.74.0" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.74.0.tgz#9f0901139424152216e1ae1b32773787a0158d41" - integrity sha512-Vpp9WPmkCm4TUH5YDxwQhqktGVon/yLpjbTgjgLqup3GglOgWagYCX3MlmK1iksIcqtyMJHMEWa+UEzJ3G9T8w== +react-native@0.74.1: + version "0.74.1" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.74.1.tgz#8f5f59636242eb1b90ff675d9fcc7f5b8b1c9913" + integrity sha512-0H2XpmghwOtfPpM2LKqHIN7gxy+7G/r1hwJHKLV6uoyXGC/gCojRtoo5NqyKrWpFC8cqyT6wTYCLuG7CxEKilg== dependencies: "@jest/create-cache-key-function" "^29.6.3" - "@react-native-community/cli" "13.6.4" - "@react-native-community/cli-platform-android" "13.6.4" - "@react-native-community/cli-platform-ios" "13.6.4" - "@react-native/assets-registry" "0.74.81" - "@react-native/codegen" "0.74.81" - "@react-native/community-cli-plugin" "0.74.81" - "@react-native/gradle-plugin" "0.74.81" - "@react-native/js-polyfills" "0.74.81" - "@react-native/normalize-colors" "0.74.81" - "@react-native/virtualized-lists" "0.74.81" + "@react-native-community/cli" "13.6.6" + "@react-native-community/cli-platform-android" "13.6.6" + "@react-native-community/cli-platform-ios" "13.6.6" + "@react-native/assets-registry" "0.74.83" + "@react-native/codegen" "0.74.83" + "@react-native/community-cli-plugin" "0.74.83" + "@react-native/gradle-plugin" "0.74.83" + "@react-native/js-polyfills" "0.74.83" + "@react-native/normalize-colors" "0.74.83" + "@react-native/virtualized-lists" "0.74.83" abort-controller "^3.0.0" anser "^1.4.9" ansi-regex "^5.0.0" @@ -8973,19 +9006,44 @@ react-native@0.74.0: ws "^6.2.2" yargs "^17.6.2" -react-query@^3.39.3: - version "3.39.3" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" - integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== +react-number-format@^5.3.1: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-5.3.4.tgz#4780522ba1fdaff20aaa0732716490c6758b8557" + integrity sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg== dependencies: - "@babel/runtime" "^7.5.5" - broadcast-channel "^3.4.1" - match-sorter "^6.0.2" + prop-types "^15.7.2" -react-refresh@0.14.0, react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== + dependencies: + "@types/use-sync-external-store" "^0.0.3" + use-sync-external-store "^1.0.0" + +react-refresh@^0.14.0, react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.7: + version "2.5.9" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.9.tgz#6a38e7d46043abc2c6b0fb39db650b9f2e38be3e" + integrity sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" react-shallow-renderer@^16.15.0: version "16.15.0" @@ -8995,6 +9053,15 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + react-test-renderer@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" @@ -9004,10 +9071,14 @@ react-test-renderer@18.2.0: react-shallow-renderer "^16.15.0" scheduler "^0.23.0" -react-timer-mixin@^0.13.3: - version "0.13.4" - resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" - integrity sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q== +react-textarea-autosize@8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" react@18.2.0: version "18.2.0" @@ -9016,12 +9087,12 @@ react@18.2.0: dependencies: loose-envify "^1.1.0" -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== +react@^18, react@^18.2.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: - pify "^2.3.0" + loose-envify "^1.1.0" readable-stream@^3.4.0: version "3.6.2" @@ -9045,13 +9116,6 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - readline@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" @@ -9067,14 +9131,15 @@ recast@^0.21.0: source-map "~0.6.1" tslib "^2.0.1" -recyclerlistview@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/recyclerlistview/-/recyclerlistview-4.2.0.tgz#a140149aaa470c9787a1426452651934240d69ef" - integrity sha512-uuBCi0c+ggqHKwrzPX4Z/mJOzsBbjZEAwGGmlwpD/sD7raXixdAbdJ6BTcAmuWG50Cg4ru9p12M94Njwhr/27A== - dependencies: - lodash.debounce "4.0.8" - prop-types "15.8.1" - ts-object-utils "0.0.5" +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== + +redux@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== reflect.getprototypeof@^1.0.4: version "1.0.6" @@ -9111,13 +9176,6 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -9147,10 +9205,109 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -remove-accents@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.5.0.tgz#77991f37ba212afba162e375b627631315bed687" - integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== +rehype-format@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/rehype-format/-/rehype-format-5.0.0.tgz#e51cc8edece2aee0e88e1efdd0625bc0cbef387b" + integrity sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-phrasing "^3.0.0" + hast-util-whitespace "^3.0.0" + html-whitespace-sensitive-tag-names "^3.0.0" + rehype-minify-whitespace "^6.0.0" + unist-util-visit-parents "^6.0.0" + +rehype-minify-whitespace@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.1.tgz#79729a0146aa97a9d43e1eb4b5884974e2f37e77" + integrity sha512-PPp4lWJiBPlePI/dv1BeYktbwkfgXkrK59MUa+tYbMPgleod+4DvFK2PLU0O0O60/xuhHfiR9GUIUlXTU8sRIQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-embedded "^2.0.0" + hast-util-is-element "^2.0.0" + hast-util-whitespace "^2.0.0" + unified "^10.0.0" + unist-util-is "^5.0.0" + +rehype-minify-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz#fe97c5e9e48c5629458166753f2249afaa2e1fd1" + integrity sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-whitespace "^3.0.0" + unist-util-is "^6.0.0" + +rehype-parse@^8.0.4: + version "8.0.5" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.5.tgz#ccffc21e08e288c7846614f8dc1dc23d603a4a80" + integrity sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^7.0.0" + parse5 "^6.0.0" + unified "^10.0.0" + +rehype-remark@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/rehype-remark/-/rehype-remark-9.1.2.tgz#b4ed84d7e692426c3269e72ec477906cec659c05" + integrity sha512-c0fG3/CrJ95zAQ07xqHSkdpZybwdsY7X5dNWvgL2XqLKZuqmG3+vk6kP/4miCnp+R+x/0uKKRSpfXb9aGR8Z5w== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + hast-util-to-mdast "^8.3.0" + unified "^10.0.0" + +rehype-stringify@^9.0.3: + version "9.0.4" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-9.0.4.tgz#31dbb9de6f5034c6964760a1b1083218059c4343" + integrity sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-to-html "^8.0.0" + unified "^10.0.0" + +remark-gfm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-gfm "^2.0.0" + micromark-extension-gfm "^2.0.0" + unified "^10.0.0" + +remark-parse@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" + +remark-rehype@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-hast "^12.1.0" + unified "^10.0.0" + +remark-stringify@^10.0.2: + version "10.0.3" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.3.tgz#83b43f2445c4ffbb35b606f967d121b2b6d69717" + integrity sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.0.0" + unified "^10.0.0" remove-trailing-slash@^0.1.0: version "0.1.1" @@ -9186,6 +9343,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reselect@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" + integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -9213,7 +9375,7 @@ resolve.exports@^2.0.0, resolve.exports@^2.0.2: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.2: +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.2: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -9259,13 +9421,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@3.0.2, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rimraf@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -9273,6 +9428,13 @@ rimraf@^2.6.2: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@~2.4.0: version "2.4.5" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" @@ -9287,6 +9449,11 @@ rimraf@~2.6.2: dependencies: glob "^7.1.3" +rope-sequence@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" + integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -9294,6 +9461,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" @@ -9352,10 +9526,10 @@ scheduler@0.24.0-canary-efb381bbf-20230505: dependencies: loose-envify "^1.1.0" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.0, scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -9377,18 +9551,6 @@ selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" @@ -9399,12 +9561,10 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== send@0.18.0, send@^0.18.0: version "0.18.0" @@ -9538,11 +9698,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - simple-plist@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" @@ -9596,13 +9751,6 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== - dependencies: - is-plain-obj "^1.0.0" - source-map-js@^1.0.1, source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" @@ -9644,6 +9792,11 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" @@ -9731,11 +9884,6 @@ stream-slice@^0.1.2: resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" integrity sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA== -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -9762,15 +9910,6 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.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.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -9780,15 +9919,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string.prototype.matchall@^4.0.10: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" @@ -9849,12 +9979,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: - ansi-regex "^5.0.1" + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" @@ -9930,19 +10061,6 @@ sucrase@3.34.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -sucrase@^3.32.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - sudo-prompt@9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.1.1.tgz#73853d729770392caec029e2470db9c221754db0" @@ -9998,9 +10116,9 @@ svg-parser@^2.0.4: integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.2.0.tgz#7a5dff2938d8c6096e00295c2390e8e652fa805d" - integrity sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" + integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== dependencies: "@trysound/sax" "0.2.0" commander "^7.2.0" @@ -10023,40 +10141,10 @@ synckit@^0.8.6: "@pkgr/core" "^0.1.0" tslib "^2.6.2" -tailwind-merge@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.3.0.tgz#27d2134fd00a1f77eca22bcaafdd67055917d286" - integrity sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA== - dependencies: - "@babel/runtime" "^7.24.1" - -tailwindcss@3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" - integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tar@^6.0.2, tar@^6.0.5: version "6.2.1" @@ -10116,9 +10204,9 @@ terminal-link@^2.1.1: supports-hyperlinks "^2.0.0" terser@^5.15.0: - version "5.30.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2" - integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== + version "5.31.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" + integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10171,6 +10259,13 @@ through@2: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tippy.js@^6.3.7: + version "6.3.7" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== + dependencies: + "@popperjs/core" "^2.9.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10201,9 +10296,9 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -10231,22 +10326,32 @@ traverse@~0.6.6: typedarray.prototype.slice "^1.0.3" which-typed-array "^1.1.15" +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trim-trailing-lines@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz#9aac7e89b09cb35badf663de7133c6de164f86df" + integrity sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-object-utils@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/ts-object-utils/-/ts-object-utils-0.0.5.tgz#95361cdecd7e52167cfc5e634c76345e90a26077" - integrity sha512-iV0GvHqOmilbIKJsfyfJY9/dNHCs969z3so90dQWsO1eMMozvTpnB1MEaUbb3FYtZTGjv5sIy/xmslEz0Rg2TA== - tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -10258,6 +10363,11 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +turbo-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/turbo-stream/-/turbo-stream-2.0.1.tgz#4daf74bc678ec1285b67ce42fe7a2852acdc3235" + integrity sha512-sm0ZtcX9YWh28p5X8t5McxC2uthrt9p+g0bGE0KTVFhnhNWefpSVCr+67zRNDUOfo4bpXwiOp7otO+dyQ7/y/A== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -10295,6 +10405,11 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +type-fest@^4.12.0: + version "4.18.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.18.2.tgz#8d765c42e7280a11f4d04fb77a00dacc417c8b05" + integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" @@ -10351,7 +10466,7 @@ typedarray.prototype.slice@^1.0.3: typed-array-buffer "^1.0.2" typed-array-byte-offset "^1.0.2" -typescript@^5.4.5: +typescript@~5.4.5: version "5.4.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== @@ -10361,6 +10476,11 @@ ua-parser-js@^1.0.35: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -10376,6 +10496,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@^6.10.1: + version "6.16.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.16.1.tgz#ff8f49c56e5a8629f92ad2ce00d4841b9619b19e" + integrity sha512-NeNiTT7ixpeiL1qOIU/xTVpHpVP0svmI6PwoCKaMGaI5AsHOaRdwqU/f7Fi9eyU4u03nd5U/BC8wmRMnS9nqoA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -10399,6 +10524,19 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unified@^10.0.0, unified@^10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -10427,6 +10565,72 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unist-util-find-after@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz#80c69c92b0504033638ce11973f4135f2c822e2d" + integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-generated@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -10447,28 +10651,20 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unload@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== - dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" - unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + version "1.0.15" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" + integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== dependencies: - escalade "^3.1.1" + escalade "^3.1.2" picocolors "^1.0.0" -uri-js@^4.2.2: +uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -10488,25 +10684,54 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -url@^0.11.0: - version "0.11.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" - integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== dependencies: - punycode "^1.4.1" - qs "^6.11.2" + tslib "^2.0.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== use-latest-callback@^0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.9.tgz#10191dc54257e65a8e52322127643a8940271e2a" integrity sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw== -use-sync-external-store@1.2.0, use-sync-external-store@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-prefers-color-scheme@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-prefers-color-scheme/-/use-prefers-color-scheme-1.1.3.tgz#18945cecbe33566f961fac1b90c079d1ce2d10b5" + integrity sha512-ZRgDfb5BFLum/Sud4SpZ+d1YcV+lRbsupw0qQ/rGy5kGrpE3KMUQgEQOKiQQSa4Wslex46n5fKFO+9FGMTosUQ== + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +use-sync-external-store@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -10537,6 +10762,16 @@ uuid@^8.0.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + v8-to-istanbul@^9.0.1: version "9.2.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" @@ -10563,11 +10798,42 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vfile-location@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== + dependencies: + "@types/unist" "^2.0.0" + vfile "^5.0.0" + +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + vlq@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== +w3c-keyname@^2.2.0: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -10603,6 +10869,11 @@ web-encoding@1.1.5: optionalDependencies: "@zxing/text-encoding" "0.9.0" +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + web-streams-polyfill@^3.1.1: version "3.3.3" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" @@ -10744,14 +11015,10 @@ wonka@^6.3.2: resolved "https://registry.yarnpkg.com/wonka/-/wonka-6.3.4.tgz#76eb9316e3d67d7febf4945202b5bdb2db534594" integrity sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wrap-ansi@^6.2.0: version "6.2.0" @@ -10771,15 +11038,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -10815,9 +11073,9 @@ ws@^7, ws@^7.5.1: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.11.0, ws@^8.12.1: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== xcode@^3.0.1: version "3.0.1" @@ -10827,11 +11085,6 @@ xcode@^3.0.1: simple-plist "^1.1.0" uuid "^7.0.3" -xdate@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/xdate/-/xdate-0.8.2.tgz#d7b033c00485d02695baf0044f4eacda3fc961a3" - integrity sha512-sNBlLfOC8S3V0vLDEUianQOXcTsc9j4lfeKU/klHe0RjHAYn0CXsSttumTot8dzalboV8gZbH38B+WcCIBjhFQ== - xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" @@ -10870,6 +11123,20 @@ xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y-prosemirror@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/y-prosemirror/-/y-prosemirror-1.2.1.tgz#a8b5c50b8fd445e556dfa831f295765f4ca022bd" + integrity sha512-czMBfB1eL2awqmOSxQM8cS/fsUOGE6fjvyPLInrh4crPxFiw67wDpwIW+EGBYKRa04sYbS0ScGj7ZgvWuDrmBQ== + dependencies: + lib0 "^0.2.42" + +y-protocols@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.6.tgz#66dad8a95752623443e8e28c0e923682d2c0d495" + integrity sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q== + dependencies: + lib0 "^0.2.85" + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -10890,10 +11157,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.1, yaml@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== +yaml@^2.2.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" + integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== yargs-parser@^18.1.2: version "18.1.3" @@ -10938,19 +11205,24 @@ yargs@^17.3.1, yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yjs@^13.6.1: + version "13.6.15" + resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.15.tgz#5a2402632aabf83e5baf56342b4c82fe40859306" + integrity sha512-moFv4uNYhp8BFxIk3AkpoAnnjts7gwdpiG8RtyFiKbMtxKCS0zVZ5wPaaGpwC3V2N/K8TK8MwtSI3+WO9CHWjQ== + dependencies: + lib0 "^0.2.86" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod@^3.22.4: - version "3.22.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" - integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== +zod@^3.23.6: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== -zustand@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848" - integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== - dependencies: - use-sync-external-store "1.2.0" +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/frontend/mobile/app/(app)/(tabs)/_components/club-homepage-card.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/club-homepage-card.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/club-homepage-card.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/club-homepage-card.tsx diff --git a/frontend/mobile/app/(app)/(tabs)/_components/event-homepage-card.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/event-homepage-card.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/event-homepage-card.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/event-homepage-card.tsx diff --git a/frontend/mobile/app/(app)/(tabs)/_components/faq-homepage-card.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/faq-homepage-card.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/faq-homepage-card.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/faq-homepage-card.tsx diff --git a/frontend/mobile/app/(app)/(tabs)/_components/following-header.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/following-header.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/following-header.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/following-header.tsx diff --git a/frontend/mobile/app/(app)/(tabs)/_components/happening-today.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/happening-today.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/happening-today.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/happening-today.tsx diff --git a/frontend/mobile/app/(app)/(tabs)/_components/homepage.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/homepage.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/homepage.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/homepage.tsx diff --git a/frontend/mobile/app/(app)/(tabs)/_components/recommended-clubs.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/recommended-clubs.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/recommended-clubs.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/recommended-clubs.tsx diff --git a/frontend/mobile/app/(app)/(tabs)/_components/upcoming-events.tsx b/frontend/old_mobile/app/(app)/(tabs)/_components/upcoming-events.tsx similarity index 100% rename from frontend/mobile/app/(app)/(tabs)/_components/upcoming-events.tsx rename to frontend/old_mobile/app/(app)/(tabs)/_components/upcoming-events.tsx diff --git a/frontend/old_mobile/app/(app)/(tabs)/_layout.tsx b/frontend/old_mobile/app/(app)/(tabs)/_layout.tsx new file mode 100644 index 000000000..8aa17c7b3 --- /dev/null +++ b/frontend/old_mobile/app/(app)/(tabs)/_layout.tsx @@ -0,0 +1,97 @@ +import React, { useEffect } from 'react'; +import { Text, View } from 'react-native'; + +import { Tabs } from 'expo-router'; + +import HomeSelectedIcon from '@/assets/images/svg/home-selected.svg'; +import HomeIcon from '@/assets/images/svg/home.svg'; +import NotificationIcon from '@/assets/images/svg/notification.svg'; +import ProfileSelectedIcon from '@/assets/images/svg/profile-selected.svg'; +import ProfileIcon from '@/assets/images/svg/profile.svg'; +import SearchSelectedIcon from '@/assets/images/svg/search-selected.svg'; +import SearchIcon from '@/assets/images/svg/search.svg'; +import { useAuthStore } from '@/hooks/use-auth'; + +const Layout = () => { + const { isLoggedIn, fetchUser, user } = useAuthStore(); + + useEffect(() => { + if (isLoggedIn) fetchUser(); + }, [isLoggedIn, fetchUser]); + + return ( + + ( + + ), + headerLeft: () => ( + + + Hi, {user?.first_name} + + + ), + headerRight: () => ( + + + + ), + headerShown: true, + tabBarIcon: ({ focused }) => + focused ? ( + + + + ) : ( + + + + ) + }} + redirect={!isLoggedIn} + /> + + focused ? ( + + + + ) : ( + + + + ) + }} + redirect={!isLoggedIn} + /> + + focused ? ( + + + + ) : ( + + + + ) + }} + redirect={!isLoggedIn} + /> + + ); +}; + +export default Layout; diff --git a/frontend/old_mobile/app/(app)/(tabs)/discover.tsx b/frontend/old_mobile/app/(app)/(tabs)/discover.tsx new file mode 100644 index 000000000..ee56ebb0a --- /dev/null +++ b/frontend/old_mobile/app/(app)/(tabs)/discover.tsx @@ -0,0 +1,143 @@ +import React from 'react'; +import { + SafeAreaView, + ScrollView, + Text, + TouchableOpacity, + View +} from 'react-native'; + +import { router } from 'expo-router'; + +import { useClubsQuery, useEventsQuery } from '@sac/lib'; + +import { SearchBar } from '@/app/(app)/search/_components/search-bar'; +import { TopSearch } from '@/app/(app)/search/_components/top-search'; + +import { ClubHomePageCard } from './_components/club-homepage-card'; +import { EventHomePageCardHorizontal } from './_components/event-homepage-card'; + +const Discover = () => { + const { + data: events, + isLoading: eIsLoading, + error: eError + } = useEventsQuery({}); + + const { + data: clubs, + isLoading: cIsLoading, + error: cError + } = useClubsQuery({}); + + if (eIsLoading || cIsLoading) { + return Loading...; + } + + if (eError || cError) { + return Error...; + } + + return ( + + + { + router.push('/(app)/search/recents'); + return undefined; + }} + /> + + + Top Searches + + {/* FIXME: this and discover clubs have the same layout, make like a 2d grid scroll view elem */} + + + + + + + + + + + + + + + + Discover Clubs + + + + View All + + + + + + + {clubs?.map((club) => { + return ; + })} + + + + + + Discover Events + + + + View All + + + + + {events?.map((event) => { + return ( + + ); + })} + + + + + ); +}; + +export default Discover; diff --git a/frontend/old_mobile/app/(app)/(tabs)/index.tsx b/frontend/old_mobile/app/(app)/(tabs)/index.tsx new file mode 100644 index 000000000..ea130844c --- /dev/null +++ b/frontend/old_mobile/app/(app)/(tabs)/index.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { SectionList, Text, View } from 'react-native'; + +import { StatusBar } from 'expo-status-bar'; + +import { useUserFollowingQuery } from '@sac/lib'; + +import { useAuthStore } from '@/hooks/use-auth'; + +import { HappeningToday } from './_components/happening-today'; +import { RecommendedClubs } from './_components/recommended-clubs'; +import { UpcomingEvents } from './_components/upcoming-events'; + +const HomePage = () => { + const { user } = useAuthStore(); + const { + data: clubs, + isLoading: cIsLoading, + error: cError + } = useUserFollowingQuery(user?.id!); + return ( + <> + + + {cIsLoading && Loading...} + {cError && Error...} + {clubs && clubs.length === 0 && ( + Follow some clubs to see them here! + )} + {clubs && clubs.length > 0 && ( + Following Clubs: {clubs.length} + )} + {clubs && + clubs.map((club) => {club.name})} + + + ] + }, + { + title: 'Upcoming Events', + data: [] + }, + { + title: 'Recommended Clubs', + data: [] + } + ]} + keyExtractor={(_, index) => index.toString()} + renderItem={({ item }) => {item}} + renderSectionHeader={({ section: { title } }) => ( + + {title} + + )} + stickyHeaderHiddenOnScroll={true} + stickySectionHeadersEnabled={false} + /> + + + ); +}; + +export default HomePage; diff --git a/frontend/old_mobile/app/(app)/(tabs)/profile.tsx b/frontend/old_mobile/app/(app)/(tabs)/profile.tsx new file mode 100644 index 000000000..98d5bd882 --- /dev/null +++ b/frontend/old_mobile/app/(app)/(tabs)/profile.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { SafeAreaView, Text, View } from 'react-native'; + +import { Button } from '@/components/button'; +import { useAuthStore } from '@/hooks/use-auth'; + +const Profile = () => { + const { onLogout, user } = useAuthStore(); + + const handleSignOut = async () => { + onLogout(); + }; + + return ( + + + Welcome {user?.first_name} + + + + ); +}; + +export default Profile; diff --git a/frontend/mobile/app/(app)/_components/club-kebab.tsx b/frontend/old_mobile/app/(app)/_components/club-kebab.tsx similarity index 100% rename from frontend/mobile/app/(app)/_components/club-kebab.tsx rename to frontend/old_mobile/app/(app)/_components/club-kebab.tsx diff --git a/frontend/mobile/app/(app)/_components/event-kebab.tsx b/frontend/old_mobile/app/(app)/_components/event-kebab.tsx similarity index 100% rename from frontend/mobile/app/(app)/_components/event-kebab.tsx rename to frontend/old_mobile/app/(app)/_components/event-kebab.tsx diff --git a/frontend/old_mobile/app/(app)/_layout.tsx b/frontend/old_mobile/app/(app)/_layout.tsx new file mode 100644 index 000000000..f283ca7bd --- /dev/null +++ b/frontend/old_mobile/app/(app)/_layout.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { View } from 'react-native'; + +import { Stack } from 'expo-router'; + +import { Arrow } from '@/components/arrow'; + +import { ClubKebab } from './_components/club-kebab'; +import { EventKabab } from './_components/event-kebab'; + +const Layout = () => { + return ( + + + , + headerRight: () => + }} + /> + , + headerRight: () => + }} + /> + ( + + ), + headerLeft: () => + }} + /> + + + ); +}; + +export default Layout; diff --git a/frontend/mobile/app/(app)/club/[id].tsx b/frontend/old_mobile/app/(app)/club/[id].tsx similarity index 100% rename from frontend/mobile/app/(app)/club/[id].tsx rename to frontend/old_mobile/app/(app)/club/[id].tsx diff --git a/frontend/mobile/app/(app)/club/_components/admin-card.tsx b/frontend/old_mobile/app/(app)/club/_components/admin-card.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/_components/admin-card.tsx rename to frontend/old_mobile/app/(app)/club/_components/admin-card.tsx diff --git a/frontend/mobile/app/(app)/club/_components/all-events.tsx b/frontend/old_mobile/app/(app)/club/_components/all-events.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/_components/all-events.tsx rename to frontend/old_mobile/app/(app)/club/_components/all-events.tsx diff --git a/frontend/mobile/app/(app)/club/_components/all-faqs.tsx b/frontend/old_mobile/app/(app)/club/_components/all-faqs.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/_components/all-faqs.tsx rename to frontend/old_mobile/app/(app)/club/_components/all-faqs.tsx diff --git a/frontend/mobile/app/(app)/club/_components/application-form-bottom-sheet.tsx b/frontend/old_mobile/app/(app)/club/_components/application-form-bottom-sheet.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/_components/application-form-bottom-sheet.tsx rename to frontend/old_mobile/app/(app)/club/_components/application-form-bottom-sheet.tsx diff --git a/frontend/mobile/app/(app)/club/_components/club-admin-list.tsx b/frontend/old_mobile/app/(app)/club/_components/club-admin-list.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/_components/club-admin-list.tsx rename to frontend/old_mobile/app/(app)/club/_components/club-admin-list.tsx diff --git a/frontend/mobile/app/(app)/club/_components/club-insights.tsx b/frontend/old_mobile/app/(app)/club/_components/club-insights.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/_components/club-insights.tsx rename to frontend/old_mobile/app/(app)/club/_components/club-insights.tsx diff --git a/frontend/mobile/app/(app)/club/_layout.tsx b/frontend/old_mobile/app/(app)/club/_layout.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/_layout.tsx rename to frontend/old_mobile/app/(app)/club/_layout.tsx diff --git a/frontend/mobile/app/(app)/club/ask/ask-a-question.tsx b/frontend/old_mobile/app/(app)/club/ask/ask-a-question.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/ask/ask-a-question.tsx rename to frontend/old_mobile/app/(app)/club/ask/ask-a-question.tsx diff --git a/frontend/mobile/app/(app)/club/faq/view-all-faqs.tsx b/frontend/old_mobile/app/(app)/club/faq/view-all-faqs.tsx similarity index 100% rename from frontend/mobile/app/(app)/club/faq/view-all-faqs.tsx rename to frontend/old_mobile/app/(app)/club/faq/view-all-faqs.tsx diff --git a/frontend/mobile/app/(app)/event/[id].tsx b/frontend/old_mobile/app/(app)/event/[id].tsx similarity index 100% rename from frontend/mobile/app/(app)/event/[id].tsx rename to frontend/old_mobile/app/(app)/event/[id].tsx diff --git a/frontend/mobile/app/(app)/event/_components/all-hosts.tsx b/frontend/old_mobile/app/(app)/event/_components/all-hosts.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_components/all-hosts.tsx rename to frontend/old_mobile/app/(app)/event/_components/all-hosts.tsx diff --git a/frontend/mobile/app/(app)/event/_components/event-date.tsx b/frontend/old_mobile/app/(app)/event/_components/event-date.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_components/event-date.tsx rename to frontend/old_mobile/app/(app)/event/_components/event-date.tsx diff --git a/frontend/mobile/app/(app)/event/_components/event-location.tsx b/frontend/old_mobile/app/(app)/event/_components/event-location.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_components/event-location.tsx rename to frontend/old_mobile/app/(app)/event/_components/event-location.tsx diff --git a/frontend/mobile/app/(app)/event/_components/event-time.tsx b/frontend/old_mobile/app/(app)/event/_components/event-time.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_components/event-time.tsx rename to frontend/old_mobile/app/(app)/event/_components/event-time.tsx diff --git a/frontend/mobile/app/(app)/event/_components/host-names.tsx b/frontend/old_mobile/app/(app)/event/_components/host-names.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_components/host-names.tsx rename to frontend/old_mobile/app/(app)/event/_components/host-names.tsx diff --git a/frontend/mobile/app/(app)/event/_components/location-view.tsx b/frontend/old_mobile/app/(app)/event/_components/location-view.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_components/location-view.tsx rename to frontend/old_mobile/app/(app)/event/_components/location-view.tsx diff --git a/frontend/mobile/app/(app)/event/_components/rsvp-bottom-sheet.tsx b/frontend/old_mobile/app/(app)/event/_components/rsvp-bottom-sheet.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_components/rsvp-bottom-sheet.tsx rename to frontend/old_mobile/app/(app)/event/_components/rsvp-bottom-sheet.tsx diff --git a/frontend/mobile/app/(app)/event/_layout.tsx b/frontend/old_mobile/app/(app)/event/_layout.tsx similarity index 100% rename from frontend/mobile/app/(app)/event/_layout.tsx rename to frontend/old_mobile/app/(app)/event/_layout.tsx diff --git a/frontend/mobile/app/(app)/following/_components/followed-club.tsx b/frontend/old_mobile/app/(app)/following/_components/followed-club.tsx similarity index 100% rename from frontend/mobile/app/(app)/following/_components/followed-club.tsx rename to frontend/old_mobile/app/(app)/following/_components/followed-club.tsx diff --git a/frontend/mobile/app/(app)/following/index.tsx b/frontend/old_mobile/app/(app)/following/index.tsx similarity index 100% rename from frontend/mobile/app/(app)/following/index.tsx rename to frontend/old_mobile/app/(app)/following/index.tsx diff --git a/frontend/mobile/app/(app)/search/_components/club-card.tsx b/frontend/old_mobile/app/(app)/search/_components/club-card.tsx similarity index 100% rename from frontend/mobile/app/(app)/search/_components/club-card.tsx rename to frontend/old_mobile/app/(app)/search/_components/club-card.tsx diff --git a/frontend/mobile/app/(app)/search/_components/event-card.tsx b/frontend/old_mobile/app/(app)/search/_components/event-card.tsx similarity index 100% rename from frontend/mobile/app/(app)/search/_components/event-card.tsx rename to frontend/old_mobile/app/(app)/search/_components/event-card.tsx diff --git a/frontend/mobile/app/(app)/search/_components/search-bar.tsx b/frontend/old_mobile/app/(app)/search/_components/search-bar.tsx similarity index 100% rename from frontend/mobile/app/(app)/search/_components/search-bar.tsx rename to frontend/old_mobile/app/(app)/search/_components/search-bar.tsx diff --git a/frontend/mobile/app/(app)/search/_components/top-search.tsx b/frontend/old_mobile/app/(app)/search/_components/top-search.tsx similarity index 100% rename from frontend/mobile/app/(app)/search/_components/top-search.tsx rename to frontend/old_mobile/app/(app)/search/_components/top-search.tsx diff --git a/frontend/mobile/app/(app)/search/_layout.tsx b/frontend/old_mobile/app/(app)/search/_layout.tsx similarity index 100% rename from frontend/mobile/app/(app)/search/_layout.tsx rename to frontend/old_mobile/app/(app)/search/_layout.tsx diff --git a/frontend/mobile/app/(app)/search/recents.tsx b/frontend/old_mobile/app/(app)/search/recents.tsx similarity index 100% rename from frontend/mobile/app/(app)/search/recents.tsx rename to frontend/old_mobile/app/(app)/search/recents.tsx diff --git a/frontend/mobile/app/(app)/search/results/[query].tsx b/frontend/old_mobile/app/(app)/search/results/[query].tsx similarity index 100% rename from frontend/mobile/app/(app)/search/results/[query].tsx rename to frontend/old_mobile/app/(app)/search/results/[query].tsx diff --git a/frontend/mobile/app/(app)/search/results/expanded/[query].tsx b/frontend/old_mobile/app/(app)/search/results/expanded/[query].tsx similarity index 100% rename from frontend/mobile/app/(app)/search/results/expanded/[query].tsx rename to frontend/old_mobile/app/(app)/search/results/expanded/[query].tsx diff --git a/frontend/mobile/app/(app)/tag/[id].tsx b/frontend/old_mobile/app/(app)/tag/[id].tsx similarity index 100% rename from frontend/mobile/app/(app)/tag/[id].tsx rename to frontend/old_mobile/app/(app)/tag/[id].tsx diff --git a/frontend/mobile/app/(auth)/_components/code.tsx b/frontend/old_mobile/app/(auth)/_components/code.tsx similarity index 100% rename from frontend/mobile/app/(auth)/_components/code.tsx rename to frontend/old_mobile/app/(auth)/_components/code.tsx diff --git a/frontend/mobile/app/(auth)/_components/login-form.tsx b/frontend/old_mobile/app/(auth)/_components/login-form.tsx similarity index 100% rename from frontend/mobile/app/(auth)/_components/login-form.tsx rename to frontend/old_mobile/app/(auth)/_components/login-form.tsx diff --git a/frontend/mobile/app/(auth)/_components/registration-form.tsx b/frontend/old_mobile/app/(auth)/_components/registration-form.tsx similarity index 100% rename from frontend/mobile/app/(auth)/_components/registration-form.tsx rename to frontend/old_mobile/app/(auth)/_components/registration-form.tsx diff --git a/frontend/mobile/app/(auth)/_components/user-details-form.tsx b/frontend/old_mobile/app/(auth)/_components/user-details-form.tsx similarity index 100% rename from frontend/mobile/app/(auth)/_components/user-details-form.tsx rename to frontend/old_mobile/app/(auth)/_components/user-details-form.tsx diff --git a/frontend/mobile/app/(auth)/_components/user-interest-form.tsx b/frontend/old_mobile/app/(auth)/_components/user-interest-form.tsx similarity index 100% rename from frontend/mobile/app/(auth)/_components/user-interest-form.tsx rename to frontend/old_mobile/app/(auth)/_components/user-interest-form.tsx diff --git a/frontend/mobile/app/(auth)/_components/verification-form.tsx b/frontend/old_mobile/app/(auth)/_components/verification-form.tsx similarity index 100% rename from frontend/mobile/app/(auth)/_components/verification-form.tsx rename to frontend/old_mobile/app/(auth)/_components/verification-form.tsx diff --git a/frontend/old_mobile/app/(auth)/_layout.tsx b/frontend/old_mobile/app/(auth)/_layout.tsx new file mode 100644 index 000000000..670d9c7ae --- /dev/null +++ b/frontend/old_mobile/app/(auth)/_layout.tsx @@ -0,0 +1,108 @@ +import React from 'react'; +import { View } from 'react-native'; + +import { Stack, router } from 'expo-router'; + +import { Arrow } from '@/components/arrow'; +import { Button } from '@/components/button'; +import { Wordmark } from '@/components/wordmark'; +import { useAuthStore } from '@/hooks/use-auth'; + +const Layout = () => { + const { onLogout } = useAuthStore(); + return ( + + , + headerBackground: () => + }} + /> + , + headerBackground: () => ( + + ), + animationTypeForReplace: 'push', + animation: 'slide_from_right' + }} + /> + , + headerRight: () => ( + + ), + headerBackground: () => , + animationTypeForReplace: 'pop', + animation: 'slide_from_left' + }} + /> + { + return onLogout()} />; + }, + headerBackground: () => + }} + /> + , + headerBackground: () => , + headerRight: () => ( + router.replace('/(app)/(tabs)/')} + /> + ) + }} + /> + , + headerBackground: () => , + headerRight: () => ( + router.replace('/(app)/(tabs)/')} + /> + ) + }} + /> + + ); +}; + +export default Layout; diff --git a/frontend/mobile/app/(auth)/login.tsx b/frontend/old_mobile/app/(auth)/login.tsx similarity index 100% rename from frontend/mobile/app/(auth)/login.tsx rename to frontend/old_mobile/app/(auth)/login.tsx diff --git a/frontend/mobile/app/(auth)/register.tsx b/frontend/old_mobile/app/(auth)/register.tsx similarity index 100% rename from frontend/mobile/app/(auth)/register.tsx rename to frontend/old_mobile/app/(auth)/register.tsx diff --git a/frontend/mobile/app/(auth)/user-details.tsx b/frontend/old_mobile/app/(auth)/user-details.tsx similarity index 100% rename from frontend/mobile/app/(auth)/user-details.tsx rename to frontend/old_mobile/app/(auth)/user-details.tsx diff --git a/frontend/mobile/app/(auth)/user-interests.tsx b/frontend/old_mobile/app/(auth)/user-interests.tsx similarity index 100% rename from frontend/mobile/app/(auth)/user-interests.tsx rename to frontend/old_mobile/app/(auth)/user-interests.tsx diff --git a/frontend/mobile/app/(auth)/verification.tsx b/frontend/old_mobile/app/(auth)/verification.tsx similarity index 100% rename from frontend/mobile/app/(auth)/verification.tsx rename to frontend/old_mobile/app/(auth)/verification.tsx diff --git a/frontend/mobile/app/(auth)/welcome.tsx b/frontend/old_mobile/app/(auth)/welcome.tsx similarity index 100% rename from frontend/mobile/app/(auth)/welcome.tsx rename to frontend/old_mobile/app/(auth)/welcome.tsx diff --git a/frontend/mobile/app/(calendar)/_layout.tsx b/frontend/old_mobile/app/(calendar)/_layout.tsx similarity index 100% rename from frontend/mobile/app/(calendar)/_layout.tsx rename to frontend/old_mobile/app/(calendar)/_layout.tsx diff --git a/frontend/mobile/app/(calendar)/components/agenda.tsx b/frontend/old_mobile/app/(calendar)/components/agenda.tsx similarity index 100% rename from frontend/mobile/app/(calendar)/components/agenda.tsx rename to frontend/old_mobile/app/(calendar)/components/agenda.tsx diff --git a/frontend/mobile/app/(calendar)/components/agendaItem.tsx b/frontend/old_mobile/app/(calendar)/components/agendaItem.tsx similarity index 100% rename from frontend/mobile/app/(calendar)/components/agendaItem.tsx rename to frontend/old_mobile/app/(calendar)/components/agendaItem.tsx diff --git a/frontend/mobile/app/(calendar)/components/button.tsx b/frontend/old_mobile/app/(calendar)/components/button.tsx similarity index 100% rename from frontend/mobile/app/(calendar)/components/button.tsx rename to frontend/old_mobile/app/(calendar)/components/button.tsx diff --git a/frontend/mobile/app/(calendar)/components/mock.tsx b/frontend/old_mobile/app/(calendar)/components/mock.tsx similarity index 100% rename from frontend/mobile/app/(calendar)/components/mock.tsx rename to frontend/old_mobile/app/(calendar)/components/mock.tsx diff --git a/frontend/mobile/app/(calendar)/context.tsx b/frontend/old_mobile/app/(calendar)/context.tsx similarity index 100% rename from frontend/mobile/app/(calendar)/context.tsx rename to frontend/old_mobile/app/(calendar)/context.tsx diff --git a/frontend/old_mobile/app/_layout.tsx b/frontend/old_mobile/app/_layout.tsx new file mode 100644 index 000000000..18541800b --- /dev/null +++ b/frontend/old_mobile/app/_layout.tsx @@ -0,0 +1,116 @@ +import { useEffect } from "react"; +import { View } from "react-native"; +import { GestureHandlerRootView } from "react-native-gesture-handler"; +import Spinner from "react-native-loading-spinner-overlay"; +import { Provider } from "react-redux"; + +import { useFonts } from "expo-font"; +import { Stack, useRouter, useSegments } from "expo-router"; +import * as SplashScreen from "expo-splash-screen"; +import { StatusBar } from "expo-status-bar"; + +import FontAwesome from "@expo/vector-icons/FontAwesome"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +import { useAuthStore } from "@/hooks/use-auth"; +import { store } from "@/store/store"; + +export { + // Catch any errors thrown by the Layout component. + ErrorBoundary +} from "expo-router"; + +// Prevent the splash screen from auto-hiding before asset loading is complete. +SplashScreen.preventAutoHideAsync(); + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, + retry: false, + staleTime: 1000 * 60 * 5 + } + } +}); + +const InitalLayout = () => { + const { isLoggedIn, fetchCache, isVerified, user } = useAuthStore(); + const router = useRouter(); + const segments = useSegments(); + + useEffect(() => { + const handleNavigation = () => { + if (isLoggedIn === null) return fetchCache(); + + const inApp = segments[0] === "(app)"; + + console.log({ isLoggedIn, isVerified, inApp }); + + if (isLoggedIn && isVerified === false) { + router.push("/(auth)/verification"); + } else if (isLoggedIn && isVerified) { + router.push("/(app)/(tabs)/"); + } else if (!isLoggedIn) { + router.push("/(auth)/welcome"); + } + }; + + console.log({ isLoggedIn, isVerified, user }); + + handleNavigation(); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isLoggedIn, isVerified]); + + if (isLoggedIn === null) + return ( + + + + ); + + return ( + <> + + + + + + + ); +}; + +const RootLayout = () => { + const [loaded, error] = useFonts({ + SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"), + "OpenSans-SemiBold": require("../assets/fonts/OpenSans-SemiBold.ttf"), + ...FontAwesome.font + }); + + useEffect(() => { + if (error) throw error; + }, [error]); + useEffect(() => { + if (loaded) SplashScreen.hideAsync(); + }, [loaded]); + + if (!loaded) return null; + + return ( + + + + + + + + + ); +}; + +export default RootLayout; diff --git a/frontend/mobile/app/globals.css b/frontend/old_mobile/app/globals.css similarity index 100% rename from frontend/mobile/app/globals.css rename to frontend/old_mobile/app/globals.css diff --git a/frontend/mobile/components/all-tags.tsx b/frontend/old_mobile/components/all-tags.tsx similarity index 100% rename from frontend/mobile/components/all-tags.tsx rename to frontend/old_mobile/components/all-tags.tsx diff --git a/frontend/mobile/components/arrow.tsx b/frontend/old_mobile/components/arrow.tsx similarity index 100% rename from frontend/mobile/components/arrow.tsx rename to frontend/old_mobile/components/arrow.tsx diff --git a/frontend/mobile/components/button.tsx b/frontend/old_mobile/components/button.tsx similarity index 100% rename from frontend/mobile/components/button.tsx rename to frontend/old_mobile/components/button.tsx diff --git a/frontend/mobile/components/club-card.tsx b/frontend/old_mobile/components/club-card.tsx similarity index 100% rename from frontend/mobile/components/club-card.tsx rename to frontend/old_mobile/components/club-card.tsx diff --git a/frontend/mobile/components/club-contacts.tsx b/frontend/old_mobile/components/club-contacts.tsx similarity index 100% rename from frontend/mobile/components/club-contacts.tsx rename to frontend/old_mobile/components/club-contacts.tsx diff --git a/frontend/mobile/components/contact-icon.tsx b/frontend/old_mobile/components/contact-icon.tsx similarity index 100% rename from frontend/mobile/components/contact-icon.tsx rename to frontend/old_mobile/components/contact-icon.tsx diff --git a/frontend/mobile/components/description.tsx b/frontend/old_mobile/components/description.tsx similarity index 100% rename from frontend/mobile/components/description.tsx rename to frontend/old_mobile/components/description.tsx diff --git a/frontend/mobile/components/dropdown.tsx b/frontend/old_mobile/components/dropdown.tsx similarity index 100% rename from frontend/mobile/components/dropdown.tsx rename to frontend/old_mobile/components/dropdown.tsx diff --git a/frontend/mobile/components/entity-header.tsx b/frontend/old_mobile/components/entity-header.tsx similarity index 100% rename from frontend/mobile/components/entity-header.tsx rename to frontend/old_mobile/components/entity-header.tsx diff --git a/frontend/mobile/components/error.tsx b/frontend/old_mobile/components/error.tsx similarity index 100% rename from frontend/mobile/components/error.tsx rename to frontend/old_mobile/components/error.tsx diff --git a/frontend/mobile/components/eventCard.tsx b/frontend/old_mobile/components/eventCard.tsx similarity index 100% rename from frontend/mobile/components/eventCard.tsx rename to frontend/old_mobile/components/eventCard.tsx diff --git a/frontend/mobile/components/expandable-text.tsx b/frontend/old_mobile/components/expandable-text.tsx similarity index 100% rename from frontend/mobile/components/expandable-text.tsx rename to frontend/old_mobile/components/expandable-text.tsx diff --git a/frontend/mobile/components/faqCard.tsx b/frontend/old_mobile/components/faqCard.tsx similarity index 100% rename from frontend/mobile/components/faqCard.tsx rename to frontend/old_mobile/components/faqCard.tsx diff --git a/frontend/mobile/components/input.tsx b/frontend/old_mobile/components/input.tsx similarity index 100% rename from frontend/mobile/components/input.tsx rename to frontend/old_mobile/components/input.tsx diff --git a/frontend/mobile/components/kebab.tsx b/frontend/old_mobile/components/kebab.tsx similarity index 100% rename from frontend/mobile/components/kebab.tsx rename to frontend/old_mobile/components/kebab.tsx diff --git a/frontend/mobile/components/multiselect.tsx b/frontend/old_mobile/components/multiselect.tsx similarity index 100% rename from frontend/mobile/components/multiselect.tsx rename to frontend/old_mobile/components/multiselect.tsx diff --git a/frontend/mobile/components/spinner.tsx b/frontend/old_mobile/components/spinner.tsx similarity index 100% rename from frontend/mobile/components/spinner.tsx rename to frontend/old_mobile/components/spinner.tsx diff --git a/frontend/mobile/components/tag.tsx b/frontend/old_mobile/components/tag.tsx similarity index 100% rename from frontend/mobile/components/tag.tsx rename to frontend/old_mobile/components/tag.tsx diff --git a/frontend/mobile/components/title.tsx b/frontend/old_mobile/components/title.tsx similarity index 100% rename from frontend/mobile/components/title.tsx rename to frontend/old_mobile/components/title.tsx diff --git a/frontend/mobile/components/view-all-faqs-card.tsx b/frontend/old_mobile/components/view-all-faqs-card.tsx similarity index 100% rename from frontend/mobile/components/view-all-faqs-card.tsx rename to frontend/old_mobile/components/view-all-faqs-card.tsx diff --git a/frontend/mobile/components/wordmark.tsx b/frontend/old_mobile/components/wordmark.tsx similarity index 100% rename from frontend/mobile/components/wordmark.tsx rename to frontend/old_mobile/components/wordmark.tsx diff --git a/frontend/mobile/hooks/use-auth.ts b/frontend/old_mobile/hooks/use-auth.ts similarity index 100% rename from frontend/mobile/hooks/use-auth.ts rename to frontend/old_mobile/hooks/use-auth.ts diff --git a/frontend/mobile/lib/const.ts b/frontend/old_mobile/lib/const.ts similarity index 100% rename from frontend/mobile/lib/const.ts rename to frontend/old_mobile/lib/const.ts diff --git a/frontend/mobile/lib/utils.ts b/frontend/old_mobile/lib/utils.ts similarity index 100% rename from frontend/mobile/lib/utils.ts rename to frontend/old_mobile/lib/utils.ts diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 000000000..46cef08f1 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,4946 @@ +{ + "name": "frontend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@generatesac/lib": "^0.0.1", + "next": "^14.2.3", + "tailwindcss": "^3.4.3" + } + }, + "dashboard": { + "name": "@sac/dashboard", + "version": "0.1.0", + "extraneous": true, + "dependencies": { + "@generatesac/lib": "^0.0.1", + "@reduxjs/toolkit": "^2.2.3", + "next": "14.2.3", + "react": "^18", + "react-dom": "^18", + "react-redux": "^9.1.1", + "zod": "^3.23.7" + }, + "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.19", + "eslint": "^8", + "eslint-config-next": "14.2.3", + "eslint-plugin-prettier": "^5.1.3", + "jest": "^29.2.1", + "postcss": "^8", + "prettier": "^3.2.4", + "tailwindcss": "^3.4.1", + "typescript": "^5.4.5" + } + }, + "lib": { + "name": "@generatesac/lib", + "version": "0.0.1", + "extraneous": true, + "license": "ISC", + "dependencies": { + "@reduxjs/toolkit": "^2.2.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-redux": "^9.1.2", + "zod": "^3.23.6" + }, + "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/node": "^20.12.10", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "glob": "^10.3.12", + "prettier": "^3.2.5", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "vite-plugin-dts": "^3.9.1", + "vite-plugin-lib-inject-css": "^2.0.1" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "mobile": { + "name": "@sac/mobile", + "version": "1.0.0", + "extraneous": true, + "dependencies": { + "@expo/vector-icons": "^14.0.0", + "@generatesac/lib": "^0.0.1", + "@react-navigation/native": "^6.0.2", + "@reduxjs/toolkit": "^2.2.4", + "@shopify/restyle": "^2.4.4", + "expo": "~51.0.2", + "expo-font": "~12.0.4", + "expo-linking": "~6.3.1", + "expo-router": "~3.5.11", + "expo-secure-store": "~13.0.1", + "expo-splash-screen": "~0.27.4", + "expo-status-bar": "~1.12.1", + "expo-system-ui": "~3.0.4", + "expo-web-browser": "~13.0.3", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-native": "0.74.1", + "react-native-gesture-handler": "^2.16.2", + "react-native-reanimated": "~3.10.1", + "react-native-safe-area-context": "4.10.1", + "react-native-screens": "3.31.1", + "react-native-web": "~0.19.10", + "react-redux": "^9.1.2" + }, + "devDependencies": { + "@babel/core": "^7.24.0", + "@react-native-community/eslint-config": "^3.2.0", + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/react": "~18.2.45", + "eslint": "8.57.0", + "eslint-plugin-prettier": "^5.1.3", + "jest": "^29.2.1", + "jest-expo": "~51.0.1", + "prettier": "^3.2.4", + "react-native-svg-transformer": "^1.3.0", + "react-test-renderer": "18.2.0", + "typescript": "~5.3.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.4", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/@blocknote/core": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.12.4.tgz", + "integrity": "sha512-njnrEZUZ7sPm0CIwxSfFfnP1IgB+H+Kvk5+2Etr3tozuQgwdQ0X6wn6E+MTCP97Nxl/aPA7S1F/XUoy1L8ICXQ==", + "dependencies": { + "@tiptap/core": "^2.0.3", + "@tiptap/extension-bold": "^2.0.3", + "@tiptap/extension-code": "^2.0.3", + "@tiptap/extension-collaboration": "^2.0.3", + "@tiptap/extension-collaboration-cursor": "^2.0.3", + "@tiptap/extension-dropcursor": "^2.0.3", + "@tiptap/extension-gapcursor": "^2.0.3", + "@tiptap/extension-hard-break": "^2.0.3", + "@tiptap/extension-history": "^2.0.3", + "@tiptap/extension-horizontal-rule": "^2.0.3", + "@tiptap/extension-italic": "^2.0.3", + "@tiptap/extension-link": "^2.0.3", + "@tiptap/extension-paragraph": "^2.0.3", + "@tiptap/extension-strike": "^2.0.3", + "@tiptap/extension-table-cell": "^2.0.3", + "@tiptap/extension-table-header": "^2.0.3", + "@tiptap/extension-table-row": "^2.0.3", + "@tiptap/extension-text": "^2.0.3", + "@tiptap/extension-underline": "^2.0.3", + "@tiptap/pm": "^2.0.3", + "hast-util-from-dom": "^4.2.0", + "prosemirror-model": "^1.18.3", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.3.4", + "prosemirror-transform": "^1.7.2", + "prosemirror-view": "^1.31.4", + "rehype-format": "^5.0.0", + "rehype-parse": "^8.0.4", + "rehype-remark": "^9.1.2", + "rehype-stringify": "^9.0.3", + "remark-gfm": "^3.0.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", + "remark-stringify": "^10.0.2", + "unified": "^10.1.2", + "uuid": "^8.3.2", + "y-prosemirror": "1.2.1", + "y-protocols": "^1.0.5", + "yjs": "^13.6.1" + } + }, + "node_modules/@blocknote/core/node_modules/y-prosemirror": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.1.tgz", + "integrity": "sha512-czMBfB1eL2awqmOSxQM8cS/fsUOGE6fjvyPLInrh4crPxFiw67wDpwIW+EGBYKRa04sYbS0ScGj7ZgvWuDrmBQ==", + "dependencies": { + "lib0": "^0.2.42" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "prosemirror-model": "^1.7.1", + "prosemirror-state": "^1.2.3", + "prosemirror-view": "^1.9.10", + "y-protocols": "^1.0.1", + "yjs": "^13.5.38" + } + }, + "node_modules/@blocknote/react": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@blocknote/react/-/react-0.12.4.tgz", + "integrity": "sha512-cgtQmPUhRmWwHifskhfuwq7SflXTagilblzkfKmkvHYsldeH2WcOHGbgskX5bdx7ulvryrLnTSbXszLuTGd5Hw==", + "dependencies": { + "@blocknote/core": "^0.12.4", + "@floating-ui/react": "^0.26.4", + "@mantine/core": "^7.7.1", + "@mantine/hooks": "^7.7.1", + "@mantine/utils": "^6.0.21", + "@tiptap/core": "^2.0.3", + "@tiptap/react": "^2.0.3", + "lodash.merge": "^4.6.2", + "react": "^18", + "react-dom": "^18.2.0", + "react-icons": "^4.3.1", + "use-prefers-color-scheme": "^1.1.3" + }, + "peerDependencies": { + "react": "^18", + "react-dom": "^18" + } + }, + "node_modules/@blocknote/react/node_modules/react-icons": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.13", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.13.tgz", + "integrity": "sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@floating-ui/utils": "^0.2.0", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@generatesac/lib": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@generatesac/lib/-/lib-0.0.1.tgz", + "integrity": "sha512-E7Vw3fZlRdxdBUl06H4s/0IzFb7BCAAWP/iHwA/ju0p4ILy0f6mq2hpWvIDqRFLri6NFWdO3eCd23yjN1VQFNQ==", + "dependencies": { + "@blocknote/core": "^0.12.4", + "@blocknote/react": "^0.12.4", + "@reduxjs/toolkit": "^2.2.3", + "@tiptap/pm": "^2.3.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-redux": "^9.1.2", + "zod": "^3.23.6" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mantine/core": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.9.1.tgz", + "integrity": "sha512-UXK11t1fAQ2ROQ9HTIZfyU52XdwS8sFJ2SRUh5uHMWSahJo3wTdKzaCvYN7wg+ONM9p6ENT0hC0dfv5qXoKU4w==", + "dependencies": { + "@floating-ui/react": "^0.26.9", + "clsx": "2.1.0", + "react-number-format": "^5.3.1", + "react-remove-scroll": "^2.5.7", + "react-textarea-autosize": "8.5.3", + "type-fest": "^4.12.0" + }, + "peerDependencies": { + "@mantine/hooks": "7.9.1", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/core/node_modules/type-fest": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mantine/hooks": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.9.1.tgz", + "integrity": "sha512-nb2Ar+2HfGxLjGZgObapeUeqcQsUWJ+rvj4X2KNTUy3+YpvLIMD3CqREowWHF7/5OTGh4BCyBqQNZ9JFpnMeHQ==", + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/@mantine/utils": { + "version": "6.0.21", + "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.21.tgz", + "integrity": "sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@next/env": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz", + "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", + "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", + "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", + "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", + "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", + "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", + "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", + "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", + "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", + "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remirror/core-constants": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz", + "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tiptap/core": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.3.2.tgz", + "integrity": "sha512-4sMpzYuxiG+fYMwPRXy+mLRVU315KEqzQUcBc2FEgSsmw9Kionykmkq3DvEco7rH8r0NdV/l9R49wVEtX54VqQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.3.2.tgz", + "integrity": "sha512-Mdc0qOPeJxxt5kSYKpNs7TzbQHeVpbpxwafUrxrvfD2iOnJlwlNxVWsVulc1t5EA8NpbTqYJTPmAtv2h/qmsfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.3.2.tgz", + "integrity": "sha512-hg+ncQmoNngdeoUWBQs2AWzDO8YIrlAIgLmIponC+OSCZoVrri7LZ4N1uSp5B/U0lz5fSGUvsUNUs0le+MMr/Q==", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.3.2.tgz", + "integrity": "sha512-LyIRBFJCxbgi96ejoeewESvfUf5igfngamZJK+uegfTcznimP0AjSWs3whJwZ9QXUsQrB9tIrWIG4GBtatp6qw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-collaboration": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.3.2.tgz", + "integrity": "sha512-1vN+crj5KgqoJhDV+CrfIrBWDIjfpVxiEWHBk+yQU/G2vmyQfbN/R/5gH6rOw5GT3mHqgWFtCDJo4+H/2Ete4w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0", + "y-prosemirror": "^1.2.5" + } + }, + "node_modules/@tiptap/extension-collaboration-cursor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.3.2.tgz", + "integrity": "sha512-Dbf3913S+Oqb/1sNshIMipR7OPJp7UD9Uu7RAX8m5BUEGBXwoNLJDnCo8EXKsgAU6nAsGTaoyQ1HyRkG+8DFqg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "y-prosemirror": "^1.2.5" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.2.tgz", + "integrity": "sha512-r7JJn9dEnIRDdbnTCAUFCWX4OPsR48+4OEm5eGlysEaD2h4z0G1AaK5XXwOoQhP3WP2LHHjL4LahlYZvltzFzw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.3.2.tgz", + "integrity": "sha512-7MerFtr+7y0lThKEcNeM0B5LMWqP3RqmMZYJEOCIL20mIINYz5JzSIMQQujmeU5tcqI12O1u7jbRoxRmZrsXxw==", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.2.tgz", + "integrity": "sha512-PSry4JHUIOhXytvYUQGtYgfIKCIhnmbKksZ8/CfCaKgGJpjOpnzqRG5FnYXZB7NiqouABreM7+IgkH0mOLq6HQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.3.2.tgz", + "integrity": "sha512-Oy/Dj75kw/tyNyrcFf97r872NZggISfvabTptH8j1gFPg/XzT5ERcT2fvgpbsBx0WWlXOaFkC1owta6kS6MZpg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.3.2.tgz", + "integrity": "sha512-LTon7ys+C6wLmN/nXYkr1pDxIiIv0Czn4US7I/1b8Ws2N6PU+nMm4r7Uj8hKrDYL8yPQUaS4gIs1hhOwJ8UjtA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.2.tgz", + "integrity": "sha512-nz4GcYvZmJOX20GAjR5ymZgzQCbhnK/rmcunQf4zkl4LA5sXm70P70I9bDtrT/mgmz5dnBUTkVAkLTtKbovdDQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.3.2.tgz", + "integrity": "sha512-6RJmexu/E+JP2+lhzJLV+5KZJiTrJE+p/hnDk13CBK2VgiwcJYmcZSVk+Yk6Suwrb1qTAosu8paKIwVJa/VMUg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.3.2.tgz", + "integrity": "sha512-Bs3PbYmXj5bzUzPdFkcuflxZkdI2nCIJY2YO5TykANos68FrRtxyRKCxSxyZABzKjctT/UUVSap7JUVQ+i/bSw==", + "dependencies": { + "linkifyjs": "^4.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.3.2.tgz", + "integrity": "sha512-bKzL4NXp0pDM/Q5ZCpjLxjQU4DwoWc6CDww1M4B4dp1sfiXiE2P7EOCMM2TfJOqNPUFpp5RcFKKcxC2Suj8W4w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.3.2.tgz", + "integrity": "sha512-gi16YtLnXKPubxafvcGSAELac4i8S6Eb9Av0AaH6QH9H9zzSHN7qOrX930Tp2Pod5a/a82kk7kN7IB6htAeaYA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-table-cell": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.3.2.tgz", + "integrity": "sha512-kWwozAjEI3RNwOseQPjq8LEwb4gJwn6Y4HKlya2nshHPK2gk7lXQgjm6npqYEsv7C0+e3m9T60MlfGeOyvEqfQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-table-header": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.3.2.tgz", + "integrity": "sha512-6ivB0RR+cvq58wnkNkNWx/Wbv2Ue6S84sBuMxcNUBZxSQpNB9pmMVPYVLtw1uT1/z91n63ohsahmBQs1e1+aHw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-table-row": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.3.2.tgz", + "integrity": "sha512-BI5bloqMbGmJJj0QX8Iq3OrJhqS9YbrhMxEpWPteeZfmela7VPU1bhdH2C2BVdL3v9LpRIoWk+VCirzzwJUGfg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.3.2.tgz", + "integrity": "sha512-a3whwDyyOsrmOQbfeY+Fm5XypSRgT3IGqWgz0r4U7oko57/X6Env08F1Ie2e2UkQw9B1MoW9cm3dC6jvrdzzYA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-underline": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.3.2.tgz", + "integrity": "sha512-ZmhWG8gMXk62AhpIMuOofe8GWbkXBW1uYHG55Q9r7MmglESLJm13S5k8JVfOmOMKGzfE23A6yQkojnksAiSGoQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.2.tgz", + "integrity": "sha512-39Bmg7XqWWJg/G5YvWc3QVEPmFNpuMa05gw0Ap7KAKHnHiwl87hosOIDD8dtdcMrtgJL9NwBfUjEJ3ne53U9Ag==", + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.3.2", + "prosemirror-inputrules": "^1.3.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.12.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.19.4", + "prosemirror-schema-basic": "^1.2.2", + "prosemirror-schema-list": "^1.3.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.3.5", + "prosemirror-trailing-node": "^2.0.7", + "prosemirror-transform": "^1.8.0", + "prosemirror-view": "^1.32.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/react": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.3.2.tgz", + "integrity": "sha512-NDvt3XfPn/6V3iAX3lqYGIuFPQgirUGKRyzfHl7ssIfpoY5VR5tRJkU4NigOr63NONrsgCgqJISG/nPY6YGw8w==", + "dependencies": { + "@tiptap/extension-bubble-menu": "^2.3.2", + "@tiptap/extension-floating-menu": "^2.3.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/extend": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.4.tgz", + "integrity": "sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA==" + }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/react": { + "version": "18.2.79", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "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" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/graceful-fs": { + "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==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-embedded/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-from-dom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz", + "integrity": "sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==", + "dependencies": { + "hastscript": "^7.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz", + "integrity": "sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-to-html": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", + "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^7.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-8.4.1.tgz", + "integrity": "sha512-tfmBLASuCgyhCzpkTXM5kU8xeuS5jkMZ17BYm2YftGT5wvgc7uHXTZ/X8WfNd6F5NV/IGmrLsuahZ+jXQir4zQ==", + "dependencies": { + "@types/extend": "^3.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "extend": "^3.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-phrasing": "^2.0.0", + "hast-util-to-text": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "rehype-minify-whitespace": "^5.0.0", + "trim-trailing-lines": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/hast-util-embedded": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-2.0.1.tgz", + "integrity": "sha512-QUdSOP1/o+/TxXtpPFXR2mUg2P+ySrmlX7QjwHZCXqMFyYk7YmcGSvqRW+4XgXAoHifdE1t2PwFaQK33TqVjSw==", + "dependencies": { + "hast-util-is-element": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/hast-util-has-property": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", + "integrity": "sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/hast-util-is-body-ok-link": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-2.0.0.tgz", + "integrity": "sha512-S58hCexyKdD31vMsErvgLfflW6vYWo/ixRLPJTtkOvLld24vyI8vmYmkgLA5LG3la2ME7nm7dLGdm48gfLRBfw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-is-element": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/hast-util-is-element": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", + "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/hast-util-phrasing": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-2.0.2.tgz", + "integrity": "sha512-yGkCfPkkfCyiLfK6KEl/orMDr/zgCnq/NaO9HfULx6/Zga5fso5eqQA5Ov/JZVqACygvw9shRYWgXNcG2ilo7w==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-embedded": "^2.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-is-body-ok-link": "^2.0.0", + "hast-util-is-element": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/rehype-minify-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.1.tgz", + "integrity": "sha512-PPp4lWJiBPlePI/dv1BeYktbwkfgXkrK59MUa+tYbMPgleod+4DvFK2PLU0O0O60/xuhHfiR9GUIUlXTU8sRIQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-embedded": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "unified": "^10.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-mdast/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", + "integrity": "sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unist-util-find-after": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text/node_modules/hast-util-is-element": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", + "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz", + "integrity": "sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/immer": { + "version": "10.0.4", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lib0": { + "version": "0.2.93", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.93.tgz", + "integrity": "sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==", + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", + "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", + "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==", + "dependencies": { + "@next/env": "14.2.3", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.3", + "@next/swc-darwin-x64": "14.2.3", + "@next/swc-linux-arm64-gnu": "14.2.3", + "@next/swc-linux-arm64-musl": "14.2.3", + "@next/swc-linux-x64-gnu": "14.2.3", + "@next/swc-linux-x64-musl": "14.2.3", + "@next/swc-win32-arm64-msvc": "14.2.3", + "@next/swc-win32-ia32-msvc": "14.2.3", + "@next/swc-win32-x64-msvc": "14.2.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", + "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", + "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", + "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.0.tgz", + "integrity": "sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ==", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", + "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz", + "integrity": "sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==", + "dependencies": { + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", + "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz", + "integrity": "sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz", + "integrity": "sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==", + "dependencies": { + "prosemirror-model": "^1.19.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz", + "integrity": "sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz", + "integrity": "sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA==", + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz", + "integrity": "sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA==", + "dependencies": { + "@remirror/core-constants": "^2.0.2", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.19.0", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.31.2" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz", + "integrity": "sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.33.6", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.6.tgz", + "integrity": "sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw==", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-icons": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", + "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-number-format": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.4.tgz", + "integrity": "sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-redux": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.10", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz", + "integrity": "sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", + "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/rehype-format": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.0.tgz", + "integrity": "sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "rehype-minify-whitespace": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-format/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/rehype-minify-whitespace": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz", + "integrity": "sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-minify-whitespace/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/rehype-parse": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.5.tgz", + "integrity": "sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/rehype-remark": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-9.1.2.tgz", + "integrity": "sha512-c0fG3/CrJ95zAQ07xqHSkdpZybwdsY7X5dNWvgL2XqLKZuqmG3+vk6kP/4miCnp+R+x/0uKKRSpfXb9aGR8Z5w==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "hast-util-to-mdast": "^8.3.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz", + "integrity": "sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", + "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reselect": { + "version": "5.1.0", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-trailing-lines": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz", + "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-find-after": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", + "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-prefers-color-scheme": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-prefers-color-scheme/-/use-prefers-color-scheme-1.1.3.tgz", + "integrity": "sha512-ZRgDfb5BFLum/Sud4SpZ+d1YcV+lRbsupw0qQ/rGy5kGrpE3KMUQgEQOKiQQSa4Wslex46n5fKFO+9FGMTosUQ==", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y-prosemirror": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.5.tgz", + "integrity": "sha512-T/JATxC8P2Dbvq/dAiaiztD1a8KEwRP8oLRlT8YlaZdNlLGE1Ea0IJ8If25UlDYmk+4+uqLbqT/S+dzUmwwgbA==", + "peer": true, + "dependencies": { + "lib0": "^0.2.42" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "prosemirror-model": "^1.7.1", + "prosemirror-state": "^1.2.3", + "prosemirror-view": "^1.9.10", + "y-protocols": "^1.0.1", + "yjs": "^13.5.38" + } + }, + "node_modules/y-protocols": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", + "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/yaml": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yjs": { + "version": "13.6.15", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.15.tgz", + "integrity": "sha512-moFv4uNYhp8BFxIk3AkpoAnnjts7gwdpiG8RtyFiKbMtxKCS0zVZ5wPaaGpwC3V2N/K8TK8MwtSI3+WO9CHWjQ==", + "dependencies": { + "lib0": "^0.2.86" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "web": { + "name": "@sac/web", + "version": "0.1.0", + "extraneous": true, + "dependencies": { + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "next": "14.2.3", + "react": "^18", + "react-dom": "^18", + "semver": "7.6.0" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.19", + "eslint": "^8", + "eslint-config-next": "14.2.3", + "jest": "^29.2.1", + "postcss": "^8", + "prettier": "^3.2.4", + "tailwindcss": "^3.4.3", + "typescript": "^5" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json index ca8822db9..76618b6b5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,14 +1,7 @@ { - "name": "sac", - "version": "1.0.0", - "workspaces": { - "packages": [ - "dashboard", - "lib", - "mobile", - "web", - "dashboard" - ] - }, - "private": true -} \ No newline at end of file + "dependencies": { + "@generatesac/lib": "^0.0.1", + "next": "^14.2.3", + "tailwindcss": "^3.4.3" + } +} diff --git a/frontend/web/package.json b/frontend/web/package.json index 69ca8e81d..8579ab352 100644 --- a/frontend/web/package.json +++ b/frontend/web/package.json @@ -12,11 +12,11 @@ "format": "prettier --write ." }, "dependencies": { - "@sac/lib": "*", + "@trivago/prettier-plugin-sort-imports": "^4.3.0", "next": "14.2.3", "react": "^18", "react-dom": "^18", - "semver": "7.6.0" + "semver": "7.6.2" }, "devDependencies": { "@types/node": "^20", diff --git a/frontend/web/yarn.lock b/frontend/web/yarn.lock index 060263014..7a4490732 100644 --- a/frontend/web/yarn.lock +++ b/frontend/web/yarn.lock @@ -28,6 +28,14 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" +"@babel/code-frame@^7.22.13": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + "@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" @@ -54,6 +62,25 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/generator@7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.23.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/generator@^7.23.6", "@babel/generator@^7.7.2": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" @@ -137,6 +164,16 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" @@ -165,11 +202,26 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== +"@babel/parser@^7.20.5", "@babel/parser@^7.23.0": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -284,6 +336,22 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/traverse@7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" @@ -300,6 +368,14 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/types@7.17.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.3.3": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" @@ -309,6 +385,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.17.0", "@babel/types@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -609,7 +694,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -617,62 +702,62 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.2.tgz#6c36fe0b04a22ea78bd60a645ae77d53cd16d3ca" - integrity sha512-sk72qRfM1Q90XZWYRoJKu/UWlTgihrASiYw/scb15u+tyzcze3bOuJ/UV6TBOQEeUaxOkRqGeuGUdiiuxc5oqw== +"@next/env@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" + integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== -"@next/eslint-plugin-next@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.2.tgz#1eaf592ebb961e0b093e4774b0c77298af5e2e0e" - integrity sha512-q+Ec2648JtBpKiu/FSJm8HAsFXlNvioHeBCbTP12T1SGcHYwhqHULSfQgFkPgHDu3kzNp2Kem4J54bK4rPQ5SQ== +"@next/eslint-plugin-next@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz#287ad8620e7061ba01e8d3313d464db6d217b6df" + integrity sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw== dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.2.tgz#55e395b0db6dd5ea2dc92818260ff3a399f1a056" - integrity sha512-3iPgMhzbalizGwHNFUcGnDhFPSgVBHQ8aqSTAMxB5BvJG0oYrDf1WOJZlbXBgunOEj/8KMVbejEur/FpvFsgFQ== - -"@next/swc-darwin-x64@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.2.tgz#f96fb65510be798c03b0432129792c6ac8885bc8" - integrity sha512-x7Afi/jt0ZBRUZHTi49yyej4o8znfIMHO4RvThuoc0P+uli8Jd99y5GKjxoYunPKsXL09xBXEM1+OQy2xEL0Ag== - -"@next/swc-linux-arm64-gnu@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.2.tgz#443f0d4ab9d1aa4338e40f77ca4e182d60e88448" - integrity sha512-zbfPtkk7L41ODMJwSp5VbmPozPmMMQrzAc0HAUomVeVIIwlDGs/UCqLJvLNDt4jpWgc21SjjyIn762lNGrMaUA== - -"@next/swc-linux-arm64-musl@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.2.tgz#182c00b3d2f3ed4eaacdd385d07b230252c64de9" - integrity sha512-wPbS3pI/JU16rm3XdLvvTmlsmm1nd+sBa2ohXgBZcShX4TgOjD4R+RqHKlI1cjo/jDZKXt6OxmcU0Iys0OC/yg== - -"@next/swc-linux-x64-gnu@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.2.tgz#e826a08085dcc61685ff42884ad4032e71ac154f" - integrity sha512-NqWOHqqq8iC9tuHvZxjQ2tX+jWy2X9y8NX2mcB4sj2bIccuCxbIZrU/ThFPZZPauygajZuVQ6zediejQHwZHwQ== - -"@next/swc-linux-x64-musl@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.2.tgz#42f921ca6d93fdfb2b13de70cd8a44ba5526b318" - integrity sha512-lGepHhwb9sGhCcU7999+iK1ZZT+6rrIoVg40MP7DZski9GIZP80wORSbt5kJzh9v2x2ev2lxC6VgwMQT0PcgTA== - -"@next/swc-win32-arm64-msvc@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.2.tgz#9c8f60da8e3882c4c66f21747abf944a627d05ff" - integrity sha512-TZSh/48SfcLEQ4rD25VVn2kdIgUWmMflRX3OiyPwGNXn3NiyPqhqei/BaqCYXViIQ+6QsG9R0C8LftMqy8JPMA== - -"@next/swc-win32-ia32-msvc@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.2.tgz#fdb0b5f74e6dc0dcb34b7f7d24775ad034d915e8" - integrity sha512-M0tBVNMEBJN2ZNQWlcekMn6pvLria7Sa2Fai5znm7CCJz4pP3lrvlSxhKdkCerk0D9E0bqx5yAo3o2Q7RrD4gA== - -"@next/swc-win32-x64-msvc@14.2.2": - version "14.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.2.tgz#95cc0dad2c7ac5177fa6eeab070dccfa30532353" - integrity sha512-a/20E/wtTJZ3Ykv3f/8F0l7TtgQa2LWHU2oNB9bsu0VjqGuGGHmm/q6waoUNQYTVPYrrlxxaHjJcDV6aiSTt/w== +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== + +"@next/swc-darwin-x64@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" + integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== + +"@next/swc-linux-arm64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" + integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== + +"@next/swc-linux-arm64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" + integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== + +"@next/swc-linux-x64-gnu@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" + integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== + +"@next/swc-linux-x64-musl@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" + integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== + +"@next/swc-win32-arm64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" + integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== + +"@next/swc-win32-ia32-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" + integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== + +"@next/swc-win32-x64-msvc@14.2.3": + version "14.2.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" + integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -737,6 +822,18 @@ "@swc/counter" "^0.1.3" tslib "^2.4.0" +"@trivago/prettier-plugin-sort-imports@^4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== + dependencies: + "@babel/generator" "7.17.7" + "@babel/parser" "^7.20.5" + "@babel/traverse" "7.23.2" + "@babel/types" "7.17.0" + javascript-natural-sort "0.7.1" + lodash "^4.17.21" + "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -802,9 +899,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node@*", "@types/node@^20": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + version "20.12.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" + integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== dependencies: undici-types "~5.26.4" @@ -821,9 +918,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18": - version "18.2.79" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" - integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== + version "18.3.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" + integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -1794,12 +1891,12 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-next@14.2.2: - version "14.2.2" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.2.tgz#c79f935fa63859303056778b88848b2af0d052ab" - integrity sha512-12/uFc0KX+wUs7EDpOUGKMXBXZJiBVGdK5/m/QgXOCg2mQ0bQWoKSWNrCeOg7Vum6Kw1d1TW453W6xh+GbHquw== +eslint-config-next@14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.3.tgz#2fb0f7c4eccda530a4b5054438162b2303786d4f" + integrity sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg== dependencies: - "@next/eslint-plugin-next" "14.2.2" + "@next/eslint-plugin-next" "14.2.3" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0" eslint-import-resolver-node "^0.3.6" @@ -2688,6 +2785,11 @@ jackspeak@^2.3.5: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +javascript-natural-sort@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + jest-changed-files@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" @@ -3189,6 +3291,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3203,13 +3310,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - "lru-cache@^9.1.1 || ^10.0.0": version "10.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" @@ -3305,12 +3405,12 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next@14.2.2: - version "14.2.2" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.2.tgz#707311b5e4bf973ada2305233f322bdd0cd9d579" - integrity sha512-oGwUaa2bCs47FbuxWMpOoXtBMPYpvTPgdZr3UAo+pu7Ns00z9otmYpoeV1HEiYL06AlRQQIA/ypK526KjJfaxg== +next@14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" + integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: - "@next/env" "14.2.2" + "@next/env" "14.2.3" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -3318,15 +3418,15 @@ next@14.2.2: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.2" - "@next/swc-darwin-x64" "14.2.2" - "@next/swc-linux-arm64-gnu" "14.2.2" - "@next/swc-linux-arm64-musl" "14.2.2" - "@next/swc-linux-x64-gnu" "14.2.2" - "@next/swc-linux-x64-musl" "14.2.2" - "@next/swc-win32-arm64-msvc" "14.2.2" - "@next/swc-win32-ia32-msvc" "14.2.2" - "@next/swc-win32-x64-msvc" "14.2.2" + "@next/swc-darwin-arm64" "14.2.3" + "@next/swc-darwin-x64" "14.2.3" + "@next/swc-linux-arm64-gnu" "14.2.3" + "@next/swc-linux-arm64-musl" "14.2.3" + "@next/swc-linux-x64-gnu" "14.2.3" + "@next/swc-linux-x64-musl" "14.2.3" + "@next/swc-win32-arm64-msvc" "14.2.3" + "@next/swc-win32-ia32-msvc" "14.2.3" + "@next/swc-win32-x64-msvc" "14.2.3" node-int64@^0.4.0: version "0.4.0" @@ -3686,12 +3786,12 @@ queue-microtask@^1.2.2: integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== react-dom@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" react-is@^16.13.1: version "16.13.1" @@ -3704,9 +3804,9 @@ react-is@^18.0.0: integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" @@ -3840,19 +3940,17 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" -semver@7.6.0, semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" +semver@7.6.2, semver@^7.5.3, semver@^7.5.4: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== semver@^6.3.0, semver@^6.3.1: version "6.3.1" @@ -3936,6 +4034,11 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -4455,11 +4558,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^2.3.4: version "2.4.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 93ef37d62..2427de313 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,8905 +2,1754 @@ # yarn lockfile v1 -"@0no-co/graphql.web@^1.0.5": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.7.tgz#c7a762c887b3482a79ffa68f63de5e96059a62e4" - integrity sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ== - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== - dependencies: - "@babel/highlight" "^7.24.2" - picocolors "^1.0.0" - -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": +"@babel/runtime@^7.20.13": version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.23.9", "@babel/core@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" - integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.4" - "@babel/parser" "^7.24.4" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/eslint-parser@^7.18.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" - integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - -"@babel/generator@7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" - integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.18.7", "@babel/generator@^7.20.0", "@babel/generator@^7.20.5", "@babel/generator@^7.23.0", "@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== dependencies: - "@babel/types" "^7.24.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + regenerator-runtime "^0.14.0" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" +"@blocknote/core@^0.12.4": + version "0.12.4" + resolved "https://registry.npmjs.org/@blocknote/core/-/core-0.12.4.tgz" + integrity sha512-njnrEZUZ7sPm0CIwxSfFfnP1IgB+H+Kvk5+2Etr3tozuQgwdQ0X6wn6E+MTCP97Nxl/aPA7S1F/XUoy1L8ICXQ== + dependencies: + "@tiptap/core" "^2.0.3" + "@tiptap/extension-bold" "^2.0.3" + "@tiptap/extension-code" "^2.0.3" + "@tiptap/extension-collaboration" "^2.0.3" + "@tiptap/extension-collaboration-cursor" "^2.0.3" + "@tiptap/extension-dropcursor" "^2.0.3" + "@tiptap/extension-gapcursor" "^2.0.3" + "@tiptap/extension-hard-break" "^2.0.3" + "@tiptap/extension-history" "^2.0.3" + "@tiptap/extension-horizontal-rule" "^2.0.3" + "@tiptap/extension-italic" "^2.0.3" + "@tiptap/extension-link" "^2.0.3" + "@tiptap/extension-paragraph" "^2.0.3" + "@tiptap/extension-strike" "^2.0.3" + "@tiptap/extension-table-cell" "^2.0.3" + "@tiptap/extension-table-header" "^2.0.3" + "@tiptap/extension-table-row" "^2.0.3" + "@tiptap/extension-text" "^2.0.3" + "@tiptap/extension-underline" "^2.0.3" + "@tiptap/pm" "^2.0.3" + hast-util-from-dom "^4.2.0" + prosemirror-model "^1.18.3" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.3.4" + prosemirror-transform "^1.7.2" + prosemirror-view "^1.31.4" + rehype-format "^5.0.0" + rehype-parse "^8.0.4" + rehype-remark "^9.1.2" + rehype-stringify "^9.0.3" + remark-gfm "^3.0.1" + remark-parse "^10.0.1" + remark-rehype "^10.1.0" + remark-stringify "^10.0.2" + unified "^10.1.2" + uuid "^8.3.2" + y-prosemirror "1.2.1" + y-protocols "^1.0.5" + yjs "^13.6.1" + +"@blocknote/react@^0.12.4": + version "0.12.4" + resolved "https://registry.npmjs.org/@blocknote/react/-/react-0.12.4.tgz" + integrity sha512-cgtQmPUhRmWwHifskhfuwq7SflXTagilblzkfKmkvHYsldeH2WcOHGbgskX5bdx7ulvryrLnTSbXszLuTGd5Hw== + dependencies: + "@blocknote/core" "^0.12.4" + "@floating-ui/react" "^0.26.4" + "@mantine/core" "^7.7.1" + "@mantine/hooks" "^7.7.1" + "@mantine/utils" "^6.0.21" + "@tiptap/core" "^2.0.3" + "@tiptap/react" "^2.0.3" + lodash.merge "^4.6.2" + react "^18" + react-dom "^18.2.0" + react-icons "^4.3.1" + use-prefers-color-scheme "^1.1.3" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@floating-ui/core@^1.0.0": + version "1.6.1" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz" + integrity sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A== dependencies: - "@babel/types" "^7.22.15" + "@floating-ui/utils" "^0.2.0" -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@floating-ui/dom@^1.0.0": + version "1.6.5" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz" + integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" - integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - regexpu-core "^5.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" - integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== - dependencies: - "@babel/types" "^7.23.0" - -"@babel/helper-module-imports@7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" - integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== - -"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" - integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== +"@floating-ui/react-dom@^2.0.0": + version "2.0.9" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz" + integrity sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ== dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" + "@floating-ui/dom" "^1.0.0" -"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.23.4": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@floating-ui/react@^0.26.4", "@floating-ui/react@^0.26.9": + version "0.26.13" + resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.13.tgz" + integrity sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@floating-ui/utils" "^0.2.0" + tabbable "^6.0.0" -"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@floating-ui/utils@^0.2.0": + version "0.2.2" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz" + integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@generatesac/lib@^0.0.1": + version "0.0.1" + resolved "https://registry.npmjs.org/@generatesac/lib/-/lib-0.0.1.tgz" + integrity sha512-E7Vw3fZlRdxdBUl06H4s/0IzFb7BCAAWP/iHwA/ju0p4ILy0f6mq2hpWvIDqRFLri6NFWdO3eCd23yjN1VQFNQ== + dependencies: + "@blocknote/core" "^0.12.4" + "@blocknote/react" "^0.12.4" + "@reduxjs/toolkit" "^2.2.3" + "@tiptap/pm" "^2.3.1" + react "^18.2.0" + react-dom "^18.2.0" + react-icons "^5.2.1" + react-redux "^9.1.2" + zod "^3.23.6" -"@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@babel/helpers@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" - integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" - integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-proposal-async-generator-functions@^7.0.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-decorators@^7.12.9": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" - integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-decorators" "^7.24.1" +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" - integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-default-from" "^7.24.1" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== +"@mantine/core@^7.7.1": + version "7.9.1" + resolved "https://registry.npmjs.org/@mantine/core/-/core-7.9.1.tgz" + integrity sha512-UXK11t1fAQ2ROQ9HTIZfyU52XdwS8sFJ2SRUh5uHMWSahJo3wTdKzaCvYN7wg+ONM9p6ENT0hC0dfv5qXoKU4w== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@floating-ui/react" "^0.26.9" + clsx "2.1.0" + react-number-format "^5.3.1" + react-remove-scroll "^2.5.7" + react-textarea-autosize "8.5.3" + type-fest "^4.12.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@mantine/hooks@^7.7.1", "@mantine/hooks@7.9.1": + version "7.9.1" + resolved "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.9.1.tgz" + integrity sha512-nb2Ar+2HfGxLjGZgObapeUeqcQsUWJ+rvj4X2KNTUy3+YpvLIMD3CqREowWHF7/5OTGh4BCyBqQNZ9JFpnMeHQ== -"@babel/plugin-proposal-numeric-separator@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@mantine/utils@^6.0.21": + version "6.0.21" + resolved "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.21.tgz" + integrity sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ== -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" +"@next/env@14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz" + integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@next/swc-darwin-arm64@14.2.3": + version "14.2.3" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz" + integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== -"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.20.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== +"@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== -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" +"@popperjs/core@^2.9.0": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== +"@reduxjs/toolkit@^2.2.3", "@reduxjs/toolkit@^2.2.4": + version "2.2.3" dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + immer "^10.0.3" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.0.1" -"@babel/plugin-syntax-decorators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" - integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +"@remirror/core-constants@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz" + integrity sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" - integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== +"@swc/helpers@0.5.5": + version "0.5.5" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" + integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@swc/counter" "^0.1.3" + tslib "^2.4.0" -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" +"@tiptap/core@^2.0.0", "@tiptap/core@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.3.2.tgz" + integrity sha512-4sMpzYuxiG+fYMwPRXy+mLRVU315KEqzQUcBc2FEgSsmw9Kionykmkq3DvEco7rH8r0NdV/l9R49wVEtX54VqQ== + +"@tiptap/extension-bold@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.3.2.tgz" + integrity sha512-Mdc0qOPeJxxt5kSYKpNs7TzbQHeVpbpxwafUrxrvfD2iOnJlwlNxVWsVulc1t5EA8NpbTqYJTPmAtv2h/qmsfw== + +"@tiptap/extension-bubble-menu@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.3.2.tgz" + integrity sha512-hg+ncQmoNngdeoUWBQs2AWzDO8YIrlAIgLmIponC+OSCZoVrri7LZ4N1uSp5B/U0lz5fSGUvsUNUs0le+MMr/Q== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-code@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.3.2.tgz" + integrity sha512-LyIRBFJCxbgi96ejoeewESvfUf5igfngamZJK+uegfTcznimP0AjSWs3whJwZ9QXUsQrB9tIrWIG4GBtatp6qw== + +"@tiptap/extension-collaboration-cursor@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.3.2.tgz" + integrity sha512-Dbf3913S+Oqb/1sNshIMipR7OPJp7UD9Uu7RAX8m5BUEGBXwoNLJDnCo8EXKsgAU6nAsGTaoyQ1HyRkG+8DFqg== + +"@tiptap/extension-collaboration@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.3.2.tgz" + integrity sha512-1vN+crj5KgqoJhDV+CrfIrBWDIjfpVxiEWHBk+yQU/G2vmyQfbN/R/5gH6rOw5GT3mHqgWFtCDJo4+H/2Ete4w== + +"@tiptap/extension-dropcursor@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.2.tgz" + integrity sha512-r7JJn9dEnIRDdbnTCAUFCWX4OPsR48+4OEm5eGlysEaD2h4z0G1AaK5XXwOoQhP3WP2LHHjL4LahlYZvltzFzw== + +"@tiptap/extension-floating-menu@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.3.2.tgz" + integrity sha512-7MerFtr+7y0lThKEcNeM0B5LMWqP3RqmMZYJEOCIL20mIINYz5JzSIMQQujmeU5tcqI12O1u7jbRoxRmZrsXxw== + dependencies: + tippy.js "^6.3.7" + +"@tiptap/extension-gapcursor@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.2.tgz" + integrity sha512-PSry4JHUIOhXytvYUQGtYgfIKCIhnmbKksZ8/CfCaKgGJpjOpnzqRG5FnYXZB7NiqouABreM7+IgkH0mOLq6HQ== + +"@tiptap/extension-hard-break@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.3.2.tgz" + integrity sha512-Oy/Dj75kw/tyNyrcFf97r872NZggISfvabTptH8j1gFPg/XzT5ERcT2fvgpbsBx0WWlXOaFkC1owta6kS6MZpg== + +"@tiptap/extension-history@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.3.2.tgz" + integrity sha512-LTon7ys+C6wLmN/nXYkr1pDxIiIv0Czn4US7I/1b8Ws2N6PU+nMm4r7Uj8hKrDYL8yPQUaS4gIs1hhOwJ8UjtA== + +"@tiptap/extension-horizontal-rule@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.2.tgz" + integrity sha512-nz4GcYvZmJOX20GAjR5ymZgzQCbhnK/rmcunQf4zkl4LA5sXm70P70I9bDtrT/mgmz5dnBUTkVAkLTtKbovdDQ== + +"@tiptap/extension-italic@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.3.2.tgz" + integrity sha512-6RJmexu/E+JP2+lhzJLV+5KZJiTrJE+p/hnDk13CBK2VgiwcJYmcZSVk+Yk6Suwrb1qTAosu8paKIwVJa/VMUg== + +"@tiptap/extension-link@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.3.2.tgz" + integrity sha512-Bs3PbYmXj5bzUzPdFkcuflxZkdI2nCIJY2YO5TykANos68FrRtxyRKCxSxyZABzKjctT/UUVSap7JUVQ+i/bSw== + dependencies: + linkifyjs "^4.1.0" + +"@tiptap/extension-paragraph@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.3.2.tgz" + integrity sha512-bKzL4NXp0pDM/Q5ZCpjLxjQU4DwoWc6CDww1M4B4dp1sfiXiE2P7EOCMM2TfJOqNPUFpp5RcFKKcxC2Suj8W4w== + +"@tiptap/extension-strike@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.3.2.tgz" + integrity sha512-gi16YtLnXKPubxafvcGSAELac4i8S6Eb9Av0AaH6QH9H9zzSHN7qOrX930Tp2Pod5a/a82kk7kN7IB6htAeaYA== + +"@tiptap/extension-table-cell@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.3.2.tgz" + integrity sha512-kWwozAjEI3RNwOseQPjq8LEwb4gJwn6Y4HKlya2nshHPK2gk7lXQgjm6npqYEsv7C0+e3m9T60MlfGeOyvEqfQ== + +"@tiptap/extension-table-header@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.3.2.tgz" + integrity sha512-6ivB0RR+cvq58wnkNkNWx/Wbv2Ue6S84sBuMxcNUBZxSQpNB9pmMVPYVLtw1uT1/z91n63ohsahmBQs1e1+aHw== + +"@tiptap/extension-table-row@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.3.2.tgz" + integrity sha512-BI5bloqMbGmJJj0QX8Iq3OrJhqS9YbrhMxEpWPteeZfmela7VPU1bhdH2C2BVdL3v9LpRIoWk+VCirzzwJUGfg== + +"@tiptap/extension-text@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.3.2.tgz" + integrity sha512-a3whwDyyOsrmOQbfeY+Fm5XypSRgT3IGqWgz0r4U7oko57/X6Env08F1Ie2e2UkQw9B1MoW9cm3dC6jvrdzzYA== + +"@tiptap/extension-underline@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.3.2.tgz" + integrity sha512-ZmhWG8gMXk62AhpIMuOofe8GWbkXBW1uYHG55Q9r7MmglESLJm13S5k8JVfOmOMKGzfE23A6yQkojnksAiSGoQ== + +"@tiptap/pm@^2.0.0", "@tiptap/pm@^2.0.3", "@tiptap/pm@^2.3.1": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.2.tgz" + integrity sha512-39Bmg7XqWWJg/G5YvWc3QVEPmFNpuMa05gw0Ap7KAKHnHiwl87hosOIDD8dtdcMrtgJL9NwBfUjEJ3ne53U9Ag== + dependencies: + prosemirror-changeset "^2.2.1" + prosemirror-collab "^1.3.1" + prosemirror-commands "^1.5.2" + prosemirror-dropcursor "^1.8.1" + prosemirror-gapcursor "^1.3.2" + prosemirror-history "^1.3.2" + prosemirror-inputrules "^1.3.0" + prosemirror-keymap "^1.2.2" + prosemirror-markdown "^1.12.0" + prosemirror-menu "^1.2.4" + prosemirror-model "^1.19.4" + prosemirror-schema-basic "^1.2.2" + prosemirror-schema-list "^1.3.0" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.3.5" + prosemirror-trailing-node "^2.0.7" + prosemirror-transform "^1.8.0" + prosemirror-view "^1.32.7" + +"@tiptap/react@^2.0.3": + version "2.3.2" + resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.3.2.tgz" + integrity sha512-NDvt3XfPn/6V3iAX3lqYGIuFPQgirUGKRyzfHl7ssIfpoY5VR5tRJkU4NigOr63NONrsgCgqJISG/nPY6YGw8w== + dependencies: + "@tiptap/extension-bubble-menu" "^2.3.2" + "@tiptap/extension-floating-menu" "^2.3.2" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/extend@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/extend/-/extend-3.0.4.tgz" + integrity sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA== -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz#875c25e3428d7896c87589765fc8b9d32f24bd8d" - integrity sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA== +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@types/unist" "^2" -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@types/unist" "*" -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@types/unist" "^2" -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" +"@types/ms@*": + version "0.7.34" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" +"@types/parse5@^6.0.0": + version "6.0.3" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz" + integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +"@types/prop-types@*": + version "15.7.12" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== +"@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18", "@types/react@^18.2.25", "@types/react@^18.2.66", "@types/react@~18.2.45": + version "18.2.79" dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@types/prop-types" "*" + csstype "^3.0.2" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" +"@types/unist@*", "@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.10" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" +"@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + color-convert "^2.0.1" -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -"@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + normalize-path "^3.0.0" + picomatch "^2.0.4" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.0.0-0", "@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" - integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== - dependencies: - "@babel/helper-module-imports" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" - integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + balanced-match "^1.0.0" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" - integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" - integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/template" "^7.24.0" - -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" - integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-export-namespace-from@^7.22.11", "@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" - integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc" - integrity sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-flow" "^7.24.1" - -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" - integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== - dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" - integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + fill-range "^7.0.1" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + streamsearch "^1.1.0" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-simple-access" "^7.22.5" +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== - dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +caniuse-lite@^1.0.30001579: + version "1.0.30001617" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz" + integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== -"@babel/plugin-transform-nullish-coalescing-operator@^7.0.0-0", "@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" - integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== -"@babel/plugin-transform-object-rest-spread@^7.12.13", "@babel/plugin-transform-object-rest-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" - integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== - dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.1" - -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" - -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.0.0-0", "@babel/plugin-transform-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" - integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.15", "@babel/plugin-transform-parameters@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" - integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" - integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-private-property-in-object@^7.22.11", "@babel/plugin-transform-private-property-in-object@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" - integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" - integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz#a21d866d8167e752c6a7c4555dba8afcdfce6268" - integrity sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w== +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz#a2dedb12b09532846721b5df99e52ef8dc3351d0" - integrity sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" +clsx@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" - integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.24.0" + color-name "~1.1.4" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - regenerator-transform "^0.15.2" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -"@babel/plugin-transform-runtime@^7.0.0": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" - integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== - dependencies: - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-plugin-utils" "^7.24.0" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.1" - babel-plugin-polyfill-regenerator "^0.6.1" - semver "^6.3.1" +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.0.0-0", "@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" - integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +crelt@^1.0.0: + version "1.0.6" + resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" - integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" - integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.0.0-0", "@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" - integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +csstype@^3.0.2: + version "3.1.3" -"@babel/plugin-transform-typeof-symbol@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" - integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== +debug@^4.0.0: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + ms "2.1.2" -"@babel/plugin-transform-typescript@^7.24.1", "@babel/plugin-transform-typescript@^7.5.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15" - integrity sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g== +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" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-typescript" "^7.24.1" + character-entities "^2.0.0" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" - integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" +diff@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -"@babel/preset-env@^7.20.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" - integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== - dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.4" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.1" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.1" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.1" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - "@babel/plugin-transform-parameters" "^7.24.1" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.1" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.1" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" - semver "^6.3.1" - -"@babel/preset-flow@^7.13.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.1.tgz#da7196c20c2d7dd4e98cfd8b192fe53b5eb6f0bb" - integrity sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-flow-strip-types" "^7.24.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.22.15": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" - -"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" - integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-syntax-jsx" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-typescript" "^7.24.1" - -"@babel/register@^7.13.16": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.23.7.tgz#485a5e7951939d21304cae4af1719fdb887bc038" - integrity sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.6" - source-map-support "^0.5.16" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.8", "@babel/runtime@^7.24.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.0.0", "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.20.0", "@babel/traverse@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" - integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== - dependencies: - "@babel/code-frame" "^7.24.1" - "@babel/generator" "^7.24.1" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.1" - "@babel/types" "^7.24.0" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" - integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.18.6", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@egjs/hammerjs@^2.0.17": - version "2.0.17" - resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" - integrity sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A== - dependencies: - "@types/hammerjs" "^2.0.36" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@expo/bunyan@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@expo/bunyan/-/bunyan-4.0.0.tgz#be0c1de943c7987a9fbd309ea0b1acd605890c7b" - integrity sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA== - dependencies: - uuid "^8.0.0" - optionalDependencies: - mv "~2" - safe-json-stringify "~1" - -"@expo/cli@0.17.10": - version "0.17.10" - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.17.10.tgz#7dd5e2b4a01f5d29698c431729a19878fbd806f5" - integrity sha512-Jw2wY+lsavP9GRqwwLqF/SvB7w2GZ4sWBMcBKTZ8F0lWjwmLGAUt4WYquf20agdmnY/oZUHvWNkrz/t3SflhnA== - dependencies: - "@babel/runtime" "^7.20.0" - "@expo/code-signing-certificates" "0.0.5" - "@expo/config" "~8.5.0" - "@expo/config-plugins" "~7.9.0" - "@expo/devcert" "^1.0.0" - "@expo/env" "~0.2.2" - "@expo/image-utils" "^0.4.0" - "@expo/json-file" "^8.2.37" - "@expo/metro-config" "~0.17.0" - "@expo/osascript" "^2.0.31" - "@expo/package-manager" "^1.1.1" - "@expo/plist" "^0.1.0" - "@expo/prebuild-config" "6.8.1" - "@expo/rudder-sdk-node" "1.1.1" - "@expo/spawn-async" "1.5.0" - "@expo/xcpretty" "^4.3.0" - "@react-native/dev-middleware" "^0.73.6" - "@urql/core" "2.3.6" - "@urql/exchange-retry" "0.3.0" - accepts "^1.3.8" - arg "5.0.2" - better-opn "~3.0.2" - bplist-parser "^0.3.1" - cacache "^15.3.0" - chalk "^4.0.0" - ci-info "^3.3.0" - connect "^3.7.0" - debug "^4.3.4" - env-editor "^0.4.1" - find-yarn-workspace-root "~2.0.0" - form-data "^3.0.1" - freeport-async "2.0.0" - fs-extra "~8.1.0" - getenv "^1.0.0" - glob "^7.1.7" - graphql "15.8.0" - graphql-tag "^2.10.1" - https-proxy-agent "^5.0.1" - internal-ip "4.3.0" - is-docker "^2.0.0" - is-wsl "^2.1.1" - js-yaml "^3.13.1" - json-schema-deref-sync "^0.13.0" - lodash.debounce "^4.0.8" - md5hex "^1.0.0" - minimatch "^3.0.4" - minipass "3.3.6" - node-fetch "^2.6.7" - node-forge "^1.3.1" - npm-package-arg "^7.0.0" - open "^8.3.0" - ora "3.4.0" - picomatch "^3.0.1" - pretty-bytes "5.6.0" - progress "2.0.3" - prompts "^2.3.2" - qrcode-terminal "0.11.0" - require-from-string "^2.0.2" - requireg "^0.2.2" - resolve "^1.22.2" - resolve-from "^5.0.0" - resolve.exports "^2.0.2" - semver "^7.5.3" - send "^0.18.0" - slugify "^1.3.4" - source-map-support "~0.5.21" - stacktrace-parser "^0.1.10" - structured-headers "^0.4.1" - tar "^6.0.5" - temp-dir "^2.0.0" - tempy "^0.7.1" - terminal-link "^2.1.1" - text-table "^0.2.0" - url-join "4.0.0" - wrap-ansi "^7.0.0" - ws "^8.12.1" - -"@expo/code-signing-certificates@0.0.5": - version "0.0.5" - resolved "https://registry.yarnpkg.com/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz#a693ff684fb20c4725dade4b88a6a9f96b02496c" - integrity sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw== - dependencies: - node-forge "^1.2.1" - nullthrows "^1.1.1" - -"@expo/config-plugins@7.9.1", "@expo/config-plugins@~7.9.0": - version "7.9.1" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.9.1.tgz#fe4f7e4f9d4e87f2dcf2344ffdc59eb466dd5d2e" - integrity sha512-ICt6Jed1J0tPYMQrJ8K5Qusgih2I6pZ2PU4VSvxsN3T4n97L13XpYV1vyq1Uc/HMl3UhOwldipmgpEbCfeDqsQ== - dependencies: - "@expo/config-types" "^50.0.0-alpha.1" - "@expo/fingerprint" "^0.6.0" - "@expo/json-file" "~8.3.0" - "@expo/plist" "^0.1.0" - "@expo/sdk-runtime-versions" "^1.0.0" - "@react-native/normalize-color" "^2.0.0" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.5.3" - slash "^3.0.0" - slugify "^1.6.6" - xcode "^3.0.1" - xml2js "0.6.0" - -"@expo/config-plugins@~7.8.0": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.8.4.tgz#533b5d536c1dc8b5544d64878b51bda28f2e1a1f" - integrity sha512-hv03HYxb/5kX8Gxv/BTI8TLc9L06WzqAfHRRXdbar4zkLcP2oTzvsLEF4/L/TIpD3rsnYa0KU42d0gWRxzPCJg== - dependencies: - "@expo/config-types" "^50.0.0-alpha.1" - "@expo/fingerprint" "^0.6.0" - "@expo/json-file" "~8.3.0" - "@expo/plist" "^0.1.0" - "@expo/sdk-runtime-versions" "^1.0.0" - "@react-native/normalize-color" "^2.0.0" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.5.3" - slash "^3.0.0" - slugify "^1.6.6" - xcode "^3.0.1" - xml2js "0.6.0" - -"@expo/config-types@^50.0.0", "@expo/config-types@^50.0.0-alpha.1": - version "50.0.1" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.1.tgz#12d889214dedf64fbf2322c9d9e75c9d5ca7f695" - integrity sha512-EZHMgzkWRB9SMHO1e9m8s+OMahf92XYTnsCFjxhSfcDrcEoSdFPyJWDJVloHZPMGhxns7Fi2+A+bEVN/hD4NKA== - -"@expo/config@8.5.6", "@expo/config@~8.5.0": - version "8.5.6" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.5.6.tgz#e37ba437a1718ed4629e1dd130a7aace25312b89" - integrity sha512-wF5awSg6MNn1cb1lIgjnhOn5ov2TEUTnkAVCsOl0QqDwcP+YIerteSFwjn9V52UZvg58L+LKxpCuGbw5IHavbg== - dependencies: - "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "~7.9.0" - "@expo/config-types" "^50.0.0" - "@expo/json-file" "^8.2.37" - getenv "^1.0.0" - glob "7.1.6" - require-from-string "^2.0.2" - resolve-from "^5.0.0" - semver "7.5.3" - slugify "^1.3.4" - sucrase "3.34.0" - -"@expo/devcert@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@expo/devcert/-/devcert-1.1.0.tgz#d148eb9180db6753c438192e73a123fb13b662ac" - integrity sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA== - dependencies: - application-config-path "^0.1.0" - command-exists "^1.2.4" - debug "^3.1.0" - eol "^0.9.1" - get-port "^3.2.0" - glob "^7.1.2" - lodash "^4.17.4" - mkdirp "^0.5.1" - password-prompt "^1.0.4" - rimraf "^2.6.2" - sudo-prompt "^8.2.0" - tmp "^0.0.33" - tslib "^2.4.0" - -"@expo/env@~0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@expo/env/-/env-0.2.3.tgz#59ffe29ffe58f8ee9ee99581a6cb6e003831d469" - integrity sha512-a+uJ/e6MAVxPVVN/HbXU5qxzdqrqDwNQYxCfxtAufgmd5VZj54e5f3TJA3LEEUW3pTSZR8xK0H0EtVN297AZnw== - dependencies: - chalk "^4.0.0" - debug "^4.3.4" - dotenv "~16.4.5" - dotenv-expand "~11.0.6" - getenv "^1.0.0" - -"@expo/fingerprint@^0.6.0": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.6.1.tgz#763ae79b06f60e10853596bfa2bd730bfb13f2b0" - integrity sha512-ggLn6unI6qowlA1FihdQwPpLn16VJulYkvYAEL50gaqVahfNEglRQMSH2giZzjD0d6xq2/EQuUdFyHaJfyJwOQ== - dependencies: - "@expo/spawn-async" "^1.5.0" - chalk "^4.1.2" - debug "^4.3.4" - find-up "^5.0.0" - minimatch "^3.0.4" - p-limit "^3.1.0" - resolve-from "^5.0.0" - -"@expo/image-utils@^0.4.0": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.4.2.tgz#84beabbe50d7e1c2ad78f1b44be6ec49a9dbc0da" - integrity sha512-CxP+1QXgRXsNnmv2FAUA2RWwK6kNBFg4QEmVXn2K9iLoEAI+i+1IQXcUgc+J7nTJl9pO7FIu2gIiEYGYffjLWQ== - dependencies: - "@expo/spawn-async" "1.5.0" - chalk "^4.0.0" - fs-extra "9.0.0" - getenv "^1.0.0" - jimp-compact "0.16.1" - node-fetch "^2.6.0" - parse-png "^2.1.0" - resolve-from "^5.0.0" - semver "7.3.2" - tempy "0.3.0" - -"@expo/json-file@^8.2.37", "@expo/json-file@~8.3.0": - version "8.3.1" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.1.tgz#4344a30a0dfb46e8e86a10c5b5b9b3bd1bf6afd9" - integrity sha512-QIMMaqPvm8EGflp041h27OG8DDgh3RxzkEjEEvHJ9AUImgeieMCGrpDsnGOcPI4TR6MpJpLNAk5rZK4szhEwIQ== - dependencies: - "@babel/code-frame" "~7.10.4" - json5 "^2.2.2" - write-file-atomic "^2.3.0" - -"@expo/metro-config@0.17.7", "@expo/metro-config@~0.17.0": - version "0.17.7" - resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.17.7.tgz#c877a9558f3b97447cc9cf382971403834d84b46" - integrity sha512-3vAdinAjMeRwdhGWWLX6PziZdAPvnyJ6KVYqnJErHHqH0cA6dgAENT3Vq6PEM1H2HgczKr2d5yG9AMgwy848ow== - dependencies: - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.5" - "@babel/parser" "^7.20.0" - "@babel/types" "^7.20.0" - "@expo/config" "~8.5.0" - "@expo/env" "~0.2.2" - "@expo/json-file" "~8.3.0" - "@expo/spawn-async" "^1.7.2" - babel-preset-fbjs "^3.4.0" - chalk "^4.1.0" - debug "^4.3.2" - find-yarn-workspace-root "~2.0.0" - fs-extra "^9.1.0" - getenv "^1.0.0" - glob "^7.2.3" - jsc-safe-url "^0.2.4" - lightningcss "~1.19.0" - postcss "~8.4.32" - resolve-from "^5.0.0" - sucrase "3.34.0" - -"@expo/metro-runtime@3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-3.1.3.tgz#e29503808bd8ffeb706ef9a17b644230a379f298" - integrity sha512-u1CaQJJlSgvxBB5NJ6YMVvSDTTRzjT71dHpEBnKPZhpFv5ebVry52FZ2sEeEEA6mHG5zGxWXmHImW3hNKHh8EA== - -"@expo/osascript@^2.0.31": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@expo/osascript/-/osascript-2.1.0.tgz#c407dfe839b5e898829d31e6accd962f91adac1c" - integrity sha512-bOhuFnlRaS7CU33+rFFIWdcET/Vkyn1vsN8BYFwCDEF5P1fVVvYN7bFOsQLTMD3nvi35C1AGmtqUr/Wfv8Xaow== - dependencies: - "@expo/spawn-async" "^1.5.0" - exec-async "^2.2.0" - -"@expo/package-manager@^1.1.1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@expo/package-manager/-/package-manager-1.4.2.tgz#8c12a9163c5ff7c7cc89806c4b75cff4974c57fc" - integrity sha512-LKdo/6y4W7llZ6ghsg1kdx2CeH/qR/c6QI/JI8oPUvppsZoeIYjSkdflce978fAMfR8IXoi0wt0jA2w0kWpwbg== - dependencies: - "@expo/json-file" "^8.2.37" - "@expo/spawn-async" "^1.5.0" - ansi-regex "^5.0.0" - chalk "^4.0.0" - find-up "^5.0.0" - find-yarn-workspace-root "~2.0.0" - js-yaml "^3.13.1" - micromatch "^4.0.2" - npm-package-arg "^7.0.0" - ora "^3.4.0" - split "^1.0.1" - sudo-prompt "9.1.1" - -"@expo/plist@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.1.tgz#f9abf0f52ca994465d8129770cd18fac5e23ac52" - integrity sha512-90qbbblHYWR/z0R+HP2t7yRx0IG5AsEL0BqTY/vXcj4emhGhm39Dbwg4BO2t6qfdLljJISzUwEtWWTl1HNHAAg== - dependencies: - "@xmldom/xmldom" "~0.7.7" - base64-js "^1.2.3" - xmlbuilder "^14.0.0" - -"@expo/prebuild-config@6.7.4": - version "6.7.4" - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-6.7.4.tgz#b3e4c8545d7a101bf1fc263c5b7290abc4635e69" - integrity sha512-x8EUdCa8DTMZ/dtEXjHAdlP+ljf6oSeSKNzhycXiHhpMSMG9jEhV28ocCwc6cKsjK5GziweEiHwvrj6+vsBlhA== - dependencies: - "@expo/config" "~8.5.0" - "@expo/config-plugins" "~7.8.0" - "@expo/config-types" "^50.0.0-alpha.1" - "@expo/image-utils" "^0.4.0" - "@expo/json-file" "^8.2.37" - debug "^4.3.1" - fs-extra "^9.0.0" - resolve-from "^5.0.0" - semver "7.5.3" - xml2js "0.6.0" - -"@expo/prebuild-config@6.8.1": - version "6.8.1" - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-6.8.1.tgz#5d562b1d6b2e5e4727a3c61acf1a4ed6117b94d8" - integrity sha512-ptK9e0dcj1eYlAWV+fG+QkuAWcLAT1AmtEbj++tn7ZjEj8+LkXRM73LCOEGaF0Er8i8ZWNnaVsgGW4vjgP5ZsA== - dependencies: - "@expo/config" "~8.5.0" - "@expo/config-plugins" "~7.9.0" - "@expo/config-types" "^50.0.0-alpha.1" - "@expo/image-utils" "^0.4.0" - "@expo/json-file" "^8.2.37" - debug "^4.3.1" - fs-extra "^9.0.0" - resolve-from "^5.0.0" - semver "7.5.3" - xml2js "0.6.0" - -"@expo/rudder-sdk-node@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz#6aa575f346833eb6290282118766d4919c808c6a" - integrity sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ== - dependencies: - "@expo/bunyan" "^4.0.0" - "@segment/loosely-validate-event" "^2.0.0" - fetch-retry "^4.1.1" - md5 "^2.2.1" - node-fetch "^2.6.1" - remove-trailing-slash "^0.1.0" - uuid "^8.3.2" - -"@expo/sdk-runtime-versions@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz#d7ebd21b19f1c6b0395e50d78da4416941c57f7c" - integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== - -"@expo/server@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@expo/server/-/server-0.3.1.tgz#dbdb23af31877aeb35e8ea31a4962e128c8fa920" - integrity sha512-cCKyVA2IR9J4hDFPXzj3L08+Ngd/7z2F+JtdW0NLy03qShXBI5NSEEcaiHtjrgsLXPDe9PBw5Xgsfmxuduyggg== - dependencies: - "@remix-run/node" "^1.19.3" - abort-controller "^3.0.0" - debug "^4.3.4" - source-map-support "~0.5.21" - -"@expo/spawn-async@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.5.0.tgz#799827edd8c10ef07eb1a2ff9dcfe081d596a395" - integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== - dependencies: - cross-spawn "^6.0.5" - -"@expo/spawn-async@^1.5.0", "@expo/spawn-async@^1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@expo/spawn-async/-/spawn-async-1.7.2.tgz#fcfe66c3e387245e72154b1a7eae8cada6a47f58" - integrity sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew== - dependencies: - cross-spawn "^7.0.3" - -"@expo/vector-icons@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-14.0.0.tgz#48ce0aa5c05873b07c0c78bfe16c870388f4de9a" - integrity sha512-5orm59pdnBQlovhU9k4DbjMUZBHNlku7IRgFY56f7pcaaCnXq9yaLJoOQl9sMwNdFzf4gnkTyHmR5uN10mI9rA== - -"@expo/xcpretty@^4.3.0": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@expo/xcpretty/-/xcpretty-4.3.1.tgz#e0a6a92d1e46ab5ac5e90d9a8e66ac1a2a2f5920" - integrity sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw== - dependencies: - "@babel/code-frame" "7.10.4" - chalk "^4.1.0" - find-up "^5.0.0" - js-yaml "^4.1.0" - -"@gar/promisify@^1.0.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@gorhom/bottom-sheet@^4": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-4.6.1.tgz#e45e2183246e338cf732fe4f8f2c91875b22ddce" - integrity sha512-sXqsYqX1/rAbmCC5fb9o6hwSF3KXriC0EGUGvLlhFvjaEEMBrRKFTNndiluRK1HmpUzazVaYdTm/lLkSiA2ooQ== - dependencies: - "@gorhom/portal" "1.0.14" - invariant "^2.2.4" - -"@gorhom/portal@1.0.14": - version "1.0.14" - resolved "https://registry.yarnpkg.com/@gorhom/portal/-/portal-1.0.14.tgz#1953edb76aaba80fb24021dc774550194a18e111" - integrity sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A== - dependencies: - nanoid "^3.3.1" - -"@graphql-typed-document-node/core@^3.1.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" - integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== - -"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@isaacs/ttlcache@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" - integrity sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/create-cache-key-function@^29.2.1", "@jest/create-cache-key-function@^29.6.3": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" - integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== - dependencies: - "@jest/types" "^29.6.3" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/source-map@^0.3.3": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" - integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@next/env@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" - integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== - -"@next/eslint-plugin-next@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz#287ad8620e7061ba01e8d3313d464db6d217b6df" - integrity sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw== - dependencies: - glob "10.3.10" - -"@next/swc-darwin-arm64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" - integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== - -"@next/swc-darwin-x64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" - integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== - -"@next/swc-linux-arm64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" - integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== - -"@next/swc-linux-arm64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" - integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== - -"@next/swc-linux-x64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" - integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== - -"@next/swc-linux-x64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" - integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== - -"@next/swc-win32-arm64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" - integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== - -"@next/swc-win32-ia32-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" - integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== - -"@next/swc-win32-x64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" - integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== - -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pkgr/core@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" - integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== - -"@radix-ui/react-compose-refs@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" - integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/react-slot@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.1.tgz#e7868c669c974d649070e9ecbec0b367ee0b4d81" - integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.0" - -"@react-native-community/cli-clean@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.4.tgz#53c07c6f2834a971dc40eab290edcf8ccc5d1e00" - integrity sha512-nS1BJ+2Z+aLmqePxB4AYgJ+C/bgQt02xAgSYtCUv+lneRBGhL2tHRrK8/Iolp0y+yQoUtHHf4txYi90zGXLVfw== - dependencies: - "@react-native-community/cli-tools" "13.6.4" - chalk "^4.1.2" - execa "^5.0.0" - fast-glob "^3.3.2" - -"@react-native-community/cli-config@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.6.4.tgz#3004c7bca55cb384b3a99c38c1a48dad24533237" - integrity sha512-GGK415WoTx1R9FXtfb/cTnan9JIWwSm+a5UCuFd6+suzS0oIt1Md1vCzjNh6W1CK3b43rZC2e+3ZU7Ljd7YtyQ== - dependencies: - "@react-native-community/cli-tools" "13.6.4" - chalk "^4.1.2" - cosmiconfig "^5.1.0" - deepmerge "^4.3.0" - fast-glob "^3.3.2" - joi "^17.2.1" - -"@react-native-community/cli-debugger-ui@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.4.tgz#3881b9cfe14e66b3ee827a84f19ca9d0283fd764" - integrity sha512-9Gs31s6tA1kuEo69ay9qLgM3x2gsN/RI994DCUKnFSW+qSusQJyyrmfllR2mGU3Wl1W09/nYpIg87W9JPf5y4A== - dependencies: - serve-static "^1.13.1" - -"@react-native-community/cli-doctor@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.6.4.tgz#07e5c2f163807e61ce0ba12901903e591177e3d3" - integrity sha512-lWOXCISH/cHtLvO0cWTr+IPSzA54FewVOw7MoCMEvWusH+1n7c3hXTAve78mLozGQ7iuUufkHFWwKf3dzOkflQ== - dependencies: - "@react-native-community/cli-config" "13.6.4" - "@react-native-community/cli-platform-android" "13.6.4" - "@react-native-community/cli-platform-apple" "13.6.4" - "@react-native-community/cli-platform-ios" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" - chalk "^4.1.2" - command-exists "^1.2.8" - deepmerge "^4.3.0" - envinfo "^7.10.0" - execa "^5.0.0" - hermes-profile-transformer "^0.0.6" - node-stream-zip "^1.9.1" - ora "^5.4.1" - semver "^7.5.2" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - yaml "^2.2.1" - -"@react-native-community/cli-hermes@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.6.4.tgz#6d3e9b5c251461e9bb35b04110544db8a4f5968f" - integrity sha512-VIAufA/2wTccbMYBT9o+mQs9baOEpTxCiIdWeVdkPWKzIwtKsLpDZJlUqj4r4rI66mwjFyQ60PhwSzEJ2ApFeQ== - dependencies: - "@react-native-community/cli-platform-android" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" - chalk "^4.1.2" - hermes-profile-transformer "^0.0.6" - -"@react-native-community/cli-platform-android@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.4.tgz#78ab4c840f4f1f5252ad2fcc5a55f7681ec458cb" - integrity sha512-WhknYwIobKKCqaGCN3BzZEQHTbaZTDiGvcXzevvN867ldfaGdtbH0DVqNunbPoV1RNzeV9qKoQHFdWBkg83tpg== - dependencies: - "@react-native-community/cli-tools" "13.6.4" - chalk "^4.1.2" - execa "^5.0.0" - fast-glob "^3.3.2" - fast-xml-parser "^4.2.4" - logkitty "^0.7.1" - -"@react-native-community/cli-platform-apple@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.4.tgz#4912eaf519800a957745192718822b94655c8119" - integrity sha512-TLBiotdIz0veLbmvNQIdUv9fkBx7m34ANGYqr5nH7TFxdmey+Z+omoBqG/HGpvyR7d0AY+kZzzV4k+HkYHM/aQ== - dependencies: - "@react-native-community/cli-tools" "13.6.4" - chalk "^4.1.2" - execa "^5.0.0" - fast-glob "^3.3.2" - fast-xml-parser "^4.0.12" - ora "^5.4.1" - -"@react-native-community/cli-platform-ios@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.4.tgz#96ec915c6df23b2b7b7e0d8cb3db7368e448d620" - integrity sha512-8Dlva8RY+MY5nhWAj6V7voG3+JOEzDTJmD0FHqL+4p0srvr9v7IEVcxfw5lKBDIUNd0OMAHNevGA+cyz1J60jg== - dependencies: - "@react-native-community/cli-platform-apple" "13.6.4" - -"@react-native-community/cli-server-api@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.6.4.tgz#6bcec7ae387fc3aeb3e78f62561a91962e6fadf7" - integrity sha512-D2qSuYCFwrrUJUM0SDc9l3lEhU02yjf+9Peri/xhspzAhALnsf6Z/H7BCjddMV42g9/eY33LqiGyN5chr83a+g== - dependencies: - "@react-native-community/cli-debugger-ui" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" - compression "^1.7.1" - connect "^3.6.5" - errorhandler "^1.5.1" - nocache "^3.0.1" - pretty-format "^26.6.2" - serve-static "^1.13.1" - ws "^7.5.1" - -"@react-native-community/cli-tools@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.4.tgz#ab396604b6dcf215790807fe89656e779b11f0ec" - integrity sha512-N4oHLLbeTdg8opqJozjClmuTfazo1Mt+oxU7mr7m45VCsFgBqTF70Uwad289TM/3l44PP679NRMAHVYqpIRYtQ== - dependencies: - appdirsjs "^1.2.4" - chalk "^4.1.2" - execa "^5.0.0" - find-up "^5.0.0" - mime "^2.4.1" - node-fetch "^2.6.0" - open "^6.2.0" - ora "^5.4.1" - semver "^7.5.2" - shell-quote "^1.7.3" - sudo-prompt "^9.0.0" - -"@react-native-community/cli-types@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.6.4.tgz#e499a3691ee597aa4b93196ff182a4782fae7afb" - integrity sha512-NxGCNs4eYtVC8x0wj0jJ/MZLRy8C+B9l8lY8kShuAcvWTv5JXRqmXjg8uK1aA+xikPh0maq4cc/zLw1roroY/A== - dependencies: - joi "^17.2.1" - -"@react-native-community/cli@13.6.4": - version "13.6.4" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.4.tgz#dabe2749470a34533e18aada51d97c94b3568307" - integrity sha512-V7rt2N5JY7M4dJFgdNfR164r3hZdR/Z7V54dv85TFQHRbdwF4QrkG+GeagAU54qrkK/OU8OH3AF2+mKuiNWpGA== - dependencies: - "@react-native-community/cli-clean" "13.6.4" - "@react-native-community/cli-config" "13.6.4" - "@react-native-community/cli-debugger-ui" "13.6.4" - "@react-native-community/cli-doctor" "13.6.4" - "@react-native-community/cli-hermes" "13.6.4" - "@react-native-community/cli-server-api" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" - "@react-native-community/cli-types" "13.6.4" - chalk "^4.1.2" - commander "^9.4.1" - deepmerge "^4.3.0" - execa "^5.0.0" - find-up "^4.1.0" - fs-extra "^8.1.0" - graceful-fs "^4.1.3" - prompts "^2.4.2" - semver "^7.5.2" - -"@react-native-community/eslint-config@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@react-native-community/eslint-config/-/eslint-config-3.2.0.tgz#42f677d5fff385bccf1be1d3b8faa8c086cf998d" - integrity sha512-ZjGvoeiBtCbd506hQqwjKmkWPgynGUoJspG8/MuV/EfKnkjCtBmeJvq2n+sWbWEvL9LWXDp2GJmPzmvU5RSvKQ== - dependencies: - "@babel/core" "^7.14.0" - "@babel/eslint-parser" "^7.18.2" - "@react-native-community/eslint-plugin" "^1.1.0" - "@typescript-eslint/eslint-plugin" "^5.30.5" - "@typescript-eslint/parser" "^5.30.5" - eslint-config-prettier "^8.5.0" - eslint-plugin-eslint-comments "^3.2.0" - eslint-plugin-ft-flow "^2.0.1" - eslint-plugin-jest "^26.5.3" - eslint-plugin-prettier "^4.2.1" - eslint-plugin-react "^7.30.1" - eslint-plugin-react-hooks "^4.6.0" - eslint-plugin-react-native "^4.0.0" - -"@react-native-community/eslint-plugin@^1.1.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.3.0.tgz#9e558170c106bbafaa1ef502bd8e6d4651012bf9" - integrity sha512-+zDZ20NUnSWghj7Ku5aFphMzuM9JulqCW+aPXT6IfIXFbb8tzYTTOSeRFOtuekJ99ibW2fUCSsjuKNlwDIbHFg== - -"@react-native-community/masked-view@^0.1.11": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@react-native-community/masked-view/-/masked-view-0.1.11.tgz#2f4c6e10bee0786abff4604e39a37ded6f3980ce" - integrity sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw== - -"@react-native-menu/menu@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@react-native-menu/menu/-/menu-1.0.1.tgz#07af963791ac1e5035132151f73ccb5a7ca478c3" - integrity sha512-NCGE0ktq481O9sxvKzoLAK27oyfcoJlOTQeTuXMxvaB56rjZm4T1pmPQGWdxhTQQ57Nf7+p6GVLwh0cT3+a5vw== - -"@react-native/assets-registry@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.81.tgz#76b17f8f79b366ec4f18a0f4e99b7cd466aa5aa7" - integrity sha512-ms+D6pJ6l30epm53pwnAislW79LEUHJxWfe1Cu0LWyTTBlg1OFoqXfB3eIbpe4WyH3nrlkQAh0yyk4huT2mCvw== - -"@react-native/assets-registry@~0.73.1": - version "0.73.1" - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.73.1.tgz#e2a6b73b16c183a270f338dc69c36039b3946e85" - integrity sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg== - -"@react-native/babel-plugin-codegen@0.73.4": - version "0.73.4" - resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz#8a2037d5585b41877611498ae66adbf1dddfec1b" - integrity sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ== - dependencies: - "@react-native/codegen" "0.73.3" - -"@react-native/babel-plugin-codegen@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.81.tgz#80484fb9029038694a92193ae2653529e44aab64" - integrity sha512-Bj6g5/xkLMBAdC6665TbD3uCKCQSmLQpGv3gyqya/ydZpv3dDmDXfkGmO4fqTwEMunzu09Sk55st2ipmuXAaAg== - dependencies: - "@react-native/codegen" "0.74.81" - -"@react-native/babel-preset@0.74.81", "@react-native/babel-preset@^0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.81.tgz#80d0b96eef35d671f97eaf223c4d770170d7f23f" - integrity sha512-H80B3Y3lBBVC4x9tceTEQq/04lx01gW6ajWCcVbd7sHvGEAxfMFEZUmVZr0451Cafn02wVnDJ8psto1F+0w5lw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.18.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.20.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.20.0" - "@babel/plugin-transform-flow-strip-types" "^7.20.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - "@react-native/babel-plugin-codegen" "0.74.81" - babel-plugin-transform-flow-enums "^0.0.2" - react-refresh "^0.14.0" - -"@react-native/babel-preset@^0.73.18": - version "0.73.21" - resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.73.21.tgz#174c16493fa4e311b2f5f0c58d4f3c6a5a68bbea" - integrity sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.18.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.20.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.20.0" - "@babel/plugin-transform-flow-strip-types" "^7.20.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.11" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - "@react-native/babel-plugin-codegen" "0.73.4" - babel-plugin-transform-flow-enums "^0.0.2" - react-refresh "^0.14.0" - -"@react-native/codegen@0.73.3": - version "0.73.3" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.73.3.tgz#cc984a8b17334d986cc600254a0d4b7fa7d68a94" - integrity sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg== - dependencies: - "@babel/parser" "^7.20.0" - flow-parser "^0.206.0" - glob "^7.1.1" - invariant "^2.2.4" - jscodeshift "^0.14.0" - mkdirp "^0.5.1" - nullthrows "^1.1.1" - -"@react-native/codegen@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.81.tgz#1025ffd41f2b4710fd700c9e8e85210b9651a7c4" - integrity sha512-hhXo4ccv2lYWaJrZDsdbRTZ5SzSOdyZ0MY6YXwf3xEFLuSunbUMu17Rz5LXemKXlpVx4KEgJ/TDc2pPVaRPZgA== - dependencies: - "@babel/parser" "^7.20.0" - glob "^7.1.1" - hermes-parser "0.19.1" - invariant "^2.2.4" - jscodeshift "^0.14.0" - mkdirp "^0.5.1" - nullthrows "^1.1.1" - -"@react-native/community-cli-plugin@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.81.tgz#4177207374942c52a86ad52c8c915f46729305ab" - integrity sha512-ezPOwPxbDgrBZLJJMcXryXJXjv3VWt+Mt4jRZiEtvy6pAoi2owSH0b178T5cEZaWsxQN0BbyJ7F/xJsNiF4z0Q== - dependencies: - "@react-native-community/cli-server-api" "13.6.4" - "@react-native-community/cli-tools" "13.6.4" - "@react-native/dev-middleware" "0.74.81" - "@react-native/metro-babel-transformer" "0.74.81" - chalk "^4.0.0" - execa "^5.1.1" - metro "^0.80.3" - metro-config "^0.80.3" - metro-core "^0.80.3" - node-fetch "^2.2.0" - querystring "^0.2.1" - readline "^1.3.0" - -"@react-native/debugger-frontend@0.73.3": - version "0.73.3" - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz#033757614d2ada994c68a1deae78c1dd2ad33c2b" - integrity sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw== - -"@react-native/debugger-frontend@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.81.tgz#17cefe2b3ff485071bd30d819995867fd145da27" - integrity sha512-HCYF1/88AfixG75558HkNh9wcvGweRaSZGBA71KoZj03umXM8XJy0/ZpacGOml2Fwiqpil72gi6uU+rypcc/vw== - -"@react-native/dev-middleware@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.81.tgz#120ab62982a48cba90c7724d099ddaa50184c200" - integrity sha512-x2IpvUJN1LJE0WmPsSfQIbQaa9xwH+2VDFOUrzuO9cbQap8rNfZpcvVNbrZgrlKbgS4LXbbsj6VSL8b6SnMKMA== - dependencies: - "@isaacs/ttlcache" "^1.4.1" - "@react-native/debugger-frontend" "0.74.81" - "@rnx-kit/chromium-edge-launcher" "^1.0.0" - chrome-launcher "^0.15.2" - connect "^3.6.5" - debug "^2.2.0" - node-fetch "^2.2.0" - nullthrows "^1.1.1" - open "^7.0.3" - selfsigned "^2.4.1" - serve-static "^1.13.1" - temp-dir "^2.0.0" - ws "^6.2.2" - -"@react-native/dev-middleware@^0.73.6": - version "0.73.8" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.73.8.tgz#2e43722a00c7b8db753f747f40267cbad6caba4d" - integrity sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg== - dependencies: - "@isaacs/ttlcache" "^1.4.1" - "@react-native/debugger-frontend" "0.73.3" - chrome-launcher "^0.15.2" - chromium-edge-launcher "^1.0.0" - connect "^3.6.5" - debug "^2.2.0" - node-fetch "^2.2.0" - open "^7.0.3" - serve-static "^1.13.1" - temp-dir "^2.0.0" - ws "^6.2.2" - -"@react-native/gradle-plugin@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.81.tgz#aac01999b1005bba3213f504deee7efaadb62c1e" - integrity sha512-7YQ4TLnqfe2kplWWzBWO6k0rPSrWEbuEiRXSJNZQCtCk+t2YX985G62p/9jWm3sGLN4UTcpDXaFNTTPBvlycoQ== - -"@react-native/js-polyfills@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.81.tgz#64780497be4ecbff1b27076294e3ebd7df1ba485" - integrity sha512-o4MiR+/kkHoeoQ/zPwt81LnTm6pqdg0wOhU7S7vIZUqzJ7YUpnpaAvF+/z7HzUOPudnavoCN0wvcZPe/AMEyCA== - -"@react-native/metro-babel-transformer@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.81.tgz#f724eab91e6de82f8d098e6de57f25bb7501d2d6" - integrity sha512-PVcMjj23poAK6Uemflz4MIJdEpONpjqF7JASNqqQkY6wfDdaIiZSNk8EBCWKb0t7nKqhMvtTq11DMzYJ0JFITg== - dependencies: - "@babel/core" "^7.20.0" - "@react-native/babel-preset" "0.74.81" - hermes-parser "0.19.1" - nullthrows "^1.1.1" - -"@react-native/normalize-color@^2.0.0", "@react-native/normalize-color@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.1.0.tgz#939b87a9849e81687d3640c5efa2a486ac266f91" - integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== - -"@react-native/normalize-colors@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.81.tgz#0b7c440b6e126f79036cbe74a88791aba72b9fcf" - integrity sha512-g3YvkLO7UsSWiDfYAU+gLhRHtEpUyz732lZB+N8IlLXc5MnfXHC8GKneDGY3Mh52I3gBrs20o37D5viQX9E1CA== - -"@react-native/virtualized-lists@0.74.81": - version "0.74.81" - resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.81.tgz#8e43d4c72ec561754491eae731f40877f03d05fb" - integrity sha512-5jF9S10Ug2Wl+L/0+O8WmbC726sMMX8jk/1JrvDDK+0DRLMobfjLc1L26fONlVBF7lE5ctqvKZ9TlKdhPTNOZg== - dependencies: - invariant "^2.2.4" - nullthrows "^1.1.1" - -"@react-navigation/bottom-tabs@~6.5.7": - version "6.5.20" - resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.20.tgz#5335e75b02c527ef0569bd97d4f9185d65616e49" - integrity sha512-ow6Z06iS4VqBO8d7FP+HsGjJLWt2xTWIvuWjpoCvsM/uQXzCRDIjBv9HaKcXbF0yTW7IMir0oDAbU5PFzEDdgA== - dependencies: - "@react-navigation/elements" "^1.3.30" - color "^4.2.3" - warn-once "^0.1.0" - -"@react-navigation/core@^6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.16.tgz#f9369a134805174536b9aa0f0f483b930511caf9" - integrity sha512-UDTJBsHxnzgFETR3ZxhctP+RWr4SkyeZpbhpkQoIGOuwSCkt1SE0qjU48/u6r6w6XlX8OqVudn1Ab0QFXTHxuQ== - dependencies: - "@react-navigation/routers" "^6.1.9" - escape-string-regexp "^4.0.0" - nanoid "^3.1.23" - query-string "^7.1.3" - react-is "^16.13.0" - use-latest-callback "^0.1.9" - -"@react-navigation/elements@^1.3.30": - version "1.3.30" - resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.30.tgz#a81371f599af1070b12014f05d6c09b1a611fd9a" - integrity sha512-plhc8UvCZs0UkV+sI+3bisIyn78wz9O/BiWZXpounu72k/R/Sj5PuZYFJ1fi6psvriUveMCGh4LeZckAZu2qiQ== - -"@react-navigation/native-stack@~6.9.12": - version "6.9.26" - resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-6.9.26.tgz#90facf7783c9927f094bc9f01c613af75b6c241e" - integrity sha512-++dueQ+FDj2XkZ902DVrK79ub1vp19nSdAZWxKRgd6+Bc0Niiesua6rMCqymYOVaYh+dagwkA9r00bpt/U5WLw== - dependencies: - "@react-navigation/elements" "^1.3.30" - warn-once "^0.1.0" - -"@react-navigation/native@^6.1.17", "@react-navigation/native@~6.1.6": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.17.tgz#439f15a99809d26ea4682d2a3766081cf2ca31cf" - integrity sha512-mer3OvfwWOHoUSMJyLa4vnBH3zpFmCwuzrBPlw7feXklurr/ZDiLjLxUScOot6jLRMz/67GyilEYMmP99LL0RQ== - dependencies: - "@react-navigation/core" "^6.4.16" - escape-string-regexp "^4.0.0" - fast-deep-equal "^3.1.3" - nanoid "^3.1.23" - -"@react-navigation/routers@^6.1.9": - version "6.1.9" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-6.1.9.tgz#73f5481a15a38e36592a0afa13c3c064b9f90bed" - integrity sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA== - dependencies: - nanoid "^3.1.23" - -"@react-navigation/stack@^6.3.29": - version "6.3.29" - resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.3.29.tgz#b03b2f2baa36c06e4c9e8c7da80d62f83ad0b835" - integrity sha512-tzlGkoRgB6P7vgw7rHuWo3TL7Gzu6xh5LMf+zSdCuEiKp/qASzxYfnTEr9tOLbVs/gf+qeukEDheCSAJKVpBXw== - dependencies: - "@react-navigation/elements" "^1.3.30" - color "^4.2.3" - warn-once "^0.1.0" - -"@reduxjs/toolkit@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.3.tgz#5ce71cbf162f98c5dafb49bd3f1e11c5486ab9c4" - integrity sha512-76dll9EnJXg4EVcI5YNxZA/9hSAmZsFqzMmNRHvIlzw2WS/twfcVX3ysYrWGJMClwEmChQFC4yRq74tn6fdzRA== - dependencies: - immer "^10.0.3" - redux "^5.0.1" - redux-thunk "^3.1.0" - reselect "^5.0.1" - -"@remix-run/node@^1.19.3": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@remix-run/node/-/node-1.19.3.tgz#d27e2f742fc45379525cb3fca466a883ca06d6c9" - integrity sha512-z5qrVL65xLXIUpU4mkR4MKlMeKARLepgHAk4W5YY3IBXOreRqOGUC70POViYmY7x38c2Ia1NwqL80H+0h7jbMw== - dependencies: - "@remix-run/server-runtime" "1.19.3" - "@remix-run/web-fetch" "^4.3.6" - "@remix-run/web-file" "^3.0.3" - "@remix-run/web-stream" "^1.0.4" - "@web3-storage/multipart-parser" "^1.0.0" - abort-controller "^3.0.0" - cookie-signature "^1.1.0" - source-map-support "^0.5.21" - stream-slice "^0.1.2" - -"@remix-run/router@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.7.2.tgz#cba1cf0a04bc04cb66027c51fa600e9cbc388bc8" - integrity sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A== - -"@remix-run/server-runtime@1.19.3": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-1.19.3.tgz#206b55337c266c5bc254878f8ff3cd5677cc60fb" - integrity sha512-KzQ+htUsKqpBgKE2tWo7kIIGy3MyHP58Io/itUPvV+weDjApwr9tQr9PZDPA3yAY6rAzLax7BU0NMSYCXWFY5A== - dependencies: - "@remix-run/router" "1.7.2" - "@types/cookie" "^0.4.1" - "@web3-storage/multipart-parser" "^1.0.0" - cookie "^0.4.1" - set-cookie-parser "^2.4.8" - source-map "^0.7.3" - -"@remix-run/web-blob@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@remix-run/web-blob/-/web-blob-3.1.0.tgz#e0c669934c1eb6028960047e57a13ed38bbfb434" - integrity sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g== - dependencies: - "@remix-run/web-stream" "^1.1.0" - web-encoding "1.1.5" - -"@remix-run/web-fetch@^4.3.6": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz#ce7aedef72cc26e15060e8cf84674029f92809b6" - integrity sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA== - dependencies: - "@remix-run/web-blob" "^3.1.0" - "@remix-run/web-file" "^3.1.0" - "@remix-run/web-form-data" "^3.1.0" - "@remix-run/web-stream" "^1.1.0" - "@web3-storage/multipart-parser" "^1.0.0" - abort-controller "^3.0.0" - data-uri-to-buffer "^3.0.1" - mrmime "^1.0.0" - -"@remix-run/web-file@^3.0.3", "@remix-run/web-file@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@remix-run/web-file/-/web-file-3.1.0.tgz#07219021a2910e90231bc30ca1ce693d0e9d3825" - integrity sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ== - dependencies: - "@remix-run/web-blob" "^3.1.0" - -"@remix-run/web-form-data@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz#47f9ad8ce8bf1c39ed83eab31e53967fe8e3df6a" - integrity sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A== - dependencies: - web-encoding "1.1.5" - -"@remix-run/web-stream@^1.0.4", "@remix-run/web-stream@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@remix-run/web-stream/-/web-stream-1.1.0.tgz#b93a8f806c2c22204930837c44d81fdedfde079f" - integrity sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA== - dependencies: - web-streams-polyfill "^3.1.1" - -"@rnx-kit/chromium-edge-launcher@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz#c0df8ea00a902c7a417cd9655aab06de398b939c" - integrity sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg== - dependencies: - "@types/node" "^18.0.0" - escape-string-regexp "^4.0.0" - is-wsl "^2.2.0" - lighthouse-logger "^1.0.0" - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@rushstack/eslint-patch@^1.3.3": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" - integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== - -"@segment/loosely-validate-event@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz#87dfc979e5b4e7b82c5f1d8b722dfd5d77644681" - integrity sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw== - dependencies: - component-type "^1.2.1" - join-component "^1.1.0" - -"@sideway/address@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" - integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@svgr/babel-plugin-add-jsx-attribute@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" - integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== - -"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" - integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" - integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" - integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== - -"@svgr/babel-plugin-svg-dynamic-title@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" - integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== - -"@svgr/babel-plugin-svg-em-dimensions@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" - integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== - -"@svgr/babel-plugin-transform-react-native-svg@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" - integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== - -"@svgr/babel-plugin-transform-svg-component@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" - integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== - -"@svgr/babel-preset@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" - integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" - "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" - "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" - "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" - "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" - "@svgr/babel-plugin-transform-svg-component" "8.0.0" - -"@svgr/core@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" - integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== - dependencies: - "@babel/core" "^7.21.3" - "@svgr/babel-preset" "8.1.0" - camelcase "^6.2.0" - cosmiconfig "^8.1.3" - snake-case "^3.0.4" - -"@svgr/hast-util-to-babel-ast@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" - integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== - dependencies: - "@babel/types" "^7.21.3" - entities "^4.4.0" - -"@svgr/plugin-jsx@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" - integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== - dependencies: - "@babel/core" "^7.21.3" - "@svgr/babel-preset" "8.1.0" - "@svgr/hast-util-to-babel-ast" "8.0.0" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" - integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== - dependencies: - cosmiconfig "^8.1.3" - deepmerge "^4.3.1" - svgo "^3.0.2" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/helpers@0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" - integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== - dependencies: - "@swc/counter" "^0.1.3" - tslib "^2.4.0" - -"@tanstack/query-core@5.31.0": - version "5.31.0" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.31.0.tgz#b11372dedbf307bc8b2c25397c7107205bf50dfa" - integrity sha512-r1V6RXB1LUGoEp7HGHVK4Tl59kOvAfwI9/kNNwPsb6cR5oHgfn1683sQnoH/3xEDUKOen3fEO90EnGE+OjRw5A== - -"@tanstack/react-query@^5.29.0": - version "5.31.0" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.31.0.tgz#ead732a5323c6c2c95da3115542cabc0920e4748" - integrity sha512-/GUUDFA8yNIYZaSyImkecVfN9mAVw1Y+9LpHkOQ1DdWaKnbLtwfjelh6OF+6EtwQCycH50EjTL68UK3YTMxwvg== - dependencies: - "@tanstack/query-core" "5.31.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@trivago/prettier-plugin-sort-imports@^4.3.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" - integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== - dependencies: - "@babel/generator" "7.17.7" - "@babel/parser" "^7.20.5" - "@babel/traverse" "7.23.2" - "@babel/types" "7.17.0" - javascript-natural-sort "0.7.1" - lodash "^4.17.21" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== - dependencies: - "@babel/types" "^7.20.7" - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/geojson@^7946.0.13": - version "7946.0.14" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" - integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hammerjs@^2.0.36": - version "2.0.45" - resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.45.tgz#ffa764bb68a66c08db6efb9c816eb7be850577b1" - integrity sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jsdom@^20.0.0": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" - integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== - dependencies: - "@types/node" "*" - "@types/tough-cookie" "*" - parse5 "^7.0.0" - -"@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node-forge@^1.3.0": - version "1.3.11" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" - integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@^20": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== - dependencies: - undici-types "~5.26.4" - -"@types/node@^18.0.0": - version "18.19.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" - integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== - dependencies: - undici-types "~5.26.4" - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/react-dom@^18": - version "18.2.25" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.25.tgz#2946a30081f53e7c8d585eb138277245caedc521" - integrity sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18", "@types/react@~18.2.78": - version "18.2.79" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" - integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/semver@^7.3.12": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/tough-cookie@*": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" - integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== - -"@types/use-sync-external-store@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" - integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== - -"@types/uuid@^9.0.8": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^15.0.0": - version "15.0.19" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" - integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.30.5": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.30.5": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" - integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== - dependencies: - "@typescript-eslint/scope-manager" "7.2.0" - "@typescript-eslint/types" "7.2.0" - "@typescript-eslint/typescript-estree" "7.2.0" - "@typescript-eslint/visitor-keys" "7.2.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/scope-manager@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" - integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== - dependencies: - "@typescript-eslint/types" "7.2.0" - "@typescript-eslint/visitor-keys" "7.2.0" - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/types@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" - integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/typescript-estree@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" - integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== - dependencies: - "@typescript-eslint/types" "7.2.0" - "@typescript-eslint/visitor-keys" "7.2.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@typescript-eslint/visitor-keys@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" - integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== - dependencies: - "@typescript-eslint/types" "7.2.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@urql/core@2.3.6": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-2.3.6.tgz#ee0a6f8fde02251e9560c5f17dce5cd90f948552" - integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw== - dependencies: - "@graphql-typed-document-node/core" "^3.1.0" - wonka "^4.0.14" - -"@urql/core@>=2.3.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.1.tgz#05c429ad24fda80b5d78ce746dfec407af98306b" - integrity sha512-bTtJDbPGF7UNynGt0E0DgokBeGUL9IU33+k7s/c6dvBUjwO2mOxB0GWNe7fhUcqIJAU1sONYkabTep/OGaxhsQ== - dependencies: - "@0no-co/graphql.web" "^1.0.5" - wonka "^6.3.2" - -"@urql/exchange-retry@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz#13252108b5a111aab45f9982f4db18d1a286e423" - integrity sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg== - dependencies: - "@urql/core" ">=2.3.1" - wonka "^4.0.14" - -"@web3-storage/multipart-parser@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" - integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== - -"@xmldom/xmldom@^0.8.8": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== - -"@xmldom/xmldom@~0.7.7": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" - integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== - -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" - integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== - dependencies: - acorn "^8.1.0" - acorn-walk "^8.0.2" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.0.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.1.0, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -anser@^1.4.9: - version "1.4.10" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" - integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" - integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== - -ansi-fragments@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" - integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== - dependencies: - colorette "^1.0.7" - slice-ansi "^2.0.0" - strip-ansi "^5.0.0" - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -appdirsjs@^1.2.4: - version "1.2.7" - resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" - integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== - -application-config-path@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/application-config-path/-/application-config-path-0.1.1.tgz#8b5ac64ff6afdd9bd70ce69f6f64b6998f5f756e" - integrity sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw== - -arg@5.0.2, arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlast@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -asap@~2.0.3, asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -ast-types@0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" - integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== - dependencies: - tslib "^2.0.1" - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.19: - version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== - dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== - -axios@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - -babel-jest@^29.2.1, babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" - integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.1" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" - integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - core-js-compat "^3.36.1" - -babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" - integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - -babel-plugin-react-native-web@~0.18.10: - version "0.18.12" - resolved "https://registry.yarnpkg.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.18.12.tgz#3e9764484492ea612a16b40135b07c2d05b7969d" - integrity sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw== - -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - -babel-plugin-transform-flow-enums@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" - integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== - dependencies: - "@babel/plugin-syntax-flow" "^7.12.1" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-expo@~10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-10.0.2.tgz#5aae992b8c85dce6cf98334c9991d3052c567950" - integrity sha512-hg06qdSTK7MjKmFXSiq6cFoIbI3n3uT8a3NI2EZoISWhu+tedCj4DQduwi+3adFuRuYvAwECI0IYn/5iGh5zWQ== - dependencies: - "@babel/plugin-proposal-decorators" "^7.12.9" - "@babel/plugin-transform-export-namespace-from" "^7.22.11" - "@babel/plugin-transform-object-rest-spread" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.22.15" - "@babel/preset-env" "^7.20.0" - "@babel/preset-react" "^7.22.15" - "@react-native/babel-preset" "^0.73.18" - babel-plugin-react-native-web "~0.18.10" - react-refresh "0.14.0" - -babel-preset-fbjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.2.3, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -better-opn@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz#f96f35deaaf8f34144a4102651babcf00d1d8817" - integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== - dependencies: - open "^8.0.4" - -big-integer@1.6.x, big-integer@^1.6.16: - version "1.6.52" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blueimp-md5@^2.10.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" - integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -bplist-creator@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" - integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== - dependencies: - stream-buffers "2.2.x" - -bplist-parser@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" - integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== - dependencies: - big-integer "1.6.x" - -bplist-parser@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.2.tgz#3ac79d67ec52c4c107893e0237eb787cbacbced7" - integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== - dependencies: - big-integer "1.6.x" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -broadcast-channel@^3.4.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" - integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== - dependencies: - "@babel/runtime" "^7.7.2" - detect-node "^2.1.0" - js-sha3 "0.8.0" - microseconds "0.2.0" - nano-time "1.0.0" - oblivious-set "1.0.0" - rimraf "3.0.2" - unload "2.2.0" - -browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.4.3, buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== - -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -cacache@^15.3.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -calendarize@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/calendarize/-/calendarize-1.1.1.tgz#0fa8b8de6b5e6ff9f9fbb89cc3a8c01aace291c2" - integrity sha512-C2JyBAtNp2NG4DX4fA1EILggLt/5PlYzvQR0crHktoAPBc9TlIfdhzg7tWekCbe+pH6+9qoK+FhPbi+vYJJlqw== - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001612" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz#d34248b4ec1f117b70b24ad9ee04c90e0b8a14ae" - integrity sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g== - -chalk@^2.0.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -char-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" - integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== - -charenc@0.0.2, charenc@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-launcher@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da" - integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ== - dependencies: - "@types/node" "*" - escape-string-regexp "^4.0.0" - is-wsl "^2.2.0" - lighthouse-logger "^1.0.0" - -chromium-edge-launcher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz#0443083074715a13c669530b35df7bfea33b1509" - integrity sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA== - dependencies: - "@types/node" "*" - escape-string-regexp "^4.0.0" - is-wsl "^2.2.0" - lighthouse-logger "^1.0.0" - mkdirp "^1.0.4" - rimraf "^3.0.2" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0, ci-info@^3.3.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== - -class-variance-authority@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" - integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== - dependencies: - clsx "2.0.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.0.0, cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -clone@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -clsx@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - -clsx@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -colorette@^1.0.7: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.4, command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^9.4.1: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compare-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compare-urls/-/compare-urls-2.0.0.tgz#9b378c4abd43980a8700fffec9afb85de4df9075" - integrity sha512-eCJcWn2OYFEIqbm70ta7LQowJOOZZqq1a2YbbFCFI1uwSvj+TWMwXVn7vPR1ceFNcAIt5RSTDbwdlX82gYLTkA== - dependencies: - normalize-url "^2.0.1" - -component-type@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.2.2.tgz#4458ecc0c1871efc6288bfaff0cbdab08141d079" - integrity sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -connect@^3.6.5, connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.1.tgz#790dea2cce64638c7ae04d9fabed193bd7ccf3b4" - integrity sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw== - -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" - integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== - dependencies: - browserslist "^4.23.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^8.1.3: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-react-class@^15.6.0: - version "15.7.0" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" - integrity sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng== - dependencies: - loose-envify "^1.3.1" - object-assign "^4.1.1" - -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2, crypt@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-in-js-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" - integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== - dependencies: - hyphenate-style-name "^1.0.3" - -css-mediaquery@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" - integrity sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q== - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-to-react-native@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-tree@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -css-tree@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" - integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== - dependencies: - mdn-data "2.0.28" - source-map-js "^1.0.1" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csso@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" - integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== - dependencies: - css-tree "~2.2.0" - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -dag-map@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-1.0.2.tgz#e8379f041000ed561fc515475c1ed2c85eece8d7" - integrity sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-uri-to-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - -data-urls@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -date-fns@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" - integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== - -dayjs@^1.8.15: - version "1.11.10" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" - integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== - -debug@2.6.9, debug@^2.2.0, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decimal.js@^10.4.2: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2, deepmerge@^4.3.0, deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-node@^2.0.4, detect-node@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@~11.0.6: - version "11.0.6" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.6.tgz#f2c840fd924d7c77a94eff98f153331d876882d3" - integrity sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g== - dependencies: - dotenv "^16.4.4" - -dotenv@^16.4.4, dotenv@~16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.668: - version "1.4.745" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.745.tgz#9c202ce9cbf18a5b5e0ca47145fd127cc4dd2290" - integrity sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -env-editor@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-0.4.2.tgz#4e76568d0bd8f5c2b6d314a9412c8fe9aa3ae861" - integrity sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA== - -envinfo@^7.10.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.12.0.tgz#b56723b39c2053d67ea5714f026d05d4f5cc7acd" - integrity sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg== - -eol@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" - integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.1.4" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" - integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== - dependencies: - stackframe "^1.3.4" - -errorhandler@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" - integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== - dependencies: - accepts "~1.3.7" - escape-html "~1.0.3" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-next@14.2.3: - version "14.2.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.3.tgz#2fb0f7c4eccda530a4b5054438162b2303786d4f" - integrity sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg== - dependencies: - "@next/eslint-plugin-next" "14.2.3" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-config-prettier@^8.5.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" - integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-eslint-comments@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" - integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== - dependencies: - escape-string-regexp "^1.0.5" - ignore "^5.0.5" - -eslint-plugin-ft-flow@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz#3b3c113c41902bcbacf0e22b536debcfc3c819e8" - integrity sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg== - dependencies: - lodash "^4.17.21" - string-natural-compare "^3.0.1" - -eslint-plugin-import@^2.28.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jest@^26.5.3: - version "26.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz#7931c31000b1c19e57dbfb71bbf71b817d1bf949" - integrity sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng== - dependencies: - "@typescript-eslint/utils" "^5.10.0" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== - dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-prettier@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" - integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== - dependencies: - prettier-linter-helpers "^1.0.0" - synckit "^0.8.6" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705", eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react-native-globals@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" - integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== - -eslint-plugin-react-native@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz#5343acd3b2246bc1b857ac38be708f070d18809f" - integrity sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q== - dependencies: - eslint-plugin-react-native-globals "^0.1.1" - -eslint-plugin-react@^7.30.1, eslint-plugin-react@^7.33.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.10" - -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8, eslint@^8.56.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-target-shim@^5.0.0, event-target-shim@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -exec-async@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/exec-async/-/exec-async-2.2.0.tgz#c7c5ad2eef3478d38390c6dd3acfe8af0efc8301" - integrity sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^5.0.0, execa@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -expo-application@^5.8.4, expo-application@~5.8.0: - version "5.8.4" - resolved "https://registry.yarnpkg.com/expo-application/-/expo-application-5.8.4.tgz#9c43c4a778a5ccf5a88afb36d6547dfdc34b5494" - integrity sha512-mH0gSlFzMuiT20TkZnBppzUtdF6TFHwcaTRnvkSZanN9iTOeEEfQQ60hHT4lBizHjFWRs/QYZVtXGvkQ/cyMpg== - -expo-asset@~9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-9.0.2.tgz#e8a6b6da356d5fc97955599d2fa49af78c7f0bfd" - integrity sha512-PzYKME1MgUOoUvwtdzhAyXkjXOXGiSYqGKG/MsXwWr0Ef5wlBaBm2DCO9V6KYbng5tBPFu6hTjoRNil1tBOSow== - dependencies: - "@react-native/assets-registry" "~0.73.1" - blueimp-md5 "^2.10.0" - expo-constants "~15.4.0" - expo-file-system "~16.0.0" - invariant "^2.2.4" - md5-file "^3.2.3" - -expo-auth-session@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/expo-auth-session/-/expo-auth-session-5.4.0.tgz#caae0bae4eeae649d320124ba8cd623c40c6cf0a" - integrity sha512-ZwjPMsMgCqdMi+vnhDbtjOAF12Y9+y1bYvorn/jQs47aFg6yeIRHycSOM/WL4hpFr+fAxycP3mIJeHVYfF3zuQ== - dependencies: - expo-application "~5.8.0" - expo-constants "~15.4.0" - expo-crypto "~12.8.0" - expo-linking "~6.2.0" - expo-web-browser "~12.8.0" - invariant "^2.2.4" - -expo-constants@~15.4.0, expo-constants@~15.4.3: - version "15.4.6" - resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-15.4.6.tgz#d4e9b21b70c5602457962700f2e90a75356b487b" - integrity sha512-vizE69dww2Vl0PTWWvDmK0Jo2/J+WzdcMZlA05YEnEYofQuhKxTVsiuipf79mSOmFavt4UQYC1UnzptzKyfmiQ== - dependencies: - "@expo/config" "~8.5.0" - -expo-crypto@~12.8.0: - version "12.8.1" - resolved "https://registry.yarnpkg.com/expo-crypto/-/expo-crypto-12.8.1.tgz#c7de01a61e89a0600f8f62ef6e71de4e6d3fcbae" - integrity sha512-EJEzmfBUSkGfALTlZRKUbh1RMKF7mWI12vkhO2w6bhGO4bjgGB8XzUHgLfrvSjphDFMx/lwaR6bAQDmXKO9UkQ== - dependencies: - base64-js "^1.3.0" - -expo-dev-client@~3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-3.3.11.tgz#f2541ccbcfc2ba32bcea47293bc9beae4e10db60" - integrity sha512-9nhhbfbskfmjp/tlRS5KvDpCoW0BREJBxpu2GyjKu7nDB33W8fJLL0wXgNhP+QEb93r37o3uezKmUm2kibOvTw== - dependencies: - expo-dev-launcher "3.6.9" - expo-dev-menu "4.5.8" - expo-dev-menu-interface "1.7.2" - expo-manifests "~0.13.0" - expo-updates-interface "~0.15.1" - -expo-dev-launcher@3.6.9: - version "3.6.9" - resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-3.6.9.tgz#5e104e0533a46f3614c1691673da3351092e8d1d" - integrity sha512-MBDMAqjCMVYt1Zv47u2dJTp4d8gCZMfM4GWAFhfQy3G6XzkUlFtewaQefAqy93FcYOv6BYdC9yZOLOb06tqTfA== - dependencies: - ajv "8.11.0" - expo-dev-menu "4.5.8" - expo-manifests "~0.13.0" - resolve-from "^5.0.0" - semver "^7.5.3" - -expo-dev-menu-interface@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-1.7.2.tgz#772fb97c6b0a44c27965cdfcfa078f316b0930ca" - integrity sha512-V/geSB9rW0IPTR+d7E5CcvkV0uVUCE7SMHZqE/J0/dH06Wo8AahB16fimXeh5/hTL2Qztq8CQ41xpFUBoA9TEw== - -expo-dev-menu@4.5.8: - version "4.5.8" - resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-4.5.8.tgz#21940385124c7d2745066bbcb42185ebd35f66bc" - integrity sha512-GXfI0CmYlqjOqyFjtplXO9PSoJQoy89+50lbUSNZykDsGyvzCPzl4txdQcdHHSglKYr7lWV7aeMVeehuSct60w== - dependencies: - expo-dev-menu-interface "1.7.2" - semver "^7.5.3" - -expo-file-system@~16.0.0, expo-file-system@~16.0.9: - version "16.0.9" - resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-16.0.9.tgz#cbd6c4b228b60a6b6c71fd1b91fe57299fb24da7" - integrity sha512-3gRPvKVv7/Y7AdD9eHMIdfg5YbUn2zbwKofjsloTI5sEC57SLUFJtbLvUCz9Pk63DaSQ7WIE1JM0EASyvuPbuw== - -expo-font@~11.10.2, expo-font@~11.10.3: - version "11.10.3" - resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-11.10.3.tgz#a3115ebda8e09bd7cb8052619a4bbe606f0c17f4" - integrity sha512-q1Td2zUvmLbCA9GV4OG4nLPw5gJuNY1VrPycsnemN1m8XWTzzs8nyECQQqrcBhgulCgcKZZJJ6U0kC2iuSoQHQ== - dependencies: - fontfaceobserver "^2.1.0" - -expo-haptics@~12.8.1: - version "12.8.1" - resolved "https://registry.yarnpkg.com/expo-haptics/-/expo-haptics-12.8.1.tgz#42b996763be33d661bd33bbc3b3958c3f2734b9d" - integrity sha512-ntLsHkfle8K8w9MW8pZEw92ZN3sguaGUSSIxv30fPKNeQFu7Cq/h47Qv3tONv2MO3wU48N9FbKnant6XlfptpA== - -expo-json-utils@~0.12.0: - version "0.12.3" - resolved "https://registry.yarnpkg.com/expo-json-utils/-/expo-json-utils-0.12.3.tgz#cabb704a344d6d75f225cf4032c64479e442a2a9" - integrity sha512-4pypQdinpNc6XY9wsZk56njvzDh+B/9mISr7FPP3CVk1QGB1nSLh883/BCDSgnsephATZkC5HG+cdE60kCAR6A== - -expo-keep-awake@~12.8.2: - version "12.8.2" - resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-12.8.2.tgz#6cfdf8ad02b5fa130f99d4a1eb98e459d5b4332e" - integrity sha512-uiQdGbSX24Pt8nGbnmBtrKq6xL/Tm3+DuDRGBk/3ZE/HlizzNosGRIufIMJ/4B4FRw4dw8KU81h2RLuTjbay6g== - -expo-linking@~6.2.0, expo-linking@~6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-6.2.2.tgz#b7e148068ae49fd9ad814428c16fdf7a236e8aca" - integrity sha512-FEe6lP4f7xFT/vjoHRG+tt6EPVtkEGaWNK1smpaUevmNdyCJKqW0PDB8o8sfG6y7fly8ULe8qg3HhKh5J7aqUQ== - dependencies: - expo-constants "~15.4.3" - invariant "^2.2.4" - -expo-manifests@~0.13.0: - version "0.13.2" - resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-0.13.2.tgz#02b28bb2fb002ef93a03faf1ede9ecaa43e5d6c0" - integrity sha512-l0Sia1WmLULx8V41K8RzGLsFoTe4qqthPRGpHjItsYn8ZB6lRrdTBM9OYp2McIflgqN1HAimUCQMFIwJyH+UmA== - dependencies: - "@expo/config" "~8.5.0" - expo-json-utils "~0.12.0" - -expo-modules-autolinking@1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-1.10.3.tgz#19f349884a90f3f27ec9d64e8f2fa6be609558c5" - integrity sha512-pn4n2Dl4iRh/zUeiChjRIe1C7EqOw1qhccr85viQV7W6l5vgRpY0osE51ij5LKg/kJmGRcJfs12+PwbdTplbKw== - dependencies: - "@expo/config" "~8.5.0" - chalk "^4.1.0" - commander "^7.2.0" - fast-glob "^3.2.5" - find-up "^5.0.0" - fs-extra "^9.1.0" - -expo-modules-core@1.11.13: - version "1.11.13" - resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.11.13.tgz#a8e63ad844e966dce78dea40b50839af6c3bc518" - integrity sha512-2H5qrGUvmLzmJNPDOnovH1Pfk5H/S/V0BifBmOQyDc9aUh9LaDwkqnChZGIXv8ZHDW8JRlUW0QqyWxTggkbw1A== - dependencies: - invariant "^2.2.4" - -expo-router@~3.4.8: - version "3.4.8" - resolved "https://registry.yarnpkg.com/expo-router/-/expo-router-3.4.8.tgz#c7e55f500467985950760d325f75d06f8dfc17e7" - integrity sha512-fOOAWHH4LSPjPFtIZbApxdTNU8xSS8qKvhZ7PfWNMfx9510J1R1Ce/nwENPzcRLHRuVofDsSAEBfi4kV03fJwg== - dependencies: - "@expo/metro-runtime" "3.1.3" - "@expo/server" "^0.3.0" - "@radix-ui/react-slot" "1.0.1" - "@react-navigation/bottom-tabs" "~6.5.7" - "@react-navigation/native" "~6.1.6" - "@react-navigation/native-stack" "~6.9.12" - expo-splash-screen "0.26.4" - react-helmet-async "^1.3.0" - schema-utils "^4.0.1" - -expo-secure-store@~12.8.1: - version "12.8.1" - resolved "https://registry.yarnpkg.com/expo-secure-store/-/expo-secure-store-12.8.1.tgz#369a570702fa1dc0c49ea41a5ab18aca2a986d38" - integrity sha512-Ju3jmkHby4w7rIzdYAt9kQyQ7HhHJ0qRaiQOInknhOLIltftHjEgF4I1UmzKc7P5RCfGNmVbEH729Pncp/sHXQ== - -expo-splash-screen@0.26.4, expo-splash-screen@~0.26.4: - version "0.26.4" - resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.26.4.tgz#bc1fb226c6eae03ee351a3ebe5521a37f868cbc7" - integrity sha512-2DwofTQ0FFQCsvDysm/msENsbyNsJiAJwK3qK/oXeizECAPqD7bK19J4z9kuEbr7ORPX9MLnTQYKl6kmX3keUg== - dependencies: - "@expo/prebuild-config" "6.7.4" - -expo-status-bar@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/expo-status-bar/-/expo-status-bar-1.11.1.tgz#a11318741d361048c11db2b16c4364a79a74af30" - integrity sha512-ddQEtCOgYHTLlFUe/yH67dDBIoct5VIULthyT3LRJbEwdpzAgueKsX2FYK02ldh440V87PWKCamh7R9evk1rrg== - -expo-system-ui@~2.9.4: - version "2.9.4" - resolved "https://registry.yarnpkg.com/expo-system-ui/-/expo-system-ui-2.9.4.tgz#f5f210805527e728f47edcd6a5aba3c1e83c9465" - integrity sha512-ExJ8AzEZjb/zbg6nRLrN/mqxWr6e4fAcT0LBN/YvPZljbMo23HU+/lPy0/YctF1tRRvQ3Z95ABSNjnx9ajQBjg== - dependencies: - "@react-native/normalize-color" "^2.0.0" - debug "^4.3.2" - -expo-updates-interface@~0.15.1: - version "0.15.3" - resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-0.15.3.tgz#cdee536dea0a8692833a4d074005bf9c6bbbdd99" - integrity sha512-uLvsbaCmUsXgJqeen8rYH/jPr874ZUCXEvWpKHxrCv5/XATPlYEaDuecbNSGQ+cu78i6MdtB4BHOwZmoH2d47A== - -expo-web-browser@~12.8.0, expo-web-browser@~12.8.2: - version "12.8.2" - resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-12.8.2.tgz#f34fb85c80031e0dddd4f9b9efd03cb60333b089" - integrity sha512-Mw8WoFMSADecNjtC4PZVsVj1/lYdxIAH1jOVV+F8v8SEWYxORWofoShfXg7oUxRLu0iUG8JETfO5y4m8+fOgdg== - dependencies: - compare-urls "^2.0.0" - url "^0.11.0" - -expo@^50.0.14: - version "50.0.17" - resolved "https://registry.yarnpkg.com/expo/-/expo-50.0.17.tgz#ab0998d7e7c18e8d12efd9091f9688978b0e89ed" - integrity sha512-eD8Nh10BgVwecU7EVyogx7X314ajxVpJdFwkXhi341AD61S2WPX31NMHW82XGXas6dbDjdbgtaOMo5H/vylB7Q== - dependencies: - "@babel/runtime" "^7.20.0" - "@expo/cli" "0.17.10" - "@expo/config" "8.5.6" - "@expo/config-plugins" "7.9.1" - "@expo/metro-config" "0.17.7" - "@expo/vector-icons" "^14.0.0" - babel-preset-expo "~10.0.2" - expo-asset "~9.0.2" - expo-file-system "~16.0.9" - expo-font "~11.10.3" - expo-keep-awake "~12.8.2" - expo-modules-autolinking "1.10.3" - expo-modules-core "1.11.13" - fbemitter "^3.0.0" - whatwg-url-without-unicode "8.0.0-3" - -extend@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.2.12, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1, fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-loops@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" - integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== - -fast-xml-parser@^4.0.12, fast-xml-parser@^4.2.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz#190f9d99097f0c8f2d3a0e681a10404afca052ff" - integrity sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw== - dependencies: - strnum "^1.0.5" - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.4: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^1.0.35" - -fetch-retry@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-4.1.1.tgz#fafe0bb22b54f4d0a9c788dff6dd7f8673ca63f3" - integrity sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0, find-up@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-yarn-workspace-root@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -flow-enums-runtime@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz#5bb0cd1b0a3e471330f4d109039b7eba5cb3e787" - integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw== - -flow-parser@0.*: - version "0.234.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.234.0.tgz#92af26f40ea7e79ca4bd66a066d6d6aa3b4223bf" - integrity sha512-J1Wn32xDF1l8FqwshoQnTwC9K3aJ83MFuXUx9AcBQr8ttbI/rkjEgAqnjxaIJuZ6RGMfccN5ZxDJSOMM64qy9Q== - -flow-parser@^0.206.0: - version "0.206.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" - integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== - -follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -fontfaceobserver@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz#5fb392116e75d5024b7ec8e4f2ce92106d1488c8" - integrity sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -freeport-async@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/freeport-async/-/freeport-async-2.0.0.tgz#6adf2ec0c629d11abff92836acd04b399135bab4" - integrity sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^8.1.0, fs-extra@~8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.0, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-port@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== - dependencies: - resolve-pkg-maps "^1.0.0" - -getenv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" - integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^10.3.10: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.10.2" - -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7, glob@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.1, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -graphql-tag@^2.10.1: - version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql@15.8.0: - version "15.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" - integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hermes-estree@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.19.1.tgz#d5924f5fac2bf0532547ae9f506d6db8f3c96392" - integrity sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g== - -hermes-estree@0.20.1: - version "0.20.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.20.1.tgz#0b9a544cf883a779a8e1444b915fa365bef7f72d" - integrity sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg== - -hermes-parser@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.19.1.tgz#1044348097165b7c93dc198a80b04ed5130d6b1a" - integrity sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A== - dependencies: - hermes-estree "0.19.1" - -hermes-parser@0.20.1: - version "0.20.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.20.1.tgz#ad10597b99f718b91e283f81cbe636c50c3cff92" - integrity sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA== - dependencies: - hermes-estree "0.20.1" - -hermes-profile-transformer@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" - integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== - dependencies: - source-map "^0.7.3" - -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" - integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== - dependencies: - lru-cache "^6.0.0" - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.0.5, ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -image-size@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" - integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== - dependencies: - queue "6.0.2" - -immer@^10.0.3: - version "10.0.4" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.4.tgz#09af41477236b99449f9d705369a4daaf780362b" - integrity sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-prefixer@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz#4290ed453ab0e4441583284ad86e41ad88384f44" - integrity sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg== - dependencies: - css-in-js-utils "^3.1.0" - fast-loops "^1.1.3" - -install@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/install/-/install-0.13.0.tgz#6af6e9da9dd0987de2ab420f78e60d9c17260776" - integrity sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA== - -internal-ip@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== - -ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@~1.1.1, is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.10, is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== - dependencies: - is-extglob "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-invalid-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34" - integrity sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ== - dependencies: - is-glob "^2.0.0" - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2, is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13, is-typed-array@^1.1.3: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-valid-path@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-valid-path/-/is-valid-path-0.1.1.tgz#110f9ff74c37f663e1ec7915eb451f2db93ac9df" - integrity sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A== - dependencies: - is-invalid-path "^0.1.0" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" - integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5, jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -javascript-natural-sort@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" - integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-jsdom@^29.2.1: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" - integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/jsdom" "^20.0.0" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - jsdom "^20.0.0" - -jest-environment-node@^29.6.3, jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-expo@~50.0.4: - version "50.0.4" - resolved "https://registry.yarnpkg.com/jest-expo/-/jest-expo-50.0.4.tgz#3e72524982487dd1fa2a77de716c86f0a5fd2b1a" - integrity sha512-qtCqtdGaQtEcA3vc6UPN5Xn78jAyoBJj6Pxpk2raizdwI7carsg9Us9Wc+D4kl+7+ffhBMeS3cYWeJqVIZl1pA== - dependencies: - "@expo/config" "~8.5.0" - "@expo/json-file" "^8.2.37" - "@jest/create-cache-key-function" "^29.2.1" - babel-jest "^29.2.1" - find-up "^5.0.0" - jest-environment-jsdom "^29.2.1" - jest-watch-select-projects "^2.0.0" - jest-watch-typeahead "2.2.1" - json5 "^2.2.3" - lodash "^4.17.19" - react-test-renderer "18.2.0" - stacktrace-js "^2.0.2" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.0.0, jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.6.3, jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watch-select-projects@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz#4373d7e4de862aae28b46e036b669a4c913ea867" - integrity sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w== - dependencies: - ansi-escapes "^4.3.0" - chalk "^3.0.0" - prompts "^2.2.1" - -jest-watch-typeahead@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz#36601520a2a30fd561788552dbda9c76bb44814a" - integrity sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA== - dependencies: - ansi-escapes "^6.0.0" - chalk "^4.0.0" - jest-regex-util "^29.0.0" - jest-watcher "^29.0.0" - slash "^5.0.0" - string-length "^5.0.1" - strip-ansi "^7.0.1" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== -jest-watcher@^29.0.0, jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.6.3, jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.2.1: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -jimp-compact@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/jimp-compact/-/jimp-compact-0.16.1.tgz#9582aea06548a2c1e04dd148d7c3ab92075aefa3" - integrity sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww== - -jiti@^1.18.2, jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -joi@^17.2.1: - version "17.12.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.12.3.tgz#944646979cd3b460178547b12ba37aca8482f63d" - integrity sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g== - dependencies: - "@hapi/hoek" "^9.3.0" - "@hapi/topo" "^5.1.0" - "@sideway/address" "^4.1.5" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -join-component@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5" - integrity sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsc-android@^250231.0.0: - version "250231.0.0" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262" - integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== - -jsc-safe-url@^0.2.2, jsc-safe-url@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" - integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== - -jscodeshift@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" - integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== - dependencies: - "@babel/core" "^7.13.16" - "@babel/parser" "^7.13.16" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/preset-flow" "^7.13.13" - "@babel/preset-typescript" "^7.13.0" - "@babel/register" "^7.13.16" - babel-core "^7.0.0-bridge.0" - chalk "^4.1.2" - flow-parser "0.*" - graceful-fs "^4.2.4" - micromatch "^4.0.4" - neo-async "^2.5.0" - node-dir "^0.1.17" - recast "^0.21.0" - temp "^0.8.4" - write-file-atomic "^2.3.0" - -jsdom@^20.0.0: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" - integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-deref-sync@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz#cb08b4ff435a48b5a149652d7750fdd071009823" - integrity sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg== - dependencies: - clone "^2.1.2" - dag-map "~1.0.0" - is-valid-path "^0.1.1" - lodash "^4.17.13" - md5 "~2.2.0" - memory-cache "~0.2.0" - traverse "~0.6.6" - valid-url "~1.0.9" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== +fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: - json-buffer "3.0.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + reusify "^1.0.4" -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - language-subtag-registry "^0.3.20" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lighthouse-logger@^1.0.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz#aef90f9e97cd81db367c7634292ee22079280aaa" - integrity sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g== - dependencies: - debug "^2.6.9" - marky "^1.2.2" - -lightningcss-darwin-arm64@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz#56ab071e932f845dbb7667f44f5b78441175a343" - integrity sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg== - -lightningcss-darwin-x64@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz#c867308b88859ba61a2c46c82b1ca52ff73a1bd0" - integrity sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw== - -lightningcss-linux-arm-gnueabihf@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz#0f921dc45f2e5c3aea70fab98844ac0e5f2f81be" - integrity sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig== - -lightningcss-linux-arm64-gnu@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz#027f9df9c7f4ffa127c37a71726245a5794d7ba2" - integrity sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww== - -lightningcss-linux-arm64-musl@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz#85ea987da868524eac6db94f8e1eaa23d0b688a3" - integrity sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA== - -lightningcss-linux-x64-gnu@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz#02bec89579ab4153dccc0def755d1fd9e3ee7f3c" - integrity sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ== - -lightningcss-linux-x64-musl@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz#e36a5df8193ae961d22974635e4c100a1823bb8c" - integrity sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg== - -lightningcss-win32-x64-msvc@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz#0854dbd153035eca1396e2227c708ad43655a61c" - integrity sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg== - -lightningcss@~1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.19.0.tgz#fbbad0975de66252e38d96b5bdd2a62f2dd0ffbf" - integrity sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA== - dependencies: - detect-libc "^1.0.3" - optionalDependencies: - lightningcss-darwin-arm64 "1.19.0" - lightningcss-darwin-x64 "1.19.0" - lightningcss-linux-arm-gnueabihf "1.19.0" - lightningcss-linux-arm64-gnu "1.19.0" - lightningcss-linux-arm64-musl "1.19.0" - lightningcss-linux-x64-gnu "1.19.0" - lightningcss-linux-x64-musl "1.19.0" - lightningcss-win32-x64-msvc "1.19.0" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + to-regex-range "^5.0.1" -lilconfig@^3.0.0: +foreground-child@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== dependencies: - p-locate "^5.0.0" - -lodash.debounce@4.0.8, lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + cross-spawn "^7.0.0" + signal-exit "^4.0.1" -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -lodash.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - chalk "^2.0.1" + is-glob "^4.0.1" -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== +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== dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" + is-glob "^4.0.3" -logkitty@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" - integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - ansi-fragments "^0.2.1" - dayjs "^1.8.15" - yargs "^15.1.0" + is-glob "^4.0.1" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== +glob@^10.3.10, glob@^10.3.12: + version "10.3.15" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz" + integrity sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw== dependencies: - js-tokens "^3.0.0 || ^4.0.0" + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.11.0" + +graceful-fs@^4.2.11: + 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== -lower-case@^2.0.2: +hasown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - tslib "^2.0.3" - -lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + function-bind "^1.1.2" -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== +hast-util-embedded@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-2.0.1.tgz" + integrity sha512-QUdSOP1/o+/TxXtpPFXR2mUg2P+ySrmlX7QjwHZCXqMFyYk7YmcGSvqRW+4XgXAoHifdE1t2PwFaQK33TqVjSw== dependencies: - yallist "^3.0.2" + hast-util-is-element "^2.0.0" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== +hast-util-embedded@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz" + integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== dependencies: - yallist "^4.0.0" + "@types/hast" "^3.0.0" + hast-util-is-element "^3.0.0" -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== +hast-util-from-dom@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz" + integrity sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ== dependencies: - pify "^4.0.1" - semver "^5.6.0" + hastscript "^7.0.0" + web-namespaces "^2.0.0" -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" +hast-util-from-parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz" + integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hastscript "^7.0.0" + property-information "^6.0.0" + vfile "^5.0.0" + vfile-location "^4.0.0" + web-namespaces "^2.0.0" + +hast-util-has-property@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz" + integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== dependencies: - tmpl "1.0.5" + "@types/hast" "^3.0.0" -marky@^1.2.2: - version "1.2.5" - resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.5.tgz#55796b688cbd72390d2d399eaaf1832c9413e3c0" - integrity sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q== - -match-sorter@^6.0.2: - version "6.3.4" - resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.4.tgz#afa779d8e922c81971fbcb4781c7003ace781be7" - integrity sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg== +hast-util-is-body-ok-link@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-2.0.0.tgz" + integrity sha512-S58hCexyKdD31vMsErvgLfflW6vYWo/ixRLPJTtkOvLld24vyI8vmYmkgLA5LG3la2ME7nm7dLGdm48gfLRBfw== dependencies: - "@babel/runtime" "^7.23.8" - remove-accents "0.5.0" + "@types/hast" "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-element "^2.0.0" -md5-file@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" - integrity sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw== +hast-util-is-body-ok-link@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz" + integrity sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w== dependencies: - buffer-alloc "^1.1.0" + "@types/hast" "^3.0.0" -md5@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== +hast-util-is-element@^2.0.0: + version "2.1.3" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz" + integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" -md5@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - integrity sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ== +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== dependencies: - charenc "~0.0.1" - crypt "~0.0.1" - is-buffer "~1.1.1" - -md5hex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/md5hex/-/md5hex-1.0.0.tgz#ed74b477a2ee9369f75efee2f08d5915e52a42e8" - integrity sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.28: - version "2.0.28" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" - integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - -memoize-one@^5.0.0, memoize-one@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - -memory-cache@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a" - integrity sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + "@types/hast" "^3.0.0" -metro-babel-transformer@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.8.tgz#2951eeab76630b3c59f3874d04f4f12a6e73b2bd" - integrity sha512-TTzNwRZb2xxyv4J/+yqgtDAP2qVqH3sahsnFu6Xv4SkLqzrivtlnyUbaeTdJ9JjtADJUEjCbgbFgUVafrXdR9Q== - dependencies: - "@babel/core" "^7.20.0" - hermes-parser "0.20.1" - nullthrows "^1.1.1" - -metro-cache-key@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.8.tgz#d57af9c25f9fe7e755644594d602ef89124ee06b" - integrity sha512-qWKzxrLsRQK5m3oH8ePecqCc+7PEhR03cJE6Z6AxAj0idi99dHOSitTmY0dclXVB9vP2tQIAE8uTd8xkYGk8fA== - -metro-cache@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.8.tgz#bc7d38611e4f31686a99045d4f2956c0bff4dd3b" - integrity sha512-5svz+89wSyLo7BxdiPDlwDTgcB9kwhNMfNhiBZPNQQs1vLFXxOkILwQiV5F2EwYT9DEr6OPZ0hnJkZfRQ8lDYQ== - dependencies: - metro-core "0.80.8" - rimraf "^3.0.2" - -metro-config@0.80.8, metro-config@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.8.tgz#1961feed6334601951ea72600901dafade56a973" - integrity sha512-VGQJpfJawtwRzGzGXVUoohpIkB0iPom4DmSbAppKfumdhtLA8uVeEPp2GM61kL9hRvdbMhdWA7T+hZFDlo4mJA== - dependencies: - connect "^3.6.5" - cosmiconfig "^5.0.5" - jest-validate "^29.6.3" - metro "0.80.8" - metro-cache "0.80.8" - metro-core "0.80.8" - metro-runtime "0.80.8" - -metro-core@0.80.8, metro-core@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.8.tgz#85cf9745e767a33fe96bc5f166b71e213a482978" - integrity sha512-g6lud55TXeISRTleW6SHuPFZHtYrpwNqbyFIVd9j9Ofrb5IReiHp9Zl8xkAfZQp8v6ZVgyXD7c130QTsCz+vBw== - dependencies: - lodash.throttle "^4.1.1" - metro-resolver "0.80.8" - -metro-file-map@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.8.tgz#216e54db4dc8496815bd38bb806d469c5f5b66fd" - integrity sha512-eQXMFM9ogTfDs2POq7DT2dnG7rayZcoEgRbHPXvhUWkVwiKkro2ngcBE++ck/7A36Cj5Ljo79SOkYwHaWUDYDw== - dependencies: - anymatch "^3.0.3" - debug "^2.2.0" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - invariant "^2.2.4" - jest-worker "^29.6.3" - micromatch "^4.0.4" - node-abort-controller "^3.1.1" - nullthrows "^1.1.1" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -metro-minify-terser@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.8.tgz#166413d2286900e7fd764aa30497a1596bc18c00" - integrity sha512-y8sUFjVvdeUIINDuW1sejnIjkZfEF+7SmQo0EIpYbWmwh+kq/WMj74yVaBWuqNjirmUp1YNfi3alT67wlbBWBQ== +hast-util-parse-selector@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz" + integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: - terser "^5.15.0" - -metro-resolver@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.8.tgz#bcc8f8d7f874a9c5fee9ebbde8541d6dc88783df" - integrity sha512-JdtoJkP27GGoZ2HJlEsxs+zO7jnDUCRrmwXJozTlIuzLHMRrxgIRRby9fTCbMhaxq+iA9c+wzm3iFb4NhPmLbQ== + "@types/hast" "^2.0.0" -metro-runtime@0.80.8, metro-runtime@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.8.tgz#8f265369c05d9a3f05f9915842fac5d4e93f44bd" - integrity sha512-2oScjfv6Yb79PelU1+p8SVrCMW9ZjgEiipxq7jMRn8mbbtWzyv3g8Mkwr+KwOoDFI/61hYPUbY8cUnu278+x1g== +hast-util-phrasing@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-2.0.2.tgz" + integrity sha512-yGkCfPkkfCyiLfK6KEl/orMDr/zgCnq/NaO9HfULx6/Zga5fso5eqQA5Ov/JZVqACygvw9shRYWgXNcG2ilo7w== dependencies: - "@babel/runtime" "^7.0.0" + "@types/hast" "^2.0.0" + hast-util-embedded "^2.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-body-ok-link "^2.0.0" + hast-util-is-element "^2.0.0" -metro-source-map@0.80.8, metro-source-map@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.8.tgz#fe92c2b82739c34cf46372a2be07d4e9cac8eb09" - integrity sha512-+OVISBkPNxjD4eEKhblRpBf463nTMk3KMEeYS8Z4xM/z3qujGJGSsWUGRtH27+c6zElaSGtZFiDMshEb8mMKQg== +hast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz" + integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== dependencies: - "@babel/traverse" "^7.20.0" - "@babel/types" "^7.20.0" - invariant "^2.2.4" - metro-symbolicate "0.80.8" - nullthrows "^1.1.1" - ob1 "0.80.8" - source-map "^0.5.6" - vlq "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-has-property "^3.0.0" + hast-util-is-body-ok-link "^3.0.0" + hast-util-is-element "^3.0.0" -metro-symbolicate@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.8.tgz#881afc90453450208bf519b22e54962fc909d432" - integrity sha512-nwhYySk79jQhwjL9QmOUo4wS+/0Au9joEryDWw7uj4kz2yvw1uBjwmlql3BprQCBzRdB3fcqOP8kO8Es+vE31g== +hast-util-raw@^7.0.0: + version "7.2.3" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz" + integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== + dependencies: + "@types/hast" "^2.0.0" + "@types/parse5" "^6.0.0" + hast-util-from-parse5 "^7.0.0" + hast-util-to-parse5 "^7.0.0" + html-void-elements "^2.0.0" + parse5 "^6.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-html@^8.0.0: + version "8.0.4" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz" + integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-raw "^7.0.0" + hast-util-whitespace "^2.0.0" + html-void-elements "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-mdast@^8.3.0: + version "8.4.1" + resolved "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-8.4.1.tgz" + integrity sha512-tfmBLASuCgyhCzpkTXM5kU8xeuS5jkMZ17BYm2YftGT5wvgc7uHXTZ/X8WfNd6F5NV/IGmrLsuahZ+jXQir4zQ== + dependencies: + "@types/extend" "^3.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + extend "^3.0.0" + hast-util-has-property "^2.0.0" + hast-util-is-element "^2.0.0" + hast-util-phrasing "^2.0.0" + hast-util-to-text "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + rehype-minify-whitespace "^5.0.0" + trim-trailing-lines "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit "^4.0.0" + +hast-util-to-parse5@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz" + integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== dependencies: - invariant "^2.2.4" - metro-source-map "0.80.8" - nullthrows "^1.1.1" - source-map "^0.5.6" - through2 "^2.0.1" - vlq "^1.0.0" - -metro-transform-plugins@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.8.tgz#2ed3162cec7fa7549279a6031e6d910198332a77" - integrity sha512-sSu8VPL9Od7w98MftCOkQ1UDeySWbsIAS5I54rW22BVpPnI3fQ42srvqMLaJUQPjLehUanq8St6OMBCBgH/UWw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.20.0" - nullthrows "^1.1.1" - -metro-transform-worker@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.8.tgz#df3bc21928e1c99b077cd1e2feec9f13d6c351c6" - integrity sha512-+4FG3TQk3BTbNqGkFb2uCaxYTfsbuFOCKMMURbwu0ehCP8ZJuTUramkaNZoATS49NSAkRgUltgmBa4YaKZ5mqw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/parser" "^7.20.0" - "@babel/types" "^7.20.0" - metro "0.80.8" - metro-babel-transformer "0.80.8" - metro-cache "0.80.8" - metro-cache-key "0.80.8" - metro-minify-terser "0.80.8" - metro-source-map "0.80.8" - metro-transform-plugins "0.80.8" - nullthrows "^1.1.1" - -metro@0.80.8, metro@^0.80.3: - version "0.80.8" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.8.tgz#42faa80ea8f1c43bea022b55baa3162e90878868" - integrity sha512-in7S0W11mg+RNmcXw+2d9S3zBGmCARDxIwoXJAmLUQOQoYsRP3cpGzyJtc7WOw8+FXfpgXvceD0u+PZIHXEL7g== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/parser" "^7.20.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.20.0" - "@babel/types" "^7.20.0" - accepts "^1.3.7" - chalk "^4.0.0" - ci-info "^2.0.0" - connect "^3.6.5" - debug "^2.2.0" - denodeify "^1.2.1" - error-stack-parser "^2.0.6" - graceful-fs "^4.2.4" - hermes-parser "0.20.1" - image-size "^1.0.2" - invariant "^2.2.4" - jest-worker "^29.6.3" - jsc-safe-url "^0.2.2" - lodash.throttle "^4.1.1" - metro-babel-transformer "0.80.8" - metro-cache "0.80.8" - metro-cache-key "0.80.8" - metro-config "0.80.8" - metro-core "0.80.8" - metro-file-map "0.80.8" - metro-resolver "0.80.8" - metro-runtime "0.80.8" - metro-source-map "0.80.8" - metro-symbolicate "0.80.8" - metro-transform-plugins "0.80.8" - metro-transform-worker "0.80.8" - mime-types "^2.1.27" - node-fetch "^2.2.0" - nullthrows "^1.1.1" - rimraf "^3.0.2" - serialize-error "^2.1.0" - source-map "^0.5.6" - strip-ansi "^6.0.0" - throat "^5.0.0" - ws "^7.5.1" - yargs "^17.6.2" + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== +hast-util-to-text@^3.0.0: + version "3.1.2" + resolved "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz" + integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -microseconds@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" - integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + hast-util-is-element "^2.0.0" + unist-util-find-after "^4.0.0" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +hast-util-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" + integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + "@types/hast" "^3.0.0" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +hastscript@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz" + integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: - brace-expansion "^1.1.7" + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" +html-void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz" + integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== -minimatch@^9.0.1: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" +html-whitespace-sensitive-tag-names@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz" + integrity sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w== -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +immer@^10.0.3: + version "10.0.4" -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: - minipass "^3.0.0" + loose-envify "^1.0.0" -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: - minipass "^3.0.0" + binary-extensions "^2.0.0" -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -minipass@3.3.6, minipass@^3.0.0, minipass@^3.1.1: - version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + hasown "^2.0.0" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + is-extglob "^2.1.1" -moment@^2.29.4: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== -ms@2.0.0: +isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +isomorphic.js@^0.2.4: + version "0.2.5" + resolved "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz" + integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== -mv@~2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== +jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: - mkdirp "~0.5.1" - ncp "~2.0.0" - rimraf "~2.4.0" + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" +jiti@^1.21.0: + version "1.21.0" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== -nano-time@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" - integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== - dependencies: - big-integer "^1.6.16" +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -nanoid@^3.1.23, nanoid@^3.3.1, nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -nativewind@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/nativewind/-/nativewind-2.0.11.tgz#aaa80a65b663a49856b26bd4f3153161f70299d7" - integrity sha512-qCEXUwKW21RYJ33KRAJl3zXq2bCq82WoI564fI21D/TiqhfmstZOqPN53RF8qK1NDK6PGl56b2xaTxgObEePEg== +lib0@^0.2.42, lib0@^0.2.85, lib0@^0.2.86: + version "0.2.93" + resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.93.tgz" + integrity sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q== dependencies: - "@babel/generator" "^7.18.7" - "@babel/helper-module-imports" "7.18.6" - "@babel/types" "7.19.0" - css-mediaquery "^0.1.2" - css-to-react-native "^3.0.0" - micromatch "^4.0.5" - postcss "^8.4.12" - postcss-calc "^8.2.4" - postcss-color-functional-notation "^4.2.2" - postcss-css-variables "^0.18.0" - postcss-nested "^5.0.6" - react-is "^18.1.0" - use-sync-external-store "^1.1.0" - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + isomorphic.js "^0.2.4" -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -neo-async@^2.5.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" -nested-error-stacks@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz#d2cc9fc5235ddb371fc44d506234339c8e4b0a4b" - integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== +linkifyjs@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz" + integrity sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg== -next@14.2.3: - version "14.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" - integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== - dependencies: - "@next/env" "14.2.3" - "@swc/helpers" "0.5.5" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" - postcss "8.4.31" - styled-jsx "5.1.1" - optionalDependencies: - "@next/swc-darwin-arm64" "14.2.3" - "@next/swc-darwin-x64" "14.2.3" - "@next/swc-linux-arm64-gnu" "14.2.3" - "@next/swc-linux-arm64-musl" "14.2.3" - "@next/swc-linux-x64-gnu" "14.2.3" - "@next/swc-linux-x64-musl" "14.2.3" - "@next/swc-win32-arm64-msvc" "14.2.3" - "@next/swc-win32-ia32-msvc" "14.2.3" - "@next/swc-win32-x64-msvc" "14.2.3" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" + js-tokens "^3.0.0 || ^4.0.0" -nocache@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" - integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== -node-abort-controller@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== +markdown-it@^14.0.0: + version "14.1.0" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" -node-dir@^0.1.17: - version "0.1.17" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" - integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +mdast-util-definitions@^5.0.0: + version "5.1.2" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" + integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: - minimatch "^3.0.2" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" -node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== +mdast-util-find-and-replace@^2.0.0: + version "2.2.2" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz" + integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== dependencies: - whatwg-url "^5.0.0" + "@types/mdast" "^3.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" -node-forge@^1, node-forge@^1.2.1, node-forge@^1.3.1: +mdast-util-from-markdown@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz" + integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== + dependencies: + "@types/mdast" "^3.0.0" + ccount "^2.0.0" + mdast-util-find-and-replace "^2.0.0" + micromark-util-character "^1.0.0" -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +mdast-util-gfm-footnote@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz" + integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-util-normalize-identifier "^1.0.0" -node-stream-zip@^1.9.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" - integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== +mdast-util-gfm-strikethrough@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz" + integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +mdast-util-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz" + integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== + dependencies: + "@types/mdast" "^3.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.3.0" -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +mdast-util-gfm-task-list-item@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz" + integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" -normalize-url@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== +mdast-util-gfm@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz" + integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-gfm-autolink-literal "^1.0.0" + mdast-util-gfm-footnote "^1.0.0" + mdast-util-gfm-strikethrough "^1.0.0" + mdast-util-gfm-table "^1.0.0" + mdast-util-gfm-task-list-item "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + +mdast-util-to-hast@^12.1.0: + version "12.3.0" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" + integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-definitions "^5.0.0" + micromark-util-sanitize-uri "^1.1.0" + trim-lines "^3.0.0" + unist-util-generated "^2.0.0" + unist-util-position "^4.0.0" + unist-util-visit "^4.0.0" + +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" + "@types/mdast" "^3.0.0" + +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -npm-package-arg@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-7.0.0.tgz#52cdf08b491c0c59df687c4c925a89102ef794a5" - integrity sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g== +micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-extension-gfm-autolink-literal@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz" + integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== dependencies: - hosted-git-info "^3.0.2" - osenv "^0.1.5" - semver "^5.6.0" - validate-npm-package-name "^3.0.0" + micromark-util-character "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== +micromark-extension-gfm-footnote@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz" + integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-strikethrough@^1.0.0: + version "1.0.7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz" + integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== dependencies: - path-key "^2.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== +micromark-extension-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz" + integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== dependencies: - path-key "^3.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== +micromark-extension-gfm-tagfilter@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz" + integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== dependencies: - boolbase "^1.0.0" - -nullthrows@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" - integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== - -nwsapi@^2.2.2: - version "2.2.9" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.9.tgz#7f3303218372db2e9f27c27766bcfc59ae7e61c6" - integrity sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg== - -ob1@0.80.8: - version "0.80.8" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.8.tgz#08be1b8398d004719074ad702c975a5c7e1b29f2" - integrity sha512-QHJQk/lXMmAW8I7AIM3in1MSlwe1umR72Chhi8B7Xnq6mzjhBKkA6Fy/zAhQnGkA4S912EPCEvTij5yh+EQTAA== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + micromark-util-types "^1.0.0" -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +micromark-extension-gfm-task-list-item@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz" + integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== +micromark-extension-gfm@^2.0.0: + version "2.0.3" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz" + integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== + dependencies: + micromark-extension-gfm-autolink-literal "^1.0.0" + micromark-extension-gfm-footnote "^1.0.0" + micromark-extension-gfm-strikethrough "^1.0.0" + micromark-extension-gfm-table "^1.0.0" + micromark-extension-gfm-tagfilter "^1.0.0" + micromark-extension-gfm-task-list-item "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -object.entries@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -object.values@^1.1.6, object.values@^1.1.7: +micromark-util-character@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -oblivious-set@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" - integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: - ee-first "1.1.1" + micromark-util-symbol "^1.0.0" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: - wrappy "1" + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^6.2.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" - integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== - dependencies: - is-wsl "^1.1.0" - -open@^7.0.3: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^8.0.4, open@^8.3.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -ora@3.4.0, ora@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + micromark-util-symbol "^1.0.0" -osenv@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: - yocto-queue "^0.1.0" + micromark-util-symbol "^1.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: - p-limit "^2.0.0" + micromark-util-types "^1.0.0" -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: - p-limit "^2.2.0" + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: - p-limit "^3.0.2" + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - callsites "^3.0.0" + braces "^3.0.2" + picomatch "^2.3.1" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== +minimatch@^9.0.1: + version "9.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + brace-expansion "^2.0.1" -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.1.1" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz" + integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== -parse-png@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/parse-png/-/parse-png-2.1.0.tgz#2a42ad719fedf90f81c59ebee7ae59b280d6b338" - integrity sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ== - dependencies: - pngjs "^3.3.0" +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -parse5@^7.0.0, parse5@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: - entities "^4.4.0" + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +nanoid@^3.3.6: + version "3.3.7" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -password-prompt@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.3.tgz#05e539f4e7ca4d6c865d479313f10eb9db63ee5f" - integrity sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== +next@^14.2.3, next@14.2.3: + version "14.2.3" + resolved "https://registry.npmjs.org/next/-/next-14.2.3.tgz" + integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: - ansi-escapes "^4.3.2" - cross-spawn "^7.0.3" - -path-dirname@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== + "@next/env" "14.2.3" + "@swc/helpers" "0.5.5" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + graceful-fs "^4.2.11" + postcss "8.4.31" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "14.2.3" + "@next/swc-darwin-x64" "14.2.3" + "@next/swc-linux-arm64-gnu" "14.2.3" + "@next/swc-linux-arm64-musl" "14.2.3" + "@next/swc-linux-x64-gnu" "14.2.3" + "@next/swc-linux-x64-musl" "14.2.3" + "@next/swc-win32-arm64-msvc" "14.2.3" + "@next/swc-win32-ia32-msvc" "14.2.3" + "@next/swc-win32-x64-msvc" "14.2.3" -path-exists@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== +orderedmap@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz" + integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1, path-scurry@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" - integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== +path-scurry@^1.11.0: + version "1.11.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-3.0.1.tgz#817033161def55ec9638567a2f3bbc876b3e7516" - integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== - pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.6: +pirates@^4.0.1: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -plist@^3.0.5: - version "3.1.0" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" - integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== - dependencies: - "@xmldom/xmldom" "^0.8.8" - base64-js "^1.5.1" - xmlbuilder "^15.1.1" - -pngjs@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-calc@^8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-color-functional-notation@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" - integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-css-variables@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz#d97b6da19e86245eb817006e11117382f997bb93" - integrity sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q== - dependencies: - balanced-match "^1.0.0" - escape-string-regexp "^1.0.3" - extend "^3.0.1" - postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -8909,1338 +1758,521 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" yaml "^2.3.4" -postcss-nested@^5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" - integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== - dependencies: - postcss-selector-parser "^6.0.6" - postcss-nested@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: postcss-selector-parser "^6.0.11" -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: +postcss-selector-parser@^6.0.11: version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz" integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.31: +postcss@^8, postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9, postcss@8.4.31: version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.12, postcss@^8.4.23, postcss@~8.4.32: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^3.2.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -pretty-bytes@5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - -pretty-format@^26.5.2, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -promise@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1, prompts@^2.2.1, prompts@^2.3.2, prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@15.8.1, prop-types@^15.5.10, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.7.2: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" react-is "^16.13.1" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== +prosemirror-changeset@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz" + integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" + prosemirror-transform "^1.0.0" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -qrcode-terminal@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz#ffc6c28a2fc0bfb47052b47e23f4f446a5fbdb9e" - integrity sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ== - -qs@^6.11.2: - version "6.12.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== +prosemirror-collab@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz" + integrity sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ== dependencies: - side-channel "^1.0.6" + prosemirror-state "^1.0.0" -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== +prosemirror-commands@^1.0.0, prosemirror-commands@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz" + integrity sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ== dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" -query-string@^7.1.0, query-string@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" - integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== +prosemirror-dropcursor@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz" + integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== dependencies: - decode-uri-component "^0.2.2" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -querystring@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== +prosemirror-gapcursor@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz" + integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== dependencies: - inherits "~2.0.3" + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -rc@~1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== +prosemirror-history@^1.0.0, prosemirror-history@^1.3.2: + version "1.4.0" + resolved "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.0.tgz" + integrity sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ== dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.31.0" + rope-sequence "^1.3.0" -react-devtools-core@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.1.0.tgz#3396494ac94b21602cac4fd657d600e0b52f4a0b" - integrity sha512-NRtLBqYVLrIY+lOa2oTpFiAhI7Hru0AUXI0tP9neCyaPPAzlZyeH0i+VZ0shIyRTJbpvyqbD/uCsewA2hpfZHw== +prosemirror-inputrules@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz" + integrity sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg== dependencies: - shell-quote "^1.6.1" - ws "^7" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" -react-dom@18.2.0, react-dom@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz" + integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-fast-compare@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" - integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== - -react-freeze@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.4.tgz#cbbea2762b0368b05cbe407ddc9d518c57c6f3ad" - integrity sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA== + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" -react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== +prosemirror-markdown@^1.12.0: + version "1.12.0" + resolved "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz" + integrity sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ== dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-hook-form@^7.51.2: - version "7.51.3" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.3.tgz#7486dd2d52280b6b28048c099a98d2545931cab3" - integrity sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ== - -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.1.0, react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + markdown-it "^14.0.0" + prosemirror-model "^1.0.0" -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -react-native-calendars@^1.1304.1: - version "1.1304.1" - resolved "https://registry.yarnpkg.com/react-native-calendars/-/react-native-calendars-1.1304.1.tgz#a09f7f8eee84d8634c3fe2de5e293fa7e8f12077" - integrity sha512-D1aU5lLhi7KCCCeHhKOkcC41K8s3paiiIfMaOQx6NezCbgKHelqT01WPpAZLh3Cm0QTC5EZo0oDPD0mCdKrDgQ== - dependencies: - hoist-non-react-statics "^3.3.1" - lodash "^4.17.15" - memoize-one "^5.2.1" - prop-types "^15.5.10" - react-native-swipe-gestures "^1.0.5" - recyclerlistview "^4.0.0" - xdate "^0.8.0" - optionalDependencies: - moment "^2.29.4" +prosemirror-menu@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz" + integrity sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA== + dependencies: + crelt "^1.0.0" + prosemirror-commands "^1.0.0" + prosemirror-history "^1.0.0" + prosemirror-state "^1.0.0" -react-native-confirmation-code-field@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/react-native-confirmation-code-field/-/react-native-confirmation-code-field-7.4.0.tgz#58cc2d5adad59882d1805bf164cd6099d432d21e" - integrity sha512-Kw7rD0RXi6vZnt0Y67nkSW2wYmZFdnxJ23yxkKm3jqwvSxAvaA1NP3h3MHSPmJd25l0WK/+fjXOeCliDqWZ9rw== +prosemirror-model@^1.0.0, prosemirror-model@^1.18.3, prosemirror-model@^1.19.0, prosemirror-model@^1.19.4, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.7.1, prosemirror-model@^1.8.1: + version "1.21.0" + resolved "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz" + integrity sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA== + dependencies: + orderedmap "^2.0.0" -react-native-element-dropdown@^2.10.4: - version "2.10.4" - resolved "https://registry.yarnpkg.com/react-native-element-dropdown/-/react-native-element-dropdown-2.10.4.tgz#58d8a5e38d2a3fb74498c195bd775d9e1536e6bd" - integrity sha512-sbzByNSQmS3iZuNxzeqs0L04MrYQt8uSNUcmnAZAN/vi5IqZ7N0TPHzZ996PSttpYrF2NkiByd+Zlw9Em+VgAw== +prosemirror-schema-basic@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz" + integrity sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw== dependencies: - lodash "^4.17.21" + prosemirror-model "^1.19.0" -react-native-gesture-handler@^2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.16.0.tgz#45a00b5988e74ebc58f130c8d1443319c8e678db" - integrity sha512-1hFkx7RIfeJSyTQQ0Nkv4icFVZ5+XjQkd47OgZMBFzoB7ecL+nFSz8KLi3OCWOhq+nbHpSPlSG5VF3CQNCJpWA== +prosemirror-schema-list@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz" + integrity sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.7.3" + +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.2.3, prosemirror-state@^1.3.1, prosemirror-state@^1.4.2, prosemirror-state@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz" + integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + prosemirror-view "^1.27.0" + +prosemirror-tables@^1.3.4, prosemirror-tables@^1.3.5: + version "1.3.7" + resolved "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz" + integrity sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA== + dependencies: + prosemirror-keymap "^1.1.2" + prosemirror-model "^1.8.1" + prosemirror-state "^1.3.1" + prosemirror-transform "^1.2.1" + prosemirror-view "^1.13.3" + +prosemirror-trailing-node@^2.0.7: + version "2.0.8" + resolved "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz" + integrity sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA== dependencies: - "@egjs/hammerjs" "^2.0.17" - hoist-non-react-statics "^3.3.0" - invariant "^2.2.4" - lodash "^4.17.21" - prop-types "^15.7.2" + "@remirror/core-constants" "^2.0.2" + escape-string-regexp "^4.0.0" -react-native-loading-spinner-overlay@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/react-native-loading-spinner-overlay/-/react-native-loading-spinner-overlay-3.0.1.tgz#092481b8cce157d3af5ef942f845ad981f96bd36" - integrity sha512-4GdR54HQnKg2HPSSisVizfTLuyhSh4splY9eb8mKiYF1Ihjn/5EmdNo5bN3S7uKPFRC3WLzIZIouX6G6fXfnjw== +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.2, prosemirror-transform@^1.7.3, prosemirror-transform@^1.8.0: + version "1.9.0" + resolved "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz" + integrity sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg== + dependencies: + prosemirror-model "^1.21.0" -react-native-maps@1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/react-native-maps/-/react-native-maps-1.14.0.tgz#1e5cac8e88d80002c512dd4763a205493a1ae58d" - integrity sha512-ai7h4UdRLGPFCguz1fI8n4sKLEh35nZXHAH4nSWyAeHGrN8K9GjICu9Xd4Q5Ok4h+WwrM6Xz5pGbF3Qm1tO6iQ== +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.31.2, prosemirror-view@^1.31.4, prosemirror-view@^1.32.7, prosemirror-view@^1.9.10: + version "1.33.6" + resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.6.tgz" + integrity sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw== dependencies: - "@types/geojson" "^7946.0.13" + prosemirror-model "^1.20.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" -react-native-menu@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/react-native-menu/-/react-native-menu-0.23.0.tgz#3c023239aed95d419275df50c199982ad7eb062b" - integrity sha512-sSNqvyTH7HT/8n2MPn14ysg5FEgM4yvV5dYXT515WQGMSFm1K35Rvi4G2Ku+EW9pSyDgRvFSCgJnWHWi0gtmSQ== - dependencies: - create-react-class "^15.6.0" - prop-types "^15.5.10" - react-timer-mixin "^0.13.3" - -react-native-open-maps@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/react-native-open-maps/-/react-native-open-maps-0.4.3.tgz#767c6621dcf558241afe78a62c5f7924031f270e" - integrity sha512-v0F6NHABCG8/7112baa3LqH29fndxSLb2PGWGTPa/QGoQ3rPiXQgCGsASUQmUpQkrSL5DnnmXo5w2d06Q6euBA== - dependencies: - query-string "^7.1.0" - -react-native-reanimated@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.8.1.tgz#45c13d4bedebef8df3d5a8756f25072de65960d7" - integrity sha512-EdM0vr3JEaNtqvstqESaPfOBy0gjYBkr1iEolWJ82Ax7io8y9OVUIphgsLKTB36CtR1XtmBw0RZVj7KArc7ZVA== - dependencies: - "@babel/plugin-transform-arrow-functions" "^7.0.0-0" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" - "@babel/plugin-transform-optional-chaining" "^7.0.0-0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" - "@babel/plugin-transform-template-literals" "^7.0.0-0" - "@babel/preset-typescript" "^7.16.7" - convert-source-map "^2.0.0" - invariant "^2.2.4" +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== -react-native-safe-area-context@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.9.0.tgz#21a570ca3594cb4259ba65f93befaa60d91bcbd0" - integrity sha512-/OJD9Pb8IURyvn+1tWTszWPJqsbZ4hyHBU9P0xhOmk7h5owSuqL0zkfagU0pg7Vh0G2NKQkaPpUKUMMCUMDh/w== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-native-screens@~3.31.1: - version "3.31.1" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.31.1.tgz#909a890f669e32b0fb1b1410278b71ad2f8238f6" - integrity sha512-8fRW362pfZ9y4rS8KY5P3DFScrmwo/vu1RrRMMx0PNHbeC9TLq0Kw1ubD83591yz64gLNHFLTVkTJmWeWCXKtQ== +"react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.2.0, react-dom@>=16.8.0, react-dom@18.2.0: + version "18.2.0" dependencies: - react-freeze "^1.0.0" - warn-once "^0.1.0" + loose-envify "^1.1.0" + scheduler "^0.23.0" -react-native-size-matters@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/react-native-size-matters/-/react-native-size-matters-0.4.2.tgz#4348bdd6fc47383f60326d58ad69870c998a5f9a" - integrity sha512-DKE3f/sdcozd24oASgkP1iGg+YU3HoajRa5k3a4wkRzpiqREq8SGX12Y5zBgAt/8IivLQoTMYkyQu1/Giuy+zQ== +react-icons@^4.3.1: + version "4.12.0" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz" + integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== -react-native-svg-transformer@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-native-svg-transformer/-/react-native-svg-transformer-1.3.0.tgz#ef01cdd82c1fc0611dd91950457b61cf74c4df3a" - integrity sha512-SV92uRjENDuanHLVuLy2Sdvt6f8vu7qnG8vC9CwBiAXV0BpWN4/wPvfc+r2WPAkcctRZLLOvrGnGA2o8nZd0cg== - dependencies: - "@svgr/core" "^8.1.0" - "@svgr/plugin-jsx" "^8.1.0" - "@svgr/plugin-svgo" "^8.1.0" - path-dirname "^1.0.2" +react-icons@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz" + integrity sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw== -react-native-svg@^15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-15.2.0.tgz#9561a6b3bd6b44689f437ba13182afee33bd5557" - integrity sha512-R0E6IhcJfVLsL0lRmnUSm72QO+mTqcAOM5Jb8FVGxJqX3NfJMlMP0YyvcajZiaRR8CqQUpEoqrY25eyZb006kw== +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-number-format@^5.3.1: + version "5.3.4" + resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.4.tgz" + integrity sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg== dependencies: - css-select "^5.1.0" - css-tree "^1.1.3" + prop-types "^15.7.2" -react-native-swipe-gestures@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/react-native-swipe-gestures/-/react-native-swipe-gestures-1.0.5.tgz#a172cb0f3e7478ccd681fd36b8bfbcdd098bde7c" - integrity sha512-Ns7Bn9H/Tyw278+5SQx9oAblDZ7JixyzeOczcBK8dipQk2pD7Djkcfnf1nB/8RErAmMLL9iXgW0QHqiII8AhKw== - -react-native-web@~0.19.6: - version "0.19.10" - resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.19.10.tgz#5f7205f8909c0889bc89c9fde7c6e287defa7c63" - integrity sha512-IQoHiTQq8egBCVVwmTrYcFLgEFyb4LMZYEktHn4k22JMk9+QTCEz5WTfvr+jdNoeqj/7rtE81xgowKbfGO74qg== - dependencies: - "@babel/runtime" "^7.18.6" - "@react-native/normalize-color" "^2.1.0" - fbjs "^3.0.4" - inline-style-prefixer "^6.0.1" - memoize-one "^6.0.0" - nullthrows "^1.1.1" - postcss-value-parser "^4.2.0" - styleq "^0.1.3" - -react-native@0.74.0: - version "0.74.0" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.74.0.tgz#9f0901139424152216e1ae1b32773787a0158d41" - integrity sha512-Vpp9WPmkCm4TUH5YDxwQhqktGVon/yLpjbTgjgLqup3GglOgWagYCX3MlmK1iksIcqtyMJHMEWa+UEzJ3G9T8w== - dependencies: - "@jest/create-cache-key-function" "^29.6.3" - "@react-native-community/cli" "13.6.4" - "@react-native-community/cli-platform-android" "13.6.4" - "@react-native-community/cli-platform-ios" "13.6.4" - "@react-native/assets-registry" "0.74.81" - "@react-native/codegen" "0.74.81" - "@react-native/community-cli-plugin" "0.74.81" - "@react-native/gradle-plugin" "0.74.81" - "@react-native/js-polyfills" "0.74.81" - "@react-native/normalize-colors" "0.74.81" - "@react-native/virtualized-lists" "0.74.81" - abort-controller "^3.0.0" - anser "^1.4.9" - ansi-regex "^5.0.0" - base64-js "^1.5.1" - chalk "^4.0.0" - event-target-shim "^5.0.1" - flow-enums-runtime "^0.0.6" - invariant "^2.2.4" - jest-environment-node "^29.6.3" - jsc-android "^250231.0.0" - memoize-one "^5.0.0" - metro-runtime "^0.80.3" - metro-source-map "^0.80.3" - mkdirp "^0.5.1" - nullthrows "^1.1.1" - pretty-format "^26.5.2" - promise "^8.3.0" - react-devtools-core "^5.0.0" - react-refresh "^0.14.0" - react-shallow-renderer "^16.15.0" - regenerator-runtime "^0.13.2" - scheduler "0.24.0-canary-efb381bbf-20230505" - stacktrace-parser "^0.1.10" - whatwg-fetch "^3.0.0" - ws "^6.2.2" - yargs "^17.6.2" - -react-query@^3.39.3: - version "3.39.3" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" - integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== - dependencies: - "@babel/runtime" "^7.5.5" - broadcast-channel "^3.4.1" - match-sorter "^6.0.2" - -react-redux@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.1.tgz#852ec13084bd7375e26db697d2fc9027ffada204" - integrity sha512-5ynfGDzxxsoV73+4czQM56qF43vsmgJsO22rmAvU5tZT2z5Xow/A2uhhxwXuGTxgdReF3zcp7A80gma2onRs1A== +"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.1.1, react-redux@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz" + integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== dependencies: "@types/use-sync-external-store" "^0.0.3" use-sync-external-store "^1.0.0" -react-refresh@0.14.0, react-refresh@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" - integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== - -react-shallow-renderer@^16.15.0: - version "16.15.0" - resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" - integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== +react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== dependencies: - object-assign "^4.1.1" - react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + react-style-singleton "^2.2.1" + tslib "^2.0.0" -react-test-renderer@18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" - integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA== +react-remove-scroll@^2.5.7: + version "2.5.10" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz" + integrity sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA== dependencies: - react-is "^18.2.0" - react-shallow-renderer "^16.15.0" - scheduler "^0.23.0" + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" -react-test-renderer@18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.3.1.tgz#e693608a1f96283400d4a3afead6893f958b80b4" - integrity sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA== +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== dependencies: - react-is "^18.3.1" - react-shallow-renderer "^16.15.0" - scheduler "^0.23.2" + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" -react-timer-mixin@^0.13.3: - version "0.13.4" - resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" - integrity sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q== +react-textarea-autosize@8.5.3: + version "8.5.3" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" -react@18.2.0, react@^18: +react@*, "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", react@^18, react@^18.0, react@^18.2.0, "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.8.0, react@18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" -readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" -readline@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" - integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== - -recast@^0.21.0: - version "0.21.5" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" - integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== - dependencies: - ast-types "0.15.2" - esprima "~4.0.0" - source-map "~0.6.1" - tslib "^2.0.1" - -recyclerlistview@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/recyclerlistview/-/recyclerlistview-4.2.0.tgz#a140149aaa470c9787a1426452651934240d69ef" - integrity sha512-uuBCi0c+ggqHKwrzPX4Z/mJOzsBbjZEAwGGmlwpD/sD7raXixdAbdJ6BTcAmuWG50Cg4ru9p12M94Njwhr/27A== - dependencies: - lodash.debounce "4.0.8" - prop-types "15.8.1" - ts-object-utils "0.0.5" - redux-thunk@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz" integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== -redux@^5.0.1: +redux@^5.0.0, redux@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.2: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== +rehype-format@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.0.tgz" + integrity sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-phrasing "^3.0.0" + hast-util-whitespace "^3.0.0" + html-whitespace-sensitive-tag-names "^3.0.0" + rehype-minify-whitespace "^6.0.0" + unist-util-visit-parents "^6.0.0" + +rehype-minify-whitespace@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.1.tgz" + integrity sha512-PPp4lWJiBPlePI/dv1BeYktbwkfgXkrK59MUa+tYbMPgleod+4DvFK2PLU0O0O60/xuhHfiR9GUIUlXTU8sRIQ== dependencies: - "@babel/runtime" "^7.8.4" + "@types/hast" "^2.0.0" + hast-util-embedded "^2.0.0" + hast-util-is-element "^2.0.0" + hast-util-whitespace "^2.0.0" + unified "^10.0.0" + unist-util-is "^5.0.0" -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -remove-accents@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.5.0.tgz#77991f37ba212afba162e375b627631315bed687" - integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== - -remove-trailing-slash@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz#be2285a59f39c74d1bce4f825950061915e3780d" - integrity sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +rehype-minify-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz" + integrity sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-whitespace "^3.0.0" + unist-util-is "^6.0.0" + +rehype-parse@^8.0.4: + version "8.0.5" + resolved "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.5.tgz" + integrity sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^7.0.0" + parse5 "^6.0.0" + unified "^10.0.0" + +rehype-remark@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/rehype-remark/-/rehype-remark-9.1.2.tgz" + integrity sha512-c0fG3/CrJ95zAQ07xqHSkdpZybwdsY7X5dNWvgL2XqLKZuqmG3+vk6kP/4miCnp+R+x/0uKKRSpfXb9aGR8Z5w== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + hast-util-to-mdast "^8.3.0" + unified "^10.0.0" + +rehype-stringify@^9.0.3: + version "9.0.4" + resolved "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz" + integrity sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-to-html "^8.0.0" + unified "^10.0.0" -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +remark-gfm@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" + integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-gfm "^2.0.0" + micromark-extension-gfm "^2.0.0" + unified "^10.0.0" -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +remark-parse@^10.0.1: + version "10.0.2" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + unified "^10.0.0" -requireg@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/requireg/-/requireg-0.2.2.tgz#437e77a5316a54c9bcdbbf5d1f755fe093089830" - integrity sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg== +remark-rehype@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" + integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: - nested-error-stacks "~2.0.1" - rc "~1.2.7" - resolve "~1.7.1" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-to-hast "^12.1.0" + unified "^10.0.0" -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +remark-stringify@^10.0.2: + version "10.0.3" + resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz" + integrity sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.0.0" + unified "^10.0.0" reselect@^5.0.1: version "5.1.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" - integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve.exports@^2.0.0, resolve.exports@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: +resolve@^1.1.7, resolve@^1.22.2: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@~1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== - dependencies: - path-parse "^1.0.5" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@3.0.2, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@~2.4.0: - version "2.4.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== - dependencies: - glob "^6.0.1" - -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" +rope-sequence@^1.3.0: + version "1.3.4" + resolved "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz" + integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-json-stringify@~1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" - integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@>=0.6.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== - -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - -scheduler@0.24.0-canary-efb381bbf-20230505: - version "0.24.0-canary-efb381bbf-20230505" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" - integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: - loose-envify "^1.1.0" + mri "^1.1.0" scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -schema-utils@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -selfsigned@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -semver@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.6.0, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@^5.5.0, semver@^5.6.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -send@0.18.0, send@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== - -serve-static@^1.13.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-cookie-parser@^2.4.8: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1, shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-plist@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" - integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== - dependencies: - bplist-creator "0.1.0" - bplist-parser "0.3.1" - plist "^3.0.5" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" - integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== - -slice-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -slugify@^1.3.4, slugify@^1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" - integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== - dependencies: - is-plain-obj "^1.0.0" - -source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.0: +source-map-js@^1.0.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.16, source-map-support@^0.5.21, source-map-support@~0.5.20, source-map-support@~0.5.21: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -split@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stack-generator@^2.0.5: - version "2.0.10" - resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" - integrity sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== - dependencies: - stackframe "^1.3.4" - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" - integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== - -stacktrace-gps@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz#0c40b24a9b119b20da4525c398795338966a2fb0" - integrity sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== - dependencies: - source-map "0.5.6" - stackframe "^1.3.4" - -stacktrace-js@^2.0.2: +space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" - integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== - dependencies: - error-stack-parser "^2.0.6" - stack-generator "^2.0.5" - stacktrace-gps "^3.0.4" - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -stream-buffers@2.2.x: - version "2.2.0" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" - integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== - -stream-slice@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" - integrity sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA== + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-length@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" - integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== +"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" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - char-regex "^2.0.0" - strip-ansi "^7.0.1" - -string-natural-compare@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" - integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" @@ -10249,162 +2281,52 @@ string-natural-compare@^3.0.1: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: - safe-buffer "~5.1.0" + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^5.0.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^4.1.0" + ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strnum@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== - -structured-headers@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/structured-headers/-/structured-headers-0.4.1.tgz#77abd9410622c6926261c09b9d16cf10592694d1" - integrity sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg== - styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -styleq@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/styleq/-/styleq-0.1.3.tgz#8efb2892debd51ce7b31dc09c227ad920decab71" - integrity sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA== - -sucrase@3.34.0: - version "3.34.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" - integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + version "5.1.1" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" + client-only "0.0.1" sucrase@^3.32.0: version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -10415,125 +2337,19 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -sudo-prompt@9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.1.1.tgz#73853d729770392caec029e2470db9c221754db0" - integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== - -sudo-prompt@^8.2.0: - version "8.2.5" - resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-8.2.5.tgz#cc5ef3769a134bb94b24a631cc09628d4d53603e" - integrity sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw== - -sudo-prompt@^9.0.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" - integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.2.0.tgz#7a5dff2938d8c6096e00295c2390e8e652fa805d" - integrity sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^5.1.0" - css-tree "^2.3.1" - css-what "^6.1.0" - csso "^5.0.5" - picocolors "^1.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -synckit@^0.8.6: - version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" - integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== - dependencies: - "@pkgr/core" "^0.1.0" - tslib "^2.6.2" - -tailwind-merge@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.3.0.tgz#27d2134fd00a1f77eca22bcaafdd67055917d286" - integrity sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA== - dependencies: - "@babel/runtime" "^7.24.1" - -tailwindcss@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3" - integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.18.2" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" - resolve "^1.22.2" - sucrase "^3.32.0" +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tailwindcss@^3.4.1, tailwindcss@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz" integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -10559,910 +2375,316 @@ tailwindcss@^3.4.1, tailwindcss@^3.4.3: resolve "^1.22.2" sucrase "^3.32.0" -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar@^6.0.2, tar@^6.0.5: - version "6.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" - integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -temp@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" - integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== - dependencies: - rimraf "~2.6.2" - -tempy@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" - integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== - dependencies: - temp-dir "^1.0.0" - type-fest "^0.3.1" - unique-string "^1.0.0" - -tempy@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.7.1.tgz#5a654e6dbd1747cdd561efb112350b55cd9c1d46" - integrity sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg== - dependencies: - del "^6.0.0" - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - -terminal-link@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser@^5.15.0: - version "5.30.4" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.4.tgz#62b4d16a819424e6317fd5ceffb4ee8dc769803a" - integrity sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== +tippy.js@^6.3.7: + version "6.3.7" + resolved "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + "@popperjs/core" "^2.9.0" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== -traverse@~0.6.6: - version "0.6.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.9.tgz#76cfdbacf06382d460b76f8b735a44a6209d8b81" - integrity sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg== - dependencies: - gopd "^1.0.1" - typedarray.prototype.slice "^1.0.3" - which-typed-array "^1.1.15" +trim-trailing-lines@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz" + integrity sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg== -ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-object-utils@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/ts-object-utils/-/ts-object-utils-0.0.5.tgz#95361cdecd7e52167cfc5e634c76345e90a26077" - integrity sha512-iV0GvHqOmilbIKJsfyfJY9/dNHCs969z3so90dQWsO1eMMozvTpnB1MEaUbb3FYtZTGjv5sIy/xmslEz0Rg2TA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^4.12.0: + version "4.18.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz" + integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== -type-fest@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + +unified@^10.0.0, unified@^10.1.2: + version "10.1.2" + resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unist-util-find-after@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz" + integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" +unist-util-generated@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" + integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" + "@types/unist" "^2.0.0" -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" + "@types/unist" "^3.0.0" -typedarray.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz#bce2f685d3279f543239e4d595e0d021731d2d1a" - integrity sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - typed-array-buffer "^1.0.2" - typed-array-byte-offset "^1.0.2" - -typescript@^5, typescript@^5.4.5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -ua-parser-js@^1.0.35: - version "1.0.37" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" - integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unist-util-position@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" + integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + "@types/unist" "^2.0.0" -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + "@types/unist" "^2.0.0" -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unist-util-visit-parents@^5.0.0: + version "5.1.3" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: - unique-slug "^2.0.0" + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: - imurmurhash "^0.1.4" + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: - crypto-random-string "^1.0.0" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: - crypto-random-string "^2.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" -unload@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" - integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== dependencies: - "@babel/runtime" "^7.6.2" - detect-node "^2.0.4" + tslib "^2.0.0" -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== dependencies: - punycode "^2.1.0" - -url-join@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" - integrity sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA== + use-isomorphic-layout-effect "^1.1.1" -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" +use-prefers-color-scheme@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/use-prefers-color-scheme/-/use-prefers-color-scheme-1.1.3.tgz" + integrity sha512-ZRgDfb5BFLum/Sud4SpZ+d1YcV+lRbsupw0qQ/rGy5kGrpE3KMUQgEQOKiQQSa4Wslex46n5fKFO+9FGMTosUQ== -url@^0.11.0: - version "0.11.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" - integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== dependencies: - punycode "^1.4.1" - qs "^6.11.2" + detect-node-es "^1.1.0" + tslib "^2.0.0" -use-latest-callback@^0.1.9: - version "0.1.9" - resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.9.tgz#10191dc54257e65a8e52322127643a8940271e2a" - integrity sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw== - -use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0, use-sync-external-store@^1.1.0: +use-sync-external-store@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - -uuid@^8.0.0, uuid@^8.3.2: +uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -valid-url@~1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" - integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA== - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== - dependencies: - builtins "^1.0.3" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vlq@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" - integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== - -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== - dependencies: - xml-name-validator "^4.0.0" - -walker@^1.0.7, walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -warn-once@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43" - integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web-encoding@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - -web-streams-polyfill@^3.1.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-fetch@^3.0.0: - version "3.6.20" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" - integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url-without-unicode@8.0.0-3: - version "8.0.0-3" - resolved "https://registry.yarnpkg.com/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz#ab6df4bf6caaa6c85a59f6e82c026151d4bb376b" - integrity sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig== +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: - buffer "^5.4.3" - punycode "^2.1.1" - webidl-conversions "^5.0.0" + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== +vfile-location@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz" + integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" + "@types/unist" "^2.0.0" + vfile "^5.0.0" -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== +vfile-message@^3.0.0: + version "3.1.4" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" + integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +vfile@^5.0.0: + version "5.3.7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" +w3c-keyname@^2.2.0: + version "2.2.8" + resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== -which-module@^2.0.0: +web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wonka@^4.0.14: - version "4.0.15" - resolved "https://registry.yarnpkg.com/wonka/-/wonka-4.0.15.tgz#9aa42046efa424565ab8f8f451fcca955bf80b89" - integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== - -wonka@^6.3.2: - version "6.3.4" - resolved "https://registry.yarnpkg.com/wonka/-/wonka-6.3.4.tgz#76eb9316e3d67d7febf4945202b5bdb2db534594" - integrity sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" strip-ansi "^7.0.1" -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^2.3.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== +y-prosemirror@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.5.tgz" + integrity sha512-T/JATxC8P2Dbvq/dAiaiztD1a8KEwRP8oLRlT8YlaZdNlLGE1Ea0IJ8If25UlDYmk+4+uqLbqT/S+dzUmwwgbA== dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" + lib0 "^0.2.42" -ws@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== +y-prosemirror@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.1.tgz" + integrity sha512-czMBfB1eL2awqmOSxQM8cS/fsUOGE6fjvyPLInrh4crPxFiw67wDpwIW+EGBYKRa04sYbS0ScGj7ZgvWuDrmBQ== dependencies: - async-limiter "~1.0.0" + lib0 "^0.2.42" -ws@^7, ws@^7.5.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.11.0, ws@^8.12.1: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== - -xcode@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" - integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== +y-protocols@^1.0.1, y-protocols@^1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz" + integrity sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q== dependencies: - simple-plist "^1.1.0" - uuid "^7.0.3" + lib0 "^0.2.85" -xdate@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/xdate/-/xdate-0.8.2.tgz#d7b033c00485d02695baf0044f4eacda3fc961a3" - integrity sha512-sNBlLfOC8S3V0vLDEUianQOXcTsc9j4lfeKU/klHe0RjHAYn0CXsSttumTot8dzalboV8gZbH38B+WcCIBjhFQ== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +yaml@^2.3.4: + version "2.4.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz" + integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== -xml2js@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" - integrity sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w== +yjs@^13.0.0, yjs@^13.5.38, yjs@^13.6.1: + version "13.6.15" + resolved "https://registry.npmjs.org/yjs/-/yjs-13.6.15.tgz" + integrity sha512-moFv4uNYhp8BFxIk3AkpoAnnjts7gwdpiG8RtyFiKbMtxKCS0zVZ5wPaaGpwC3V2N/K8TK8MwtSI3+WO9CHWjQ== dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" - integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== - -xmlbuilder@^15.1.1: - version "15.1.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" - integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + lib0 "^0.2.86" -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +zod@^3.23.6, zod@^3.23.7: + version "3.23.8" + resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.2.1, yaml@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.1.0: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.3.1, yargs@^17.6.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.23.4: - version "3.23.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.4.tgz#c63805b2f39e10d4ab3d55eb3c8cdb472c79dfb1" - integrity sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw== - -zustand@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848" - integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== - dependencies: - use-sync-external-store "1.2.0" +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/go.work.sum b/go.work.sum index 5a2b8473b..11b05c648 100644 --- a/go.work.sum +++ b/go.work.sum @@ -139,12 +139,18 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/a-h/htmlformat v0.0.0-20231108124658-5bd994fe268e/go.mod h1:FMIm5afKmEfarNbIXOaPHFY8X7fo+fRQB6I9MPG2nB0= +github.com/a-h/parse v0.0.0-20240121214402-3caf7543159a/go.mod h1:3mnrkvGpurZ4ZrTDbYU84xhwXW2TjTKShSwjRi2ihfQ= +github.com/a-h/pathvars v0.0.14/go.mod h1:7rLTtvDVyKneR/N65hC0lh2sZ2KRyAmWFaOvv00uxb0= +github.com/a-h/protocol v0.0.0-20230224160810-b4eec67c1c22/go.mod h1:Gm0KywveHnkiIhqFSMZglXwWZRQICg3KDWLYdglv/d8= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= @@ -166,8 +172,10 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11/go.mod h1:fmgDANqTUCxciViKl9hb/ github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cli/browser v1.3.0/go.mod h1:HH8s+fOAxjhQoBUAsKuPCbqUuxZDhQ2/aD+SzsEfBTk= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -175,6 +183,7 @@ github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= @@ -184,6 +193,7 @@ github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= @@ -203,7 +213,6 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= @@ -268,6 +277,7 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= +github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= @@ -287,8 +297,11 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rqlite/gorqlite v0.0.0-20230708021416-2acd02b70b79/go.mod h1:xF/KoXmrRyahPfo5L7Szb5cAAUl53dMWBh9cMruGEZg= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= +github.com/segmentio/encoding v0.4.0/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -300,6 +313,7 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= @@ -315,12 +329,19 @@ go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaod go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.lsp.dev/jsonrpc2 v0.10.0/go.mod h1:fmEzIdXPi/rf6d4uFcayi8HpFP1nBF99ERP1htC72Ac= +go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2/go.mod h1:gtSHRuYfbCT0qnbLnovpie/WEmqyJ7T4n6VXiFMBtcw= +go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= +go.opentelemetry.io/otel/oteltest v1.0.0-RC3/go.mod h1:xpzajI9JBRr7gX63nO6kAmImmYIAtuQblZ36Z+LfCjE= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= @@ -385,6 +406,7 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= diff --git a/mock_data/.gitignore b/mock_data/.gitignore deleted file mode 100644 index 05ec0c3e7..000000000 --- a/mock_data/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -venv/ \ No newline at end of file diff --git a/mock_data/Cargo.lock b/mock_data/Cargo.lock deleted file mode 100644 index 916e80389..000000000 --- a/mock_data/Cargo.lock +++ /dev/null @@ -1,1564 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" - -[[package]] -name = "bumpalo" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-targets 0.52.0", -] - -[[package]] -name = "clap" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-core", - "futures-task", - "pin-project-lite", - "pin-utils", -] - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "h2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "hyper" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "js-sys" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lipsum" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "636860251af8963cc40f6b4baadee105f02e21b28131d76eba8e40ce84ab8064" -dependencies = [ - "rand", - "rand_chacha", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl" -version = "0.10.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.4.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae94056a791d0e1217d18b6cbdccb02c61e3054fc69893607f4067e3bb0b1fd1" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "regex" -version = "1.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "reqwest" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustix" -version = "0.38.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" -dependencies = [ - "bitflags 2.4.2", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "sac_club_scraper" -version = "0.1.0" -dependencies = [ - "chrono", - "clap", - "lipsum", - "once_cell", - "rand", - "reqwest", - "serde", - "serde_json", - "strum", - "strum_macros", - "tokio", - "url", - "uuid", - "voca_rs", -] - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.115" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "stfu8" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51f1e89f093f99e7432c491c382b88a6860a5adbe6bf02574bf0a08efff1978" - -[[package]] -name = "strsim" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn", -] - -[[package]] -name = "syn" -version = "2.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" -dependencies = [ - "getrandom", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "voca_rs" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e44efbf25e32768d5ecd22244feacc3d3b3eca72d318f5ef0a4764c2c158e18" -dependencies = [ - "regex", - "stfu8", - "unicode-segmentation", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" - -[[package]] -name = "web-sys" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" -dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] diff --git a/mock_data/Cargo.toml b/mock_data/Cargo.toml deleted file mode 100644 index 7cef2b1e4..000000000 --- a/mock_data/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "sac_club_scraper" -version = "0.1.0" -edition = "2021" -authors = ["Garrett Ladley"] - - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -clap = { version = "4.5", features = ["derive"] } -strum = "0.26" -strum_macros = "0.26" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -url = "2.5.0" -tokio = { version = "1", features = ["rt-multi-thread", "macros"] } -reqwest = "0.12.3" -voca_rs = "1.15.2" -rand = "0.8.5" -once_cell = "1.8.0" -lipsum = "0.9.1" -chrono = "0.4.37" -uuid = { version = "1.8.0", features = ["v4"] } diff --git a/mock_data/README.md b/mock_data/README.md index 75ba7036e..8b86f8bdb 100644 --- a/mock_data/README.md +++ b/mock_data/README.md @@ -1,31 +1,29 @@ +# SAC Club Scraper +A Python script that creates mock club, tag, and category data for development and testing. -

SAC Club Scraper

+## Installation and Usage +This script was last developed using Python 3.12.2, and assumes you have Python installed. -
- -
- -A Rust CLI that scrapes Clubs from to be used as mock data for natural language search. +```console +pip install -r requirements.txt +python main.py mock.sql +``` -> [!NOTE] -> It is assumed you have Rust installed on your machine. If not, you can install it [here](https://www.rust-lang.org/tools/install). +```console +usage: Mock data generator [-h] [-a API_KEY] [-t TOP_N] [-p PARENT_UUID] output_file -## Usage +Generates mock club, category, and tag data for testing/development. -```console -Usage: sac_club_scraper [OPTIONS] +positional arguments: + output_file The SQL file to output the data to. -Options: - -t, --top-n Top N results to parse [default: 1024] - -o, --output Output file [default: mock.sql] - -p, --parent Parent club UUID [default: 00000000-0000-0000-0000-000000000000] - -h, --help Print help - -V, --version Print version +options: + -h, --help show this help message and exit + -a API_KEY, --api-key API_KEY + The OpenAI API key to use for generating descriptions and tags for clubs. (default: key in OPENAI_API_KEY or '' if that doesn't exist.) + -t TOP_N, --top-n TOP_N + The max # of clubs to retrieve from NUEngage. (default: 1024) + -p PARENT_UUID, --parent_uuid PARENT_UUID + The UUID of the parent club for the generated clubs. (default: 00000000-0000-0000-0000-000000000000) ``` diff --git a/mock_data/main.py b/mock_data/main.py new file mode 100644 index 000000000..18ac88892 --- /dev/null +++ b/mock_data/main.py @@ -0,0 +1,216 @@ +import json +from uuid import uuid4 +import os +import argparse +import re +import datetime +import random + +from progress.bar import IncrementalBar as Bar +from openai import OpenAI +import requests + +# STEP 0: Initialize constants + utility/helper functions +parser = argparse.ArgumentParser(prog="Mock data generator", + description="Generates mock club, category, and tag data for testing/development.") +parser.add_argument("output_file", help="The SQL file to output the data to.") +parser.add_argument("-a", "--api-key", default=os.environ.get("OPENAI_API_KEY", ""), help="The OpenAI API key to use for generating descriptions and tags for clubs. (default: key in OPENAI_API_KEY or '' if that doesn't exist.)") +parser.add_argument("-t", "--top-n", default=1024, help="The max # of clubs to retrieve from NUEngage. (default: 1024)") +parser.add_argument("-p", "--parent_uuid", default="00000000-0000-0000-0000-000000000000", help="The UUID of the parent club for the generated clubs. (default: 00000000-0000-0000-0000-000000000000)") +args = parser.parse_args() + +openai_client = OpenAI(api_key=args.api_key) +OUTPUT_FILE = args.output_file +TOP_N = args.top_n +PARENT_UUID = args.parent_uuid + +MOCK_CATEGORIES_AND_TAGS = { + "PreProfessional": [ + "Premed", + "Prelaw", + ], + "CulturalAndIdentity": [ + "Judaism", + "Christianity", + "Hinduism", + "Islam", + "LatinAmerica", + "AfricanAmerican", + "AsianAmerican", + "LGBTQ", + ], + "ArtsAndCreativity": [ + "PerformingArts", + "VisualArts", + "CreativeWriting", + "Music", + ], + "SportsAndRecreation": [ + "Soccer", + "Hiking", + "Climbing", + "Lacrosse", + ], + "ScienceAndTechnology": [ + "Mathematics", + "Physics", + "Biology", + "Chemistry", + "EnvironmentalScience", + "Geology", + "Neuroscience", + "Psychology", + "SoftwareEngineering", + "ArtificialIntelligence", + "DataScience", + "MechanicalEngineering", + "ElectricalEngineering", + "IndustrialEngineering", + ], + "CommunityServiceAndAdvocacy": [ + "Volunteerism", + "EnvironmentalAdvocacy", + "HumanRights", + "CommunityOutreach", + ], + "MediaAndCommunication": [ + "Journalism", + "Broadcasting", + "Film", + "PublicRelations", + ] +} + +TAGS_STRING = ", ".join(f"\"{tag}\"" for tag in sum(MOCK_CATEGORIES_AND_TAGS.values(), [])) # for tags_prompt + +def description_prompt(name: str, preview: str) -> str: + return f""" + I need your help writing club descriptions to create some mock data for an app I'm working on. The club's name is \"{name}\", and its short summary is \"{preview}\". + Generate a one to two paragraph description of what the club is and what it does. Use a mix of friendly, welcoming, and informative language and content. Store in this a JSON field \"description\". + Your output should just be the JSON with the generated description, no other text. Thank you! + """ + +def tags_prompt(name: str, description: str) -> str: + return f""" + I need your help picking club tags to create some mock data for an app I'm working on. The club's name is \"{name}\" and its description is \"{description}\". + Here are the tags you can choose from, in a JSON-formatted array: [{TAGS_STRING}]. + From this list, please return an array in JSON-format of 1-8 tags you think would be appropriate from this list. Store this array in a JSON field called \"tags\". + Your output should just be the JSON with the array, no other text. Thank you! + """ + +# STEP 1: Generate all the data to write to mock.sql + +# Get the clubs from nuengage, do some cleaning, and generate description (if needed) and tags (always needed) +clubs_response = requests.get(f"https://neu.campuslabs.com/engage/api/discovery/search/organizations?orderBy[0]=UpperName%20asc&top={TOP_N}&skip=0") +clubs_json = json.loads(clubs_response.text)['value'] +clubs = [] + +bar = Bar('Making club data', max=len(clubs_json), suffix="%(remaining)d Remaining, ETA: %(eta_td)s") +bad_club_descriptions = 0 +for club in clubs_json: + name = club['Name'].replace("(Tentative) ", "") + preview = club['Summary'] + description = club['Description'] + + # Generate description for club if needed. + if not isinstance(description, str): + description_response = openai_client.chat.completions.create( + model="gpt-3.5-turbo-0125", + response_format={ "type": "json_object" }, + messages=[ + {"role": "system", "content": "You are a helpful assistant designed to output JSON."}, + {"role": "user", "content": description_prompt(name, preview)} + ] + ) + + description = json.loads(description_response.choices[0].message.content)['description'] + # Some description responses will not contain valid JSON, hence this if check. + if not isinstance(description, str): + description = "" + bad_club_descriptions += 1 + else: + description = re.sub('<[^<]+?>', '', club['Description']).replace(" ", " ") + + tags_response = openai_client.chat.completions.create( + model="gpt-3.5-turbo-0125", + response_format={ "type": "json_object" }, + messages=[ + {"role": "system", "content": "You are a helpful assistant designed to output JSON."}, + {"role": "user", "content": tags_prompt(name, description)} + ] + ) + + tags = json.loads(tags_response.choices[0].message.content)['tags'] + + clubs.append({ + "id": str(uuid4()), + "name": name, + "preview": preview, + "description": description, + "num_members": random.randint(1,1024), + "is_recruiting": random.choice(["TRUE", "FALSE"]), + "recruitment_cycle": random.choice(["fall", "spring", "fallSpring", "always"]), + "recruitment_type": random.choice(["unrestricted", "application"]), + "tags": tags + }) + + bar.next() +bar.finish() +print(f"Bad club descriptions (JSON not created properly): {bad_club_descriptions}") + +# Generate the UUIDS for Categories, Tags, and a table for tags to categories. +category_uuids = {category: str(uuid4()) for category in MOCK_CATEGORIES_AND_TAGS} + +tag_uuids = {tag: str(uuid4()) for tag in MOCK_CATEGORIES_AND_TAGS.values() for tag in tags} +tags_to_categories = {tag: category for category, tags in MOCK_CATEGORIES_AND_TAGS.items() for tag in tags} + +# STEP 2: Write to SQL file. +with open(OUTPUT_FILE, 'w', encoding='utf-8') as file: + def w(x): + file.write(f"{x}\n") + + # Header + w("-- AUTO GENERATED MOCK DATA. DO NOT MODIFY") + w(f"-- GENERATED AT {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}") + + # Categories + w("BEGIN;") + for category, uuid in category_uuids.items(): + w(f"""INSERT INTO "categories" ("id", "name") VALUES ('{uuid}', '{category}');""") + + # Tags + for tag, uuid in tag_uuids.items(): + w(f"""INSERT INTO "tags" ("id", "name", "category_id") VALUES ('{uuid}', '{tag}', '{category_uuids[tags_to_categories[tag]]}');""") + + # Clubs + for club in clubs: + w("""INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}');""".format( + club['id'], + club['name'].replace("\'", "''"), + club['preview'].replace("\'", "''"), + club['description'].replace('\'', "''"), + str(club['num_members']), + club['is_recruiting'], + club['recruitment_cycle'], + club['recruitment_type'], + PARENT_UUID + )) + + # Tags <-> Clubs + # FIXME (maybe)?: The ChatGPT tags prompt will return tags that aren't in the list, hence this if statement being here. + # Don't think its a huge issue because ~half of tags are good. + bad_tags = 0 + total_tags = 0 + for club in clubs: + total_tags += len(club['tags']) + for tag in club['tags']: + if tag in tag_uuids: + w(f"""INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('{tag_uuids[tag]}', '{club['id']}')""") + else: + bad_tags += 1 + + print(f"{bad_tags}/{total_tags} marked for not existing in tag_uuids.") + + w("COMMIT;") + + w("-- END GENERATED MOCK DATA. Made with <3 by Garrett and Michael") \ No newline at end of file diff --git a/mock_data/nuengage_mock_data.sql b/mock_data/nuengage_mock_data.sql new file mode 100644 index 000000000..733a6cfcc --- /dev/null +++ b/mock_data/nuengage_mock_data.sql @@ -0,0 +1,4408 @@ +-- AUTO GENERATED MOCK DATA. DO NOT MODIFY +-- GENERATED AT 2024-04-29 23:39:23 +BEGIN; +INSERT INTO "categories" ("id", "name") VALUES ('5091d890-76de-4056-bab9-0be26e42daeb', 'PreProfessional'); +INSERT INTO "categories" ("id", "name") VALUES ('01bb75df-b46a-4634-b2b8-639dbf3d0003', 'CulturalAndIdentity'); +INSERT INTO "categories" ("id", "name") VALUES ('3532293b-d4da-4fb4-adc2-ee08608e90d0', 'ArtsAndCreativity'); +INSERT INTO "categories" ("id", "name") VALUES ('33759b1b-f709-4be5-99f6-034d15090980', 'SportsAndRecreation'); +INSERT INTO "categories" ("id", "name") VALUES ('ac91e32e-7969-4c01-8e74-e375a707e83e', 'ScienceAndTechnology'); +INSERT INTO "categories" ("id", "name") VALUES ('fbb7df7c-e03a-4004-8396-fbc42b4433ea', 'CommunityServiceAndAdvocacy'); +INSERT INTO "categories" ("id", "name") VALUES ('f172961a-5a0c-4086-b981-dd911227858e', 'MediaAndCommunication'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'Premed', '5091d890-76de-4056-bab9-0be26e42daeb'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('e4ea26ce-1444-41be-9342-f085f615f9a7', 'Prelaw', '5091d890-76de-4056-bab9-0be26e42daeb'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('9195072b-0a1b-4915-bd80-10b05ad1bef0', 'Judaism', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', 'Christianity', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('ad528419-c98a-47f9-b0a2-e72ac372faa2', 'Hinduism', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('297fd449-1e9a-461b-8014-48f08fb16aa5', 'Islam', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', 'LatinAmerica', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'AfricanAmerican', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'AsianAmerican', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'LGBTQ', '01bb75df-b46a-4634-b2b8-639dbf3d0003'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'PerformingArts', '3532293b-d4da-4fb4-adc2-ee08608e90d0'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'VisualArts', '3532293b-d4da-4fb4-adc2-ee08608e90d0'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'CreativeWriting', '3532293b-d4da-4fb4-adc2-ee08608e90d0'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'Music', '3532293b-d4da-4fb4-adc2-ee08608e90d0'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', 'Soccer', '33759b1b-f709-4be5-99f6-034d15090980'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', 'Hiking', '33759b1b-f709-4be5-99f6-034d15090980'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('618cafbb-0d29-4a94-8b0d-14d76e53b51a', 'Climbing', '33759b1b-f709-4be5-99f6-034d15090980'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('6bdecd9e-b28f-433c-9644-f7da9fe2289c', 'Lacrosse', '33759b1b-f709-4be5-99f6-034d15090980'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', 'Mathematics', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('7eb9c15f-4243-4895-ada4-d08c61ebeaf1', 'Physics', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'Biology', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('634b4962-9bf6-444e-84c7-5e54d8655ba4', 'Chemistry', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'EnvironmentalScience', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('dcf59820-af9a-4599-9552-0154f35d42d6', 'Geology', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'Neuroscience', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'Psychology', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'SoftwareEngineering', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', 'ArtificialIntelligence', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'DataScience', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('c1000c08-c02e-421c-ad34-a81836d1d053', 'MechanicalEngineering', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', 'ElectricalEngineering', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('67f9a398-4dd3-4cc5-8e72-8f3f2e65a436', 'IndustrialEngineering', 'ac91e32e-7969-4c01-8e74-e375a707e83e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'Volunteerism', 'fbb7df7c-e03a-4004-8396-fbc42b4433ea'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'EnvironmentalAdvocacy', 'fbb7df7c-e03a-4004-8396-fbc42b4433ea'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'HumanRights', 'fbb7df7c-e03a-4004-8396-fbc42b4433ea'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'CommunityOutreach', 'fbb7df7c-e03a-4004-8396-fbc42b4433ea'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'Journalism', 'f172961a-5a0c-4086-b981-dd911227858e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', 'Broadcasting', 'f172961a-5a0c-4086-b981-dd911227858e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', 'Film', 'f172961a-5a0c-4086-b981-dd911227858e'); +INSERT INTO "tags" ("id", "name", "category_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'PublicRelations', 'f172961a-5a0c-4086-b981-dd911227858e'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('07d91099-3ccd-481e-b24d-cfa7b5bdce52', 'Bake It Till You Make It', 'Bake It Till You Make It aims to cultivate an inclusive community for students to share and expand their love of baking!', 'Bake It Till You Make It is an organization to bring students together who have an interest or passion for baking. Whether you''re a seasoned pastry chef or a novice in the kitchen, our club provides a space to explore the art of baking, share delicious recipes, and foster a love for all things sweet. Come join us, and let''s bake memories together!', '201', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('02823e48-6cb5-4727-ae13-3ca6b4eca78b', 'Baltic Northeastern Association', 'The Baltic Northeastern Association serves as a home away from home for students from the Baltic countries, as well as an opportunity to share Baltic culture with interested students. ', 'The Baltic Northeastern Association serves as a home away from home for students from the Baltic countries, as well as an opportunity to share Baltic culture with interested students. We will host weekly meetings that can range from cooking sessions, discussions of Baltic culture and language, sharing Baltic traditional dancing and music, and more. ', '359', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('75dc80f4-ea4f-4964-8fba-e752794d1a47', 'Bangladeshi Organization of Networking, Diversity, Heritage, Unity and Support', 'The BONDHUS is dedicated to fostering a sense of home for Bangladeshi students and those interested in Bangladeshi culture, as well as celebrating the rich cultural heritage of Bangladesh.', 'The BONDHUS is dedicated to fostering a sense of home for Bangladeshi students and those interested in Bangladeshi culture. We strive to provide mentorship, build cultural awareness, and offer assistance with college admissions, including hosting events in Bangladesh related to Northeastern University. Our mission is to create an inclusive community that celebrates and promotes the rich heritage of Bangladesh while providing support and growth opportunities for our members. Our target membership includes Bangladeshi international undergraduates and graduates, Bangladeshi diaspora-born undergraduates and graduates, and non-Bangladeshi undergraduates and graduates interested in our culture and mission. We plan to host a wide range of events and initiatives, including: + +Cultural Celebrations: We will honor significant Bangladeshi events such as Pohela Boishakh (New Year''s Day), Ekushe February (International Mother Language Day), and Shadhinota Dibosh (Independence Day). + +Festive Gatherings: Observing cultural festivals like Eid and Puja, allowing members to share these joyous occasions together. + +Food-Based Events: Showcasing the vibrant and diverse Bangladeshi cuisine through cooking demonstrations, food festivals, and shared meals. + +Collaborations with Other BSAs: Building strong connections with other Bangladesh Student Associations to enhance cultural exchange and support. + +Fundraising Initiatives: Organizing events to support causes related to education and community development in Bangladesh. + +In conclusion, the BONDHUS aims to be a vibrant hub that nurtures a sense of belonging, celebrates cultural identity, and provides avenues for personal and professional growth. Through our planned activities and initiatives, we hope to create a dynamic and supportive community that connects Bangladesh with the broader academic landscape.', '855', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('82142fe4-7603-4828-9d19-64fbbe09029d', 'Binky Patrol', 'Binky Patrol is club that makes blankets by hand to donate to children in hospitals and shelters', 'Binky Patrol is a club that makes blankets by hand to donate to children in hospitals and shelters - if you want to get involved, join the slack with the link below! + +https://join.slack.com/t/binkypatrolnu/shared_invite/zt-2aiwtfdnb-Kmi~pPtsE9_xPTxrwF3ZOQ', '168', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8e12dc9d-2900-4cca-b08d-caed85720fa6', 'Biokind Analytics Northeastern', 'Biokind Analytics Northeastern brings together undergraduate data scientists and statisticians across the world to apply classroom learning for meaningful, positive societal impact in their communities.', 'Biokind Analytics Northeastern is a local chapter of the larger nonprofit organization, Biokind Analytics. The club aims to provide Northeastern students with the opportunity to apply data analysis skills and learnings to further the mission of local healthcare non-profit organizations in the Boston region. Our goal is to promote the development of relationships between Northeastern students and healthcare non-profits to better contribute to our local community. ', '357', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2b4315f6-304f-4704-be0f-ba367fe87932', 'Black Graduate Student Association ', 'The purpose of Black Graduate Student Association is to enhance scholarly and professional development of graduate students at Northeastern through networking, seminars, forums, workshops, and social gatherings in the Boston Area. ', 'Welcome to the Black Graduate Student Association! Our club is dedicated to enhancing the scholarly and professional development of graduate students at Northeastern University. Through networking opportunities, informative seminars, engaging forums, skill-building workshops, and fun social gatherings in the vibrant city of Boston, we strive to create a supportive community where members can thrive academically and socially. Join us in cultivating meaningful connections, expanding your knowledge, and enjoying enriching experiences as part of our inclusive and empowering club!', '13', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('33a0db57-ff20-4997-bfe7-518c7d8db242', 'Brazilian Jiu Jitsu at Northeastern University', 'BJJ is primarily a ground based martial art focusing on the submission of the opponent through principles of angles, leverage, pressure and timing, in order to achieve submission of the opponent in a skillful and technical way. + +', 'Join our Discord: https://discord.gg/3RuzAtZ4WS + +Follow us on Instagram: @northeasternbjj', '717', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('952d429e-f309-4332-a45b-113efd8e27ac', 'COExist', 'The COExist program will make becoming a husky easier than ever. Upper-class mentors will provide incoming first-year engineering students, mentees, with a comprehensive program to introduce, clarify and explain all of the opportunities that Northeaster', 'Welcome to COExist! Our program is designed to make your transition to becoming a husky at Northeastern University smoother than ever. Get ready to embark on this exciting journey with the help of our friendly upper-class mentors who are dedicated to guiding incoming first-year engineering students through a comprehensive program. From introducing you to campus life to clarifying the diverse opportunities available at Northeastern, our mentors are here to support you every step of the way. Join COExist and let us help you maximize your university experience!', '967', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1eff502d-5ac2-4f9d-a33e-66a5e9b98f15', 'Color Guard', 'A non-competitive Winter Guard team that meets once a week to practice new skills and meet members in the community. Performance opportunities will be made available throughout the year if members show interest and want to perform. ', 'Color Guard is a Dance-based activity that involves the use of equipment including but not limited to Rifles, Sabres and Flags. Members of Color Guards, referred to as spinners, work throughout the season to put together a themed show/performance with theme-based equipment, uniforms and floor tarp. This organization aims to introduce new students into the activity and provide a space for experienced members to come and practice and try new skills. Throughout the year, members interested in performing will put together a short winter guard show. ', '947', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('cb86b62b-a14f-49d0-8217-005f456992d0', 'Community Palette', 'We aim to provide art programs for individuals within underprivileged, clinical, or community centers that may use art to better their mental health. In doing so, we hope to address the issue of limited wellness services in clinical and community centers', 'The purpose of this organization is to expand creative and visual arts for individuals within underprivileged, clinical, or community centers in Boston that may use art as a way to cope from stress or require it to better their mental health and wellbeing. In doing so, we hope to destigmatize using the arts as a coping mechanism and foster friendships to address the issue of limited wellness services within clinical settings and community centers. We hope to bring together Northeastern students who are eager to get involved within our surrounding neighborhoods and have a strong desire to help alleviate stresses others may face through helping them escape with visual art projects and group activities. ', '262', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7b7c7b43-a1fc-435c-afa4-3c8057b589c3', 'ConnectED Research ', 'ConnectEd Research promotes educational equality, cultivates scholars, and hosts events to connect students and professors, fostering an inclusive academic community. We aim to bridge gaps in resources, empowering all students to excel in academia. + + + + + +', 'ConnectEd Research is a vibrant club dedicated to promoting educational equality and cultivating scholars within an inclusive academic community. Through a range of engaging events and initiatives, we strive to connect students and professors, bridging gaps in resources to empower all students to excel in academia. Join us as we work together to create a welcoming environment that fosters learning, growth, and collaboration.', '552', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d72004cb-8e58-4694-9a6e-7f8ee23b50d1', 'Cooking Club', 'NU Cooking Club is a place for those interested in the culinary arts. We explore different cultures and cuisines through fun cooking events. Come learn, cook, and eat with us!', 'NU Cooking Club is a place for those interested in the culinary arts. We explore different cultures and cuisines through fun cooking events. All skill levels are welcome; come learn, cook, and eat with us! + +Some events we plan on hosting include: + +- TV-show-style cooking competitions + +- Themed potlucks + +- Cooking demos/classes + +- Social outings/field trips + +- More fun ideas yet to come + +Feel free to join our Discord, Slack, or Mailing list. All our events will be announced through these channels! + +- Mailing List: https://forms.gle/9b7TKyWZwzRrdUby9 + +- Slack: https://join.slack.com/t/slack-0dp6908/shared_invite/zt-235mfootw-uGgwpPp7JpjBqdIt1iBZeg + +- Discord: https://discord.gg/q79tuWbDQP', '783', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e1e3acda-e4d0-477d-b504-c84e9bd035f4', 'Critical Corporate Theory Lab', 'The CCT Lab is focused on highlighting the influence of corporate power on our everyday lives. We see the invisible hand of corporate power influencing students’ decisions for their careers - and their lives. We believe something must be done.', 'The Critical Corporate Theory Lab is focused on highlighting the influence of corporate power on our everyday lives. + +The Lab is a branch of the Harvard Critical Corporate Theory Lab, spearheaded by Professor Jon Hanson of Harvard Law School. We see the invisible hand of corporate power influencing students’ decisions for their careers - and their lives. This "hand" has become stronger, prevalent, and accepted - and we believe something must be done.', '210', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f7ba90a7-6dc5-45ce-8297-c98eff5eb887', 'Crystal Clear', 'Crystal Clear is an inclusive community for students interested in Paganism, Spirituality, Astrology, crystals, tarot, and more. We provide a safe and supportive environment to explore and discuss Paganism, Neopaganism and Spirituality.', 'Crystal Clear is an inclusive community for students interested in Paganism, Spirituality, Astrology, crystals, tarot, and more. We explore the history and current context of various Pagan beliefs and the incorporation of Pagan practices into our own. By facilitating meaningful discussions that promote cultural awareness and critical thinking, and providing resources and support, we encourage community building within the Spirituality space on campus, and overall provide a communal space to practice and learn about (Neo)Paganism.', '856', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e9acd08e-38f7-4605-95f1-2f2f5489a85e', 'CTF Club', 'Our club cultivates a cybersecurity community for hands-on learning, and friendly competition through cybersecurity capture-the-flag (CTF) events and workshops focused on real-world skills development.', 'Our club aims to foster a vibrant community of cybersecurity enthusiasts who want to hone their hands-on, technical skills and knowledge in the field. Our mission is to provide a platform for learning, collaboration, and friendly competition through hosting cybersecurity capture-the-flag (CTF) workshops and contests. CTF competitions simulate real-world scenarios where participants must discover and exploit vulnerabilities in systems, networks, or applications.', '985', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b2acdd0b-da3d-4b1a-a6d5-6aa1b2150289', 'Dermatology Interest Society', 'DermIS is a collaborative group for Northeastern students interested in skincare and dermatology. At our regular meetings, we discuss and sample various skincare products, chat with experts in the field, and learn about dermatological conditions.', 'Welcome to the Dermatology Interest Society (DermIS), a vibrant community tailored for Northeastern students passionate about skincare and dermatology! Dive into the world of healthy skin with us as we come together at our engaging meetings to explore a variety of skincare products, mingle with industry experts, and delve into the fascinating realm of dermatological conditions. Whether you are a seasoned skincare enthusiast or just starting your journey, DermIS offers an inclusive space where curiosity, learning, and camaraderie thrive. Join us to experience the perfect blend of fun and knowledge in the pursuit of radiant skin health!', '552', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6cb566a6-7812-445a-8f80-521fcef25773', 'Digital Health Club', 'Digital Health Club (DHC) focuses on enhancing awareness about the increasing role of digital health in modern healthcare. We aim to create a dynamic and informed community through three pillars: clinical, entrepreneurship/collaboration, and networking.', 'Welcome to DHC! + +We are a student-led organization dedicated to raising awareness and fostering innovation of digital health in the field of modern healthcare throughout the Northeastern community. + +Our approach includes publishing insightful blog articles on the latest digital health technologies, their impact on patient care, and advancements in medical diagnostics and treatments. We also aim to strengthen innovation and collaboration skills through active participation in competitions and taking initiative in projects. Lastly, we organize guest speaker events and Q&A sessions to provide unique opportunities for members to interact with and learn from experienced professionals in the field. + +Join DHC and be at the forefront of digital healthcare innovation, expand your professional network, and influence the future of health technology. ', '291', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f6469144-438d-4c29-9766-f19be7a813d6', 'Emerging Markets Club ', 'The Emerging Markets Club is an organization with the mission to educate and collaborate with students to teach them more about the increasing relevance and importance of emerging markets within the economic and financial world. ', 'The Emerging Markets Club is an organization with the mission to educate and collaborate with students to teach them more about the increasing relevance and importance of emerging markets within the economic and financial world. We seek to accomplish this goal through providing students with unique opportunities to widen their understanding of emerging markets. Some of these opportunities include exclusive speaker events, hosted in collaboration with other adjacent organizations, engaging lectures hosted by club leaders and members, networking events to put members in touch with real players in the emerging markets world, and researching opportunities to deepen one''s understanding of emerging markets experientially. ', '90', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a3b62d86-ceeb-4172-9e2d-2c24849ce4f3', 'Fellowship and Manhood', 'To provide a platform for Black men on campus to come together, foster + +brotherhood, and strengthen each other through the values of brotherhood, + +manhood, and family. + +', 'Fellowship and Manhood is a welcoming sanctuary for Black men on campus to unite, building strong bonds of brotherhood while nurturing values of respect, responsibility, and resilience. Through a supportive community, members find a place to share experiences, seek guidance, and grow together in pursuit of personal and collective excellence. Whether engaging in lively discussions, meaningful activities, or simply enjoying each other''s company, Fellowship and Manhood empowers its members to embrace their true potential as leaders, mentors, and pillars of strength within their families and society.', '224', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('325d2e39-4d63-4bda-8e6d-be0669951dab', 'First Generation Investors Club of Northeastern University', 'FGI Northeastern is the Northeastern University chapter of a non-profit 501(c)(3) organization that teaches high school students in underserved communities the power of investing and provides students with real money to invest.', 'First Generation Investors Club of Northeastern University (FGI Northeastern) is the Northeastern University chapter of First Generation Investors, a non-profit 501(c)(3) organization. Our program leverages a network of intelligent and civic-minded Northeastern students to serve as tutors. We share our financial literacy and investing skills with high school participants across an eight-week program, including lessons in personal finance, the basics of stocks/bonds, diversification/market volatility, and compound interest, among other things. + +Through our intensive coursework, high school students form sophisticated analytical skills when looking at different types of investments. At the conclusion of our program, the student participants present their capstone projects, which break down their investment rationale and asset allocation of a $100 investment account. They invest in a mix of stocks, bonds, mutual funds, and index funds using an account opened in their name and funded by corporate partners. When they graduate from high school and turn 18, the account is transferred to them and serves as the initial seed for their future in investing.', '876', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f547f70a-c0d7-4819-af01-3a60c87887f1', 'Ghanaian Student Organization', 'The GSO at Northeastern University is a welcoming community focused on celebrating and promoting Ghanaian culture. Our mission is to create a space where students from all backgrounds can come together to appreciate the richness of Ghana.', 'The GSO at Northeastern University is a welcoming community focused on celebrating and promoting Ghanaian culture. Our mission is to create a space where students from all backgrounds can come together to appreciate the richness of Ghana.', '760', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('11920fef-97cb-459d-925d-3278273af5fd', 'Google Developer Students Club - Northeastern', 'Our goal is to create Impact, Innovate and Create. Impact students and empower them to + +impact their communities through technology. ', 'Our goal is to create Impact, Innovate and Create. Impact students and empower them to impact their communities through technology. The Google Developers Student Club (GDSC) will host information sessions, hands-on workshops, and student-community collaborative projects centered around the latest and greatest in technology, all with the support of Google and Google Developers. + +The GDSC will enhance the educational, recreational, social, or cultural environment of Northeastern University by being inclusive to all students, by transferring knowledge to students, by forging closer relationships between students and local businesses in the community, and by promoting diversity in the tech community.', '1014', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('64187513-b253-4146-b8f4-3f054e006c0f', 'Graduate Biotechnology and Bioinformatics Association', 'Graduate Biotechnology and Bioinformatics Association is mainly focused on providing a + + platform to students which enables them to connect and interact with their peers in the + + program as well as industry professionals', 'We aim to be an extended resource to the students as academic liaisons. Our association also plans to engage with Biotech/Bioinfo students in discussions, case studies, and career development sessions which will add to their portfolio.', '511', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1f6a6680-7f92-4dfa-852a-35a60a680e2c', 'Graduate Female Leaders Club', 'The Female Leaders Club was formed to connect graduate-level women with one another and congruently with other female leaders in various industries.', 'The mission is to build a community of current students and alumni as we navigate the graduate-level degree and professional goals post-graduation. We aspire to fulfill our mission by hosting speaking events with business leaders, networking in person and through virtual platforms, and providing workshops to foster professional growth.', '442', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ae05ed0d-760d-4d49-b9f8-f3c8c511f673', 'Habitat for Humanity Northeastern', 'Habitat for Humanity Northeastern is a student-run chapter that works under the Greater Boston Habitat for Humanity Organization. We work to build affordable housing in Greater Boston for people suffering from housing instability.', 'Habitat for Humanity is a non-profit organization with a global mission to address the critical issue of affordable housing. Founded on the belief that everyone deserves a safe, decent place to live, Habitat for Humanity mobilizes communities, volunteers, and resources to build and repair homes for families in need. This organization operates on the principle of "sweat equity," where homeowners actively contribute their own labor alongside volunteers, fostering a sense of ownership and empowerment. Through partnerships with individuals, corporations, and governments, Habitat for Humanity strives to break the cycle of poverty and improve lives by providing stable housing solutions. Student chapters work under their greater affiliate to meet the needs of their organization.', '420', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('97359b9b-cee4-4e58-866b-f67907bd4415', 'Haitian Student Unity (HSU)', 'Haitian Student Unity (HSU) strives to promote the Haitian culture throughout Northeastern University and its surrounding communities. It is our goal to be a vessel for Haitians and Non-Haitians to foster collaboration & share in Haiti''s rich culture!', 'Haitian Student Unity (HSU) is a vibrant community at Northeastern University dedicated to celebrating and embracing the beauty of the Haitian culture. Our mission is to create a warm and inclusive space where both Haitians and Non-Haitians come together to learn, share, and appreciate all that Haiti has to offer. Through various events, discussions, and cultural initiatives, HSU aims to be a bridge for connection, understanding, and unity among individuals who share a passion for the richness of Haiti''s heritage.', '411', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c65f0dfb-ffbc-4a57-a59c-b8a421036017', 'Half Asian People''s Association', 'HAPA is a community to explore and celebrate the mixed-race Asian experience and identity.', 'Hapa: “a person who is partially of Asian or Pacific Islander descent." We are a vibrant and supportive community centered around our mission of understanding and celebrating what it means to be mixed-race and Asian. + +Join our Slack: https://join.slack.com/t/nuhapa/shared_invite/zt-2aaa37axd-k3DfhWXWyhUJ57Q1Zpvt3Q', '692', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2435dc72-d4a5-4606-81ea-77dda195dd4b', 'Health Informatics Graduate Society of Northeastern University', 'The primary focus of the Health Informatics Graduate Society centers around our mission to cultivate a vibrant community of graduate students dedicated to advancing the field of health informatics.', 'Welcome to the Health Informatics Graduate Society of Northeastern University! Our club is a gathering place for graduate students passionate about advancing the field of health informatics. We strive to create a vibrant community where members can share knowledge, collaborate on innovative projects, and network with industry professionals. Join us as we work together to enhance our understanding of healthcare technology and make a positive impact on the future of healthcare systems.', '39', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7530b744-7467-4556-a6a1-6d7def71452b', 'Hear Your Song Northeastern', 'Hear Your Song NU is a subsidiary chapter of Hear Your Song, with its mission and purpose being to bring collaborative songwriting to kids and teens with chronic medical conditions. ', 'Hear Your Song NU is a subsidiary chapter of Hear Your Song, with its mission and purpose being to bring collaborative songwriting to kids and teens with chronic medical conditions. It will facilitate connections with local hospitals and organizations, perform all areas of music production and music video production, participate in trauma-informed training, and organize events and initiatives to further promote the therapeutic value of the arts.', '380', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('006ac5f3-a924-478e-96ee-81c89ee5b0a2', 'Hearts For The Homeless NEU', 'The mission of H4H NEU is to contribute to the health and well-being of one of the most vulnerable populations in our nation through free blood pressure screenings, education, and outreach opportunities for students who wish to contribute to our efforts.', 'Hearts for the Homeless NEU is an organization that provides free and informative heart health education events. The organization’s members provide electronic blood pressure machines and heart health information approved by the American Heart Association to the homeless in boston.', '897', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5aa9d717-c2d9-449b-9f5f-31651e0bb833', 'Hospitality Business Club', 'The Hospitality Business Club merges hospitality with business, exploring the blend of investments, design, real estate, and cuisine. Join us to unravel how hospitality shapes success across sectors. Interested? Reach out to join the exploration.', 'The Hospitality Business Club is an exciting space where the intricate connections between hospitality and business are explored and celebrated. We delve into the seamless amalgamation of investments, design, real estate, cuisine, and more to showcase how hospitality plays a pivotal role in the broader business landscape. Far beyond just a service industry, hospitality shapes experiences and drives success across various sectors. As a member, you''ll have the opportunity to engage with a like-minded community passionate about unraveling the complexities of this unique intersection. Our events, discussions, and collaborative projects aim to provide valuable insights into how hospitality functions within the broader scope of business. Whether you''re a seasoned professional, an entrepreneur, a student, or an enthusiast, the Hospitality Business Club welcomes all who seek to understand and contribute to the fascinating synergy between hospitality and business.', '332', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2c410248-ebe5-4eff-a6a7-f3e24d7a388b', 'Huntington Strategy Group', 'Huntington Strategy Group', 'Huntington Strategy Group is the Northeastern''s student-led strategy consultancy for non-profits and social organizations. Our mission is to ensure that nonprofits and social enterprises committed to education, health, and poverty alleviation can reach their full potential by meeting their demand for high-quality strategic and operational assistance, and in so doing developing the next generation of social impact leaders. Making an impact is a mutually beneficial process. We hope to provide leading-edge consulting services to social enterprises in the greater Boston area, and in turn, academic enrichment and professional opportunities for our peers through fulfilling client work and corporate sponsorships.', '962', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('63f14e5f-340f-44c8-be84-c148f72647f2', 'Husky Hemophilia Group', 'HHG’s mission is to support people with bleeding disorders and those with loved one''s bleeding disorders in research, education, and advocacy. ', 'HHG’s mission is to support people with bleeding disorders and those with loved one''s bleeding disorders in research, education, and advocacy. Bleeding disorders can be hereditary or acquired, where patients are unable to clot properly. In order to advocate for accessible healthcare for bleeding disorders, we as a chapter hope to educate the Northeastern and Massachusetts community in raising awareness for bleeding disorders. Welcome to our community!', '651', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('46c1522e-160f-475e-b063-cf263210b4fd', 'IAFIE Northeastern University Chapter ', 'International Association for Intelligence Education (IAFIE): To serve as a local organization for Intelligence and associated professionals to advance research, knowledge, partnerships, and professional development. + +', 'To serve as a local organization for Intelligence and associated professionals to advance research, knowledge, partnerships, and professional development. ', '195', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('889424c8-db97-415e-a3fd-879e1b348c82', 'If/When/How: Lawyering for Reproductive Justice at NUSL ', 'If/When/How mobilizes law students to foster legal expertise and support for reproductive justice. We integrate reproductive rights law and justice into legal education and build a foundation of lasting support for reproductive justice. ', 'If/When/How: Lawyering for Reproductive Justice at NUSL mobilizes law students to foster legal expertise and support for reproductive justice. It integrates reproductive rights law and justice into legal education to further scholarly discourse and builds a foundation of lasting support for reproductive justice within the legal community. The vision is reproductive justice will exist when all people can exercise their rights and access the resources they need to thrive and to decide whether, when, and how to have and parent children with dignity, free from discrimination, coercion, or violence. If/When/How values (1) dignity: all people deserve to be treated with respect and dignity for their inherent worth as human beings in matters of sexuality, reproduction, birthing, and parenting; (2) empowerment: those with power and privilege must prioritize the needs, amplify the voices, and support the leadership of those from vulnerable, under-served, and marginalized communities; (3) diversity: our movement will be strongest if it includes, reflects, and responds to people representing various identities, communities, and experiences; (4) intersectionality: reproductive oppression is experienced at the intersection of identities, conditions, systems, policies, and practices; and (5) autonomy: all people must have the right and ability to make voluntary, informed decisions about their bodies, sexuality, and reproduction.', '449', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('86596efb-e351-44b1-b765-54f292cc8159', 'Illume Magazine', 'Illume Magazine is a student-run publication at Northeastern University centered around all Asian-American and Asian/Pacific Islander experiences experiences, identities, and diasporas.', 'Illume Magazine is a student-run publication at Northeastern University devoted to the critical thought, exploration, and celebration of Asian-American and Asian/Pacific Islander experiences, stories, issues, and identities across all diasporas. + +Our magazine writes on Lifestyle & Culture, Political Review, while also accepting Literary Arts submissions.', '839', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fd7ed185-e0d8-4a32-b287-35fb8b70fe6a', 'inCrease', 'inCrease is an origami-focused organization where anyone can learn to fold paper! Join to pick up a new hobby, get help folding models, or work on designing your own!', 'Join inCrease to learn more about origami! + + + +We are a group of students that share the hobby of paperfolding, from a mix of all skill levels. No experience is necessary to leave your first meeting having folded something! + + + +Whether you have been folding for years, want to pick this up as a hobby, or are just curious to see what is possible through paperfolding, come check us out! + + + +We currently have meetings on Mondays at 7 PM ET in Hastings 109, starting on January 22nd, 2024. + + + +We are also planning on hosting and planning special events and topics such as: + +▪ A workshop on making your own double tissue paper + +▪ Collaborating with other origami clubs at other schools + +▪ Working on collaborative models with parts folded by all members + +▪ Showcasing the work of our members at the end of each semester', '949', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ee941f33-6952-449c-a214-228f399a770f', 'Indian Cultural Association', 'ICA’s mission is to provide a community for all Indian students across the Northeastern campus. Serving as a bridge between international students and Indian Americans, this club will foster dialogue and a sense of unity between the two groups.', 'ICA’s mission is to provide a community for all Indian students across the Northeastern campus. Serving as a bridge between international students and Indian Americans, this club will foster dialogue and a sense of unity between the two groups, by providing the resources for students to experience and learn about Indian culture during our meetings. Furthermore, our weekly meetings will help to familiarize members with modern India and evolving culture through movie nights and chai time chats. In addition, we will pair first-year international students with local students to help them acclimate to the new environment and to provide exposure to modern Indian culture for local students. ICA is Strictly an Undergraduate Club. ', '695', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2e0ce696-d366-4ede-8cfc-c3413f567c51', 'International Society for Pharmaceutical Engineering', 'The ISPE Student Chapter provides education, training, and networking opportunities referent to the biotechnology and pharmaceutical industry to graduate students, but also welcomes undergraduate students who want to participate in different activities. ', ' + +', '961', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a1921f1d-f7e7-4c3d-b4da-3669172ff1e9', 'KADA K-Pop Dance Team', 'KADA K-Pop Dance Team aims to empower & connect it''s members through dance, exciting events, & shared passions. By creating inclusive learning environments, we hope to give members a fun, flexible space to grow their dance & performance abilities.', 'Founded in 2019, KADA is Northeastern University''s first and only undergraduate K-Pop Dance Team, celebrating Korean popular culture through dance and offering a space for those looking to grow their dance skills. KADA has won Best Student Organization at Northeastern’s Dance4Me charity competition 3 years in a row and has worked to spread appreciation for Asian arts at a variety of other cultural events. With goals based in inclusivity, empowerment, and growth, we strive to create learning environments for all levels of dancers and drive connection through exciting events, shared passions, and an all-around fun time. From workshops, to rehearsals, to performances and projects, we want to create a space for members to to become stronger as both performers and leaders. ', '650', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8fbb2d83-09fe-4269-9a10-16f082cbc067', 'LatAm Business Club', 'Fostering a vibrant Latin American community, while creating an entrepreneurial environment for business development, professional growth, and geopolitical dialogue. ', 'Welcome to the LatAm Business Club, a dynamic hub fostering a vibrant Latin American community. We strive to cultivate an entrepreneurial environment that encourages business development, facilitates professional growth, and sparks insightful geopolitical dialogue. Join us in building valuable connections, exchanging ideas, and collaborating towards success in the diverse landscape of Latin American business.', '953', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('578da4f2-2b3c-4e2c-91e0-966ea85580d7', 'Letters of Love Northeastern', 'LOL NEU is a chapter of Letters of Love and its mission is to let every child facing health concerns know they are loved, supported and never alone. Letters of Love makes and distributes cards to children’s hospitals across the country.', 'LOL NEU is a chapter of Letters of Love and its mission is to let every child facing health concerns know they are loved, supported and never alone. Letters of Love makes and distributes cards and other support items to children’s hospitals across the country. ', '705', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0968bde1-e0b5-4425-bfdb-8682a70038b7', 'Malaysian-Singaporean Student Association', 'A vibrant and inclusive community for Malaysian and Singaporean students (or individuals interested in either culture) that provides a comforting sense of home away from home.', 'Welcome to the Malaysian-Singaporean Student Association! We are a vibrant and inclusive community dedicated to bringing together Malaysian and Singaporean students, as well as individuals interested in experiencing the richness of our cultures. Our association serves as a comforting space for members to find a sense of home away from home, fostering friendships, cultural exchanges, and exciting events that celebrate our heritage and traditions. Join us in creating lasting memories and connections while embracing the warmth and diversity of our shared heritage!', '365', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c9dd5836-8c0c-444a-a85e-1bb2d362fa25', 'Malhar', 'Malhar is an undergraduate Indian classical dance team that hopes to spread awareness of Indian culture and traditions through the art of dance and provide a platform for dancers to perform for the community. ', 'Malhar is an undergraduate Indian classical dance team that hopes to spread awareness of Indian culture and traditions through showcasing these ancient art forms. We represent several different Indian classical dance styles including Bharatanatyam, Kuchipudi, and Kathak, and are open to the various other classical forms as well. Malhar stays true to the traditions of classical Indian dance while also incorporating modern elements to create engaging performances. + +We hold tryouts each semester and perform at a variety of events and venues both on and off campus. ', '229', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('73956459-f909-4dbc-a9d7-fda4e2d6b521', 'Menstrual Equity at Northeastern', 'Our club has three pillars: education, advocacy, and service. We aim to help decrease period poverty in the Greater Boston area by running menstrual product drives, workshops, and destigmatizing menstruation.', 'Our proposed organization will be called the “Menstrual Equity Club,” which will work to address period poverty in Boston, and beyond through spreading awareness and spearheading menstrual health-related events. This is pertinent as one in seven menstruators in Boston face period poverty, meaning they are unable to afford menstrual products. This is very dangerous as it could have severe adverse health consequences including reproductive issues, urinary tract infections, and mental health impacts. We must address this issue and engage the Northeastern community to create a sustainable impact on our campus, our community, and on a global scale. Our organization will have three pillars: service, education, and advocacy (SEA). We plan to do this by holding drives that allow community members to donate period products to distribute in the Roxbury community. The organization will hold informative workshops to teach students about the importance of menstrual equity in the community and how we can best support the menstrual health of our community members, especially those of low socioeconomic status who face heightened risks of period poverty, people who face homelessness, and in prison systems. The goal of this is to decrease the stigma that is associated with discussing menstruation. We also will hold events that will empower students to share their own experiences with menstrual equity and brainstorm potential ways to decrease period poverty within the community. This organization will also join the Massachusetts Menstrual Equity Coalition (MME), allowing a greater network of resources aimed at decreasing period poverty along with showing student support for the “I AM Bill.” The I AM Bill will ensure “access to free menstrual products, without stigma, to all menstruating individuals in all public schools, homeless shelters, prisons, and county jails”(MME) Furthermore, the MME has worked with various Boston-based universities, including Boston University, and has vast experience empowering student organizations focused on combating period poverty. The intended audience for this organization is individuals who are passionate about menstrual equity and want to be involved in increasing education and reducing period poverty in our community. ', '933', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4031a438-5d75-484e-b2ea-47989cf09970', 'Music Production Club', 'A club for beginner and advanced music producers to share their music, get feedback, and learn about music production.', 'The music production club is a place for students producing any genre of music to meet, share their music and techniques, and learn from other students. We hold two weekly meetings. The first is more oriented towards beginners (although also completely open to advanced members), and focuses on teaching the basics of music production and answering production questions. The second type of meeting is more oriented towards advanced members, and consists mainly of WIP (work in progress) share and feedback exchange. We also hold various music production contests, such as sample flip contests and holiday themed contests. If you are interested, please join our organization right here on engage and reach out via email! + +Feel free to join our Discord server as well!', '933', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8bc2a8d9-fcba-496f-a8d3-f79f666f353b', 'NAAD (Northeastern A Cappella Association for Desi Music)', 'NAAD (Northeastern A Cappella Association for Desi Music) embodies the profound resonance of South Asian music. Join us on a cultural journey as we bring the rich tapestry of South Asian music to the A Cappella sphere at Northeastern University!', 'Naad literally means “sound”, but in philosophical terms it is the primordial sound that echoes through the universe, the vibration that is believed to have originated with its creation and has been reverberating through our very being ever since. Therefore, it is considered as the eternal Sound or Melody. NAAD which is our acronym for Northeastern A Cappella Association for Desi Music will be focused on bringing music lovers of South Asian music together. There are different types of music that originated in South Asia like hindustani classical, ghazal, qawali, carnatic music and so on. This will also bring South Asian music to the A Cappella sphere in Northeastern University. The club will consist of musicians from different south asian countries (Afghanistan, Bangladesh, Bhutan, India, Maldives, Nepal, Pakistan, and Sri Lanka) which will be reflected in our music and in our performances. ', '1003', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5b0abf55-2806-47d2-a95f-f8c411290df7', 'Naloxone Outreach and Education Initiative', 'Our club aims to educate Northeastern students, and surrounding community members on opioid emergencies, and how to use naloxone. We aim to increase access to naloxone and other harm reduction tools in our community. ', 'The Naloxone Outreach and Education Initiative is an organization dedicated to educating Northeastern students, and surrounding community members on the opioid public health crisis, opioid emergencies, and reversing an opioid overdose using naloxone in order to save a life. We also aim to increase awareness of the opioid crisis, and oppose the stigma surrounding addiction, opioid use, and seeking treatment. We offer free training sessions, naloxone, fentanyl test strips, along with other resources. The hope of this program is to ultimately increase preparedness for these emergencies, as they are occurring all around us, while also changing the way our community thinks about drug use, addiction, and treatment.', '181', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('184eb718-75ae-493c-9d24-73143942e41f', 'Network of Enlightened Women at Northeastern', 'NeW is a women driven organization which focuses on professional development, the discussion of ideas, and fostering a community. We are like minded women who are open and willing to explore cultural and political issues, often in a conservative light.', 'The Network of Enlightened Women educates, equips, and empowers women to be principled leaders for a free society. NeW is a national community of conservative and independent-minded women from all sectors and backgrounds, passionate about educating, equipping, and empowering all women. + + + +NeW serves as a thought leader, promoting independent thinking and providing intellectual diversity on college campuses and in public discussions on women, policy, and culture. + + + +This NeW chapter intends to bring together women for fun meetings, discussions on current events, professional development training, and service/volunteer work. The chapter helps women find friends on campus, learn something, and build their resumes. + + + +The three goals of NeW are to create a network of conservative women on campus and beyond, to become more educated on conservative issues and educate others, and to encourage more women to become leaders on campuses and in the community. + + + +NeW cultivates a vibrant community of women through campus chapters, professional chapters, and our online presence that emboldens participants to confidently advocate for pro-liberty ideas in their schools, workplaces, homes, and communities. + + + +NeW also connects program participants with career-advancing professional opportunities. + + + +NeW trains pro-liberty women to serve as leaders through campus sessions, national conferences, leadership retreats, and professional development programs.', '858', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d1600f1e-31cf-4370-8b48-c852eecff9ad', 'Northeastern University Physical Therapy Club', 'The Physical Therapy Club serves to enhance the professional development of students in the Physical Therapy program by organizing and participating in educational, social, and other charitable events.', 'The Physical Therapy Club serves to enhance the professional development of students in the Physical Therapy program by organizing and participating in educational, social, and other charitable events. The NEU PT Club is a student organization that works intimately with the Physical Therapy Department to sponsor the William E. Carter School Prom, host wellness events during National Physical Therapy Month, support the APTA Research Foundation, provide physical therapy-related community outreach opportunities and host social gatherings to help physical therapy majors from all years get to know each other. The Club also sponsors attendees at the APTA''s National Conferences yearly, schedules guest lectures, and provides social networking opportunities for all NEU Physical Therapy majors.', '827', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3709674c-2428-4c9b-aba0-b6384f3d472a', 'null NEU', 'null NEU at Northeastern University promotes cybersecurity education and innovation through events, projects, and resources. Recognized by Khoury College, we welcome students passionate about security. Join our mission to create a safer digital world.', 'Welcome to null NEU, the cybersecurity hub at Northeastern University. As the official student chapter of the renowned null community, we stand at the forefront of cybersecurity education, collaboration, and innovation within the dynamic environment of the Khoury College of Computer Sciences. Our commitment is to learn about security and live it, shaping the future of digital safety one project at a time. + + + +Who We Are + +null NEU is more than an organization; we are a movement. Driven by student leadership and recognized by esteemed faculty, our mission is threefold: to elevate security awareness across campus, to build a centralized repository brimming with cutting-edge security knowledge, and to push the boundaries of traditional security research into new and uncharted territories. + + + +Get Involved + +Cybersecurity is a vast ocean, and there''s a place for everyone in null NEU. Whether you''re taking your first dive into security or you''re already navigating the deep waters, we offer a plethora of opportunities to engage, learn, and contribute: + +- Participate in Our Events: From workshops to guest lectures and hackathons, our events are designed to expand your knowledge and network. + +- Contribute Your Skills: Have a knack for coding, research, or design? Our ongoing projects need your expertise. + +- Leverage Our Resources: Access our curated content and learning tools to advance your cybersecurity journey. + + + +Stay Connected + +The digital world is our playground, and we''re active across several platforms. Connect with us on LinkedIn for professional networking, join our Mastodon community for lively discussions, follow our Instagram for a visual tour of our activities, and stay updated with our Twitter feed for real-time engagement.', '277', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('21a2aaae-cc07-4c34-bc6c-2730e3d545f8', 'Perfect Pair at Northeastern University', 'NU Perfect Pair is a chapter of a national non-profit and it has a mission of fostering one-on-one, intergenerational connections between seniors and college students to combat experiences of social isolation and improve general well-being. ', 'NU Perfect Pair fosters intergenerational connections between seniors and college students in the hopes of countering isolation and loneliness in assisted living communities around the local Boston area. This endeavor is grounded in a commitment to reinforce a profound sense of community and purpose for the pairings, while simultaneously enhancing the overall health and well-being of the local senior demographic. + + + +The organization’s mission is accomplished through personalized matches between one older adult and one college student, taking into account shared backgrounds and mutual interests to ensure an authentic bond. Through weekly meetings and tailored programming, pairs engage in meaningful activities that provide mutual benefits, rekindling seniors’ passions and offering mentorship opportunities for students. + + NU Perfect Pair strives to raise awareness of the senior experience, challenge age-related stereotypes, and welcome new ideas that support the organization and the community it serves.', '374', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f1ac80bc-e361-4952-8978-8354d21e4ae9', 'Poker Club', 'We host regular Poker games for players of all skill levels, completely free-of-charge with prizes! We also host regular workshops and general meetings for members to learn more about how to play Poker. Follow us for more on Instagram! @nupokerclub', 'Northeastern Poker Club is a student organization for students to play and learn more about Poker on campus. We host regular Poker games on campus, regular workshops and general meetings for members to learn more about how to play Poker. + +We''re welcome to poker players of all skill levels. We strictly operate on a non-gambling basis, thus, all of our Poker games are free-of-charge and we give out regular prizes through our Poker games! + +We also participate in the PokerIPA tournament, where the best of the club get to play against top Poker players in colleges around the world for big prizes (learn more at pokeripa.com). ', '591', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2bd54300-0c35-4215-acdc-996f79c65173', 'Queer Caucus', 'Queer Caucus is a student-run organization dedicated to supporting lesbian, gay, bisexual, transgender, queer, gender non-conforming, non-binary, asexual, genderqueer, Two-Spirit, intersex, pansexual, and questioning members of the NUSL community.', 'Queer Caucus is a student-run organization dedicated to supporting lesbian, gay, bisexual, transgender, queer, gender non-conforming, non-binary, asexual, genderqueer, Two-Spirit, intersex, pansexual, and questioning students, staff, and faculty at NUSL. QC seeks to offer a welcoming space for all queer individuals to connect with other queer students while mobilizing around issues of injustice and oppression. We seek to affirm and support our members who are Black, Indigenous, and people of color, as well as our members with disabilities. Through educational programming, campus visibility, and professional development, Queer Caucus seeks to maintain Northeastern University School of Law’s position as the “queerest law school in the nation.”', '324', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c5ae7818-c950-4d00-9d31-896bdde44289', 'Real Talks', 'We''re a group that provides a space for students to connect and talk about real life issues and relevant social topics, and also enjoys fun times and good food!', 'Welcome to Real Talks! We''re a vibrant community dedicated to creating a safe and inclusive environment for students to engage in meaningful conversations about real life issues and relevant social topics. Whether you''re looking to share your experiences, learn from others, or simply enjoy good food and fun activities, our club offers a supportive space where everyone''s voice is valued. Join us for insightful discussions, new friendships, and memorable experiences that empower personal growth and foster connections that go beyond the campus grounds!', '723', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('58cb00dc-7f5a-4dc3-86ff-fb5f8fcf67ed', 'Rhythm Games Club', 'We the Northeastern''s Rhythm Games Club provide a community where members can play and share their experience with Rhythm Games!', 'We are Northeastern''s Rhythm Games Club! + +Our goal is to bring people together through playing Rhythm Games. We have many different games and events where you can try out and test your rhythm and reaction skills! Please join our discord at https://discord.gg/G4rUWYBqv3 to stay up to date with our meetings and events. ', '150', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5d21ca30-045d-436d-9d50-9ca4e66ea184', 'Robotics Club of Northeastern University', 'Our goal is to de-mystify robotics. We provide a launchpad for learning about robotics and self-starting projects. Check out our website for more information! https://www.nurobotics.org/', 'Our goal is to demystify robotics! NURobotics provides a launch-pad for learning about robotics and self-starting projects. We are an umbrella organization that supports a variety of student-led robotics projects while fostering a passionate community through general meetings and events. We firmly believe that a commitment to learning matters more than accumulated knowledge ever could, and strive to equip our members with the resources they need. Our club''s lab space is located in Richards 440 where we are equipped with 3D printers, tools, resources, and other manufacturing capabilities to support our student projects.Discord is our club''s main source of communication. Once you get verified, pick the roles for the project you''re interested in. + +Click here to join our Discord! + +Additionally, check out our presentation from our Beginning of Semester Kickoff Meeting which will help you get a better understanding of what each of our 9 projects has to offer and meeting times: + +Kickoff Presentation Slides + + + +Advisors: Professor Rifat Sipahi & Professor Tom Consi', '222', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('76cd02fd-8eb4-4f0e-bdfe-b7ad7998524b', 'Scholars of Finance', 'Scholars of Finance is a rapidly growing organization on a mission to inspire character and integrity in the finance leaders of tomorrow. We seek to solve the world’s largest problems by investing in undergraduate students.', 'Scholars of Finance is a vibrant community dedicated to nurturing the next generation of finance leaders. With a strong focus on character building and integrity, we empower undergraduate students to explore the dynamic world of finance and develop essential skills for solving global challenges. Join us in our mission to inspire and innovate for a brighter financial future!', '539', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9b2fb82e-a66f-4ab2-86f5-2820d76898e7', 'Sikh Student Association at Northeastern', 'We seek to foster a connection with faith for Sikh students. We encourage intercommunity, interfaith, and intercultural relationships to create an inclusive space and further the Sikh identity on campus. Our three pillars are Sikhi, Seva, and Sangat.', 'The Sikh Student Association at Northeastern seeks to foster a connection with faith for Sikh students on campus. The organization wants to encourage inter-community, inter-faith, and inter-cultural relationships to create a more inclusive space on campus. SSAN will participate in larger student body events in order to raise awareness of the presence of Sikhs on campus and deconstruct misconceptions about the Sikh faith, contributing to the safety of practicing Sikh students in the student body. + + + +The three pillars—Sikhi, Seva, and Sangat (translating to: Sikhi or learning/faith, service, and community)—help meet the spiritual needs of students on campus through visits to the Gurudwara, a Sikh place of worship, Kirtan Darbars on campus (bringing a faith service to campus), community service in the greater Boston area through organizations that need volunteers, and community building events. There will never be restrictions on who can join the organization as it is one of the fundamental tenets of Sikhi that everyone is welcome, no matter their background. We seek to ensure those in our community feel more at ease and feel a sense of belonging on campus. ', '943', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7b2b7918-0324-4af5-a258-9da7299e7427', 'Somali Students Association', 'SSA’s goal is to serve Northeastern University’s Somali students and those in the NU community that are interested in Somalia. SSA is also formed with the intention of bringing to light Somalia’s culture and ethnicity to the campus wide audience and ra...', 'NEUSSA is a segway between institutions to promote uplift, and unite the Boston Somali community and work to foster connections between Somali college students. + + + +Our goal is to serve Northeastern University’s Somali students and those in the NEU community who are interested in Somalia. The organization is also formed to bring to light Somalia’s culture and ethnicity to the campus-wide audience and raise awareness about Somalia’s culture, politics, religion, and general history. + +In addition to this better campus-wide representation, NEUSSA is also formed to connect Somali college Students and create a forum to interact about the current and future state of Somalia. NEUSSA intends to endeavor in critical areas to this aforementioned mission: The first area is mentorship, we intend to establish a mentorship program for current and future NEU Somali students, and would also like to play a role as a motivator and role model for Boston Area Students (Middle & High Schools). The second area of critical interest is academic enrichment for NEU Somali Students and the at-large NEU Community about Somalia by hosting discussions and forums on issues relating to Somalia and the third and final critical area of interest is to engage the local Somali community on relevant Local Somali causes/issues.', '267', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('aa34fab0-e637-4e9e-b639-b802f38e1cb2', 'SPIC MACAY NU CHAPTER', 'The Spic Macay chapter of NU aimed at promoting Indian art forms.', 'Welcome to SPIC MACAY NU CHAPTER! We are a vibrant community dedicated to celebrating and promoting the rich tapestry of Indian art forms. Our mission is to ignite a passion for traditional music, dance, and cultural heritage among the students of NU. Through engaging performances, workshops, and interactive sessions, we aim to create a platform where everyone can immerse themselves in the beauty and diversity of Indian arts. Join us in exploring the mesmerizing world of classical and folk traditions, connecting with like-minded individuals, and fostering a deeper appreciation for the artistic legacy of India.', '875', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d78bd9d4-9898-49c1-a3e9-d7dbebf3854d', 'Tau Beta Pi, MA Epsilon', 'The Tau Beta Pi Association is the oldest engineering honor society. It honors engineering students in American universities who have shown a history of academic achievement as well as a commitment to personal and professional integrity.', 'Welcome to Tau Beta Pi, MA Epsilon! We are a prestigious engineering honor society that values academic excellence and personal integrity. Our mission is to recognize and honor outstanding engineering students in American universities who have demonstrated a strong commitment to both their studies and ethical values. By becoming a part of our community, you will have the opportunity to connect with like-minded peers, participate in professional development activities, and contribute to projects that make a positive impact in the engineering field. Join us in fostering a culture of excellence and integrity in engineering education and practice!', '200', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5e339489-2d81-42fe-b3d9-67aca6e58ade', 'The Libre Software Advocacy Group', 'The goal of our organization is to promote the digital freedom of all through the promotion of Libre Software Ideals. ', 'The Libre Software Advocacy Group is a vibrant community dedicated to championing digital freedom for all. Our main mission is to advocate for Libre Software Ideals, fostering a culture of open collaboration and innovation. Through workshops, seminars, and outreach programs, we strive to educate and empower individuals to embrace free and open-source software, enabling them to take control of their digital lives. Join us in our exciting journey towards a more open and inclusive digital world!', '837', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ed6cd8c8-395a-4518-b088-297e242d1c12', 'The Sports Analytics Club', 'The Sports Analytics Club is a community where students from all + +disciplines come and learn about the wide ranging field of sports analytics. The club works to + +cultivate independent research as well as participate in national events.', 'The Sports Analytics Club is a vibrant community that welcomes students from various disciplines to explore the fascinating world of sports analytics. Here, members engage in learning sessions and discussions to delve into the diverse aspects of this field, from data analysis to predictive modeling. The club fosters a culture of independent research, empowering members to pursue their interests and contribute to the cutting-edge developments in sports analytics. Additionally, the club actively participates in national events, providing opportunities for members to showcase their skills and connect with industry professionals.', '876', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('530f76c7-f7d8-474e-b17b-746674fa2aab', 'The Wellness Project ', 'The Wellness Project aims to educate students about simple and healthy eating, all while implementing meal planning and effective budgeting strategies.', 'The Wellness Project is committed to educating students about simple and healthy eating, all while providing an environment that allows them to connect with like-minded individuals who share a common goal of prioritizing their health. We implement meal planning and effective budgeting strategies to introduce students to a sustainable way of eating that is both nourishing and affordable.', '57', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8a7c1789-7b91-414a-b762-0c536c065b4f', 'The Women''s Network Northeastern', 'The Women''s Network is the largest collegiate women''s networking organization in the nation. There are over 100 chapters at universities across the United States, Canada, and soon Ireland!', 'The Women''s Network strives to cultivate and celebrate women''s ambitions through connecting members to industry leaders, professional development resources, and career opportunities. TWN Northeastern holds a variety of experiential events: speaker events, professional development workshops, networking trips, alumnae receptions, community-based discussions, and more. Being a part of TWN is a great way to authentically expand networks, build confidence, gain exposure to different industries, and discover new career opportunities. Joining TWN has opened doors for tens of thousands of women across the country! Fill out our membership form at bit.ly/jointwn and visit our instagram @thewomensnetwork_northeastern to view our upcoming events!', '141', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('47923cd1-c713-4375-8e3f-4ba05a965835', 'Undergraduate Law Review', 'The Undergraduate Law Review (NUULR) is Northeastern''s distinguished undergraduate legal publication. ', 'Established in 2023, the Undergraduate Law Review (NUULR) is Northeastern''s distinguished undergraduate legal publication. Committed to fostering intellectual discourse and scholarly engagement, NUULR publishes insightful legal scholarship authored by undergraduate students from diverse backgrounds. Our mission is to create a dynamic space where legal ideas are explored, discussed, and shared among the Northeastern University community and the broader public. Our culture is rooted in the values of objectivity, critical thinking, and interdisciplinary exploration, making NUULR a leading forum for undergraduate legal discourse, critical analysis, and academic fervor. + +If you interested in joining NUULR, then please fill out this form to be added onto our listserv: https://forms.gle/g1c883FHAUnz6kky6 + + ', '913', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3a07882c-8ad3-4603-8874-deff6257c63f', 'United Against Trafficking', 'United Against Trafficking, is dedicated to educating, advocating, and taking concrete actions to combat all forms of human trafficking. We strive to create an environment where knowledge, activism, and compassion intersect to drive meaningful change.', 'United Against Trafficking is an organization dedicated to combating various forms of human trafficking, including sex trafficking, labor trafficking, and forced labor. Embracing the values of dignity and rights for all individuals, our mission centers on eradicating the horrors of trafficking and fostering a world where no one falls victim to such atrocities. Welcoming members from Northeastern University, including students, faculty, and staff, our aim is to build an inclusive and diverse community representing diverse academic disciplines and backgrounds. While our primary focus is within the university, we actively seek collaborations with local and national anti-trafficking entities, survivors, and advocates. Our initiatives span awareness campaigns, advocacy for policy reforms, community outreach, workshops, and training programs. Additionally, we engage in fundraising events to support frontline anti-trafficking efforts and foster collaborative partnerships to maximize impact. Furthermore, our organization encourages research projects aimed at enhancing understanding and driving evidence-based solutions. United Against Trafficking envisions a campus environment where knowledge, activism, and empathy intersect to create substantial change in the fight against human trafficking, aspiring to be a beacon of hope and progress in the global mission for a world free from exploitation and suffering. ', '591', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0d1881f5-70d2-40e0-9bc0-c09bd5dfe4cf', 'United Nations Association at Northeastern', 'Through advocacy, discussion, and education, UNA Northeastern advocates for the UN Sustainable Development Goals and for US leadership at the UN, both our global and local community. ', 'The United Nations Association of the USA is a grassroots organization that advocates for US leadership at the United Nations (UN). With over 20,000 members and more than 200 chapters across the country, UNA-USA members are united in their commitment to global engagement and their belief that each of us can play a part in advancing the UN’s mission and achieving the Sustainable Development Goals (SDGs). As a campus chapter UNA Northeastern advocates for the UN SDGs locally and connects the mission and career opportunities of the UN to our community. + +We’re working to build a welcoming community of students who are passionate about international issues. As an organization we come together weekly to learn about and discuss international issues and advocate for change in our community. The SDGs cover a broad range of issues and our focus represents this. Some of our past events, beyond our weekly meetings, have included annual UN Day and Earth Day events, a clothing drive, volunteering in the community, meeting with our representatives, and trips to UN events in New York. ', '96', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5853cb38-3c73-4f76-a37a-4bfe9c7ff93d', 'Women''s Run Club', 'We are a non-competitive running organization that hopes to create an inclusive, welcoming environment on campus, with a focus on empowering, educating, and mentoring women. ', 'Women’s Run Club is a non-competitive running organization that hopes to create an inclusive, welcoming environment on campus, with a focus on empowering, educating, and mentoring women. WRC will host several fun events every semester such as group runs, informative meetings, and social events. Join us!', '734', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('22282392-c6ec-4695-a166-54707a4920eb', 'Women’s + Health Initiative at Northeastern', 'W+HIN is a safe space for all those interested to discuss and learn about disparities that exist in healthcare for women and people with uteruses and how to combat these. We spread this knowledge by producing a student written women''s health journal.', 'The purpose of this organization is to provide a safe space for all people with uteruses and other interested parties to discuss and learn about the disparities that exist in healthcare for women and how to combat these. Topics surrounding women’s health are often viewed as taboo, preventing people with uteruses from becoming fully aware of the issues they face and how they can care best for their health. This organization is meant to combat this struggle by increasing women’s health education on campus both within and outside of organizational meetings and contributing to women’s health efforts in the greater Boston area. The organization will spread this knowledge mainly by producing a student written journal each semester. ', '740', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6353fdfb-e795-4d78-8287-be296708db7f', 'Aaroh', 'Are you proud of your Indian roots? Aaroh is an undergraduate Indian music club with an aim to bring music lovers together with a focus on different types of music bringing musical diversity to the campus and giving students a platform to perform.', 'Aaroh is an organization that aims to bring music lovers together with a focus on the different types of Indian music; including but not limited to Bollywood, folk, fusion, Carnatic, and Hindustani classical with a focus on Indian origin instruments. + +We will be actively engaged in bringing musical diversity to the campus, giving students a platform to convene, discuss and perform.', '991', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('022fc6e0-2b9e-474b-b6e1-43f4f88cc350', 'Acting Out', 'Acting Out is Northeastern University''s only acting company dedicated to promoting social change through the work that it produces, events it holds, and discussions it facilitates. ', 'Acting Out is Northeastern University''s only acting company dedicated to promoting social change through the work that it produces, events it holds, and discussions it facilitates.', '798', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('01465118-26a2-4d8b-b4c4-826228f0b88e', 'Active Minds at NU', 'As a chapter of the national organization, Active Minds, Inc., Active Minds at NU strives to reduce the stigmas associated with mental health disorders and encourage conversation among Northeastern students about mental health. ', 'As a chapter of the national organization, Active Minds, Inc., Active Minds at NU strives to reduce the stigmas associated with mental health disorders and encourage conversation among Northeastern students about mental health. We are not a support group or peer counselors, but rather an educational tool and liaison for students. We aim to advocate for students and bring about general awareness through weekly meetings and programming. Drop by any of our events or meetings to say hi! :) + +Join our Slack! + +Check out our website!', '924', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bdfaf92d-7741-4401-85d3-512f9cea5ce9', 'Addiction Support and Awareness Group', 'The mission of this organization is to create a community for people struggling with addiction and to educate the Northeastern community on this topic. You do not have to be dealing with addiction to join!', 'The mission of this organization is to create a community for people struggling with addiction and to educate the northeastern community on the topic. The National Institute on Drug Abuse has established that as of 2022, 20.4 million people have been diagnosed with a substance use disorder in the past year and only 10.3% of those people received some type of treatment. Massachusetts itself suffers from an opioid crisis, and more people have died from drug overdose in recent years than ever before. In the Boston-Cambridge-Quincy Area, the home of Northeastern, 396,000 people ages 12 or older were classified as having a substance use disorder in the past year, higher than the national rate (NSDUH Report). College students between ages of 18 and 22 particularly are at higher risk for struggling with substance use disorders. The National Survey on Drug Use and Health asked participants in this age group who were at college and who were not if they had used alcohol in the past month; college students'' "yes," answers were 10% higher than the group that was not in college. + + + + ', '888', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('43358f45-8bb2-4d5a-a555-7377f4abf416', 'AerospaceNU', 'This group is for anyone and everyone who wants to design and build projects with the goal of getting them in the air. Whether it''s rockets, unmanned aerial vehicles, quadcopters, or weather balloons, you can bet we''re building it and teaching anyone how', 'This group is for anyone and everyone who wants to design and build projects with the goal of getting them in the air. Whether it''s rockets, unmanned aerial vehicles, airships, quadcopters, or weather balloons, you can bet we''re building it and sending it soaring. This club supports multiple projects at a time, some of which compete against other schools, others are trying to break records, while others are just for research and fun. You don''t need to have any experience to join us! We are here to give students the opportunity to get their hands dirty and pursue projects about which they are passionate. Check out our website for more information and to get added to our emailing list!', '937', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c9f58449-6a94-44c7-afc4-628cd7a0fc65', 'African Graduate Students Association', 'AGSA is dedicated to empowering African graduate students and enhancing their educational and personal experiences. ', ' + +The African Graduate Students Association at Northeastern University is dedicated to empowering African graduate students and enhancing their educational and personal experiences. Our purpose revolves around six core themes: community building, professional development, advocacy, global engagement, leadership empowerment, and cultural integration. Through these focused areas, we aim to support our members in achieving their academic and career goals, advocate for their needs, celebrate the rich diversity of African cultures, and foster a sense of unity and inclusion within the university and beyond. + + ', '445', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b6fda1b2-7120-452b-96f4-25054ad94389', 'afterHOURS', 'Afterhours is an extremely unique college entertainment venue located in the Curry Student Center at Northeastern University in Boston, MA. From state-of-the-art video and sound concepts to a full-service Starbucks Coffee, Afterhours programs almost ev...', 'Afterhours is an extremely unique college entertainment venue located in the Curry Student Center at Northeastern University in Boston, MA. From state-of-the-art video and sound concepts to a full-service Starbucks Coffee, Afterhours programs almost every night of the week and supports programming for over 200 student organizations!Come down to check out sweet music and grab your favorite Starbucks treat!', '1020', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3f239dfb-8362-4f93-a54c-f8107e8ef2d7', 'Agape Christian Fellowship', 'We are Agape Christian Fellowship, the Cru chapter at Northeastern University. We are a movement of students loving Jesus, loving each other, and loving our campus. We currently meet at 7:30 EST on Thursdays- feel free to stop by!', 'We are Agape Christian Fellowship, the Cru chapter at Northeastern University. We are a movement of students loving Jesus, loving each other, and loving our campus. Our vision is to be a community of people growing in their relationships with Jesus, learning together, and encouraging one another.We currently meet at 7:30PM on Thursdays in West Village G 02 for our weekly meeting, and we''d love if you could stop by!', '4', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('634d8b37-550e-410c-b99c-d0fd966f3229', 'Alliance for Diversity in Science and Engineering', 'Our mission is to increase the participation of underrepresented groups (Women, Latinos, African-Americans, Native Americans, the LGBTQIA+ community, persons with disabilities, etc.) in academia, industry, and government. ', 'Our mission is to increase the participation of underrepresented groups (Women, Latinos, African-Americans, Native Americans, the LGBTQA community and persons with disabilities, etc.) in academia, industry, and government. ADSE supports, organizes, and oversees local, graduate student-run organizations that reach out to students and scientists of all ages and backgrounds. We aim to connect scientists across the nation, showcase non-traditional career paths and underrepresented minority experiences in STEM, and educate students at all levels about opportunities in the sciences. + + + +Please check out our Summer Involvement Fair Information Session at the belowlink to learn more about our organization and what we have to offer you thisyear: https://www.youtube.com/watch?v=ozYtnJDxSHc&t=750s ', '8', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('10f8b2a5-33fa-416f-9d84-6b9b7723ba2d', 'Alpha Chi Omega', 'The Alpha Chi Omega Fraternity is devoted to enriching the lives of members through lifetime opportunities of friendship, leadership, learning and service.', 'The Alpha Chi Omega Fraternity is devoted to enriching the lives of members through lifetime opportunities of friendship, leadership, learning and service.', '763', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c8279222-aff2-46a7-9069-30f762fff748', 'Alpha Epsilon Delta, The National Health Preprofessional Honor Society', ' + +Alpha Epsilon Delta is a nationally recognized Health Preprofessional Honors Society. + +Please get in touch with us at northeasternaed@gmail.com if you are interested in applying. ', ' + +Alpha Epsilon Delta (AED) is the National Health Preprofessional Honor Society dedicated to encouraging and recognizing excellence in preprofessional health scholarship. Our Chapter here at Northeastern includes undergraduate students on the pre-med, pre-PA, pre-vet, pre-PT, and pre-dental tracks. We also have members who are interested in pursuing careers in research. Our biweekly chapter meetings consist of various activities, including focused discussions, student panels, and guest speakers'' lectures. Last semester, members also had the opportunity to attend CPR lessons, suture clinics and participate in club sponsored volunteer activities. + + + + + + + +Timeline: + + + + + +Applications will be sent out in both the Fall and Spring semesters for an Induction in November and January. If you have any questions, please email us at northeatsernaed@gmail.com. Thank you for your interest! + + + + + + + +Requirements to join: + + + + + +- Membership is open to students currently enrolled in chosen health professions, including careers in medicine (allopathic and osteopathic), dentistry, optometry, podiatry, veterinary medicine, and other health care professions requiring post baccalaureate study leading to an advanced degree. + + + + + +- Potential members must have completed at least three semesters or five quarters of health preprofessional studies work by the time of Induction with an overall cumulative GPA of at least 3.20 on a 4.0 scale (A = 4.00) and also with a cumulative GPA of 3.20 in the sciences – biology, chemistry, physics, and mathematics. + +- The Massachusetts Zeta chapter at Northeastern University will accept Associate Members. + +- Associate members will be considered full members of the Chapter but will not be formally inducted into it until they meet all the membership requirements. They will have access to all the events, meetings, panels, volunteer opportunities, and the mentorship program and can be elected into committee chair positions. However, they will not be able to run for full e-board positions until they have been inducted. + + + + + + + +Dues: + + + + + +Membership in Alpha Epsilon Delta is an earned honor for life. There will be no annual dues for returning members for the 2023-2024 academic year. However, there is a one time fee of $90 for newly inducted members which goes to the National Organization. The money sent to the National Organization covers lifetime membership and a certificate. + +', '625', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f7002326-556e-47a4-9abe-498844fc6a33', 'Alpha Epsilon Phi', 'Alpha Epsilon Phi is a national sorority dedicated to sisterhood, community service and personal growth. AEPhi was founded at Northeastern University on May 6th, 1990, and to this day it continues to be a close-knit, compassionate community that foster..', 'Alpha Epsilon Phi is a national sorority dedicated to sisterhood, community service, and personal growth. AEPhi was founded at Northeastern University on May 6th, 1990, and to this day it continues to be a close-knit, compassionate community that fosters lifelong friendship and sisterhood. We seek to create an environment of respect and life-long learning through sister''s various passions, community service, and engagement with various communities. Above all else, Alpha Epsilon Phi provides a home away from home for college women and unconditional friendships that will last far beyond the time spent at Northeastern University.', '760', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fb0657be-9b2e-4471-b90d-86c1c247a6b2', 'Alpha Epsilon Pi', 'Our basic purpose is to provide a comprehensive college experience for young men, fuel social and personal growth in our members, and create lasting friendships, mentorship, community and support for our diverse brotherhood', 'Our basic purpose is to provide a comprehensive college experience for young men, and create lasting friendships, mentorship, community and support for our diverse brotherhood. Alpha Epsilon Pi, predicated off of socially and culturally Jewish values, strives to strengthen each member''s strengths and helps them overcome their weaknesses, and emphasizes personal, professional and social growth. We believe our organization provides a unique opportunity that can not be found as easily through other mediums.', '848', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c17df5f6-6bc1-4063-a0a9-1ef900406a1f', 'Alpha Kappa Alpha Sorority, Inc - Iota Gamma Chapter', 'Founded on the campus of Howard University in Washington, DC in 1908, Alpha Kappa Alpha Sorority is the oldest Greek-letter organization established by African American college-trained women. To trace its history is to tell a story of changing patterns...', 'Founded on the campus of Howard University in Washington DC in 1908, Alpha Kappa Alpha Sorority is the oldest Greek-letter organization established by African American college-trained women. To trace its history is to tell a story of changing patterns of human relations in America in the 20th century. The small group of women who organized the Sorority was conscious of a privileged position as college-trained women of color, just one generation removed from slavery. They were resolute that their college experiences should be as meaningful and productive as possible. Alpha Kappa Alpha was founded to apply that determination. As the Sorority grew, it kept in balance two important themes: the importance of the individual and the strength of an organization of women of ability and courage. As the world became more complex, there was a need for associations which cut across racial, geographical, political, physical and social barriers. Alpha Kappa Alpha’s influence extends beyond campus quads and student interest. It has a legacy of service that deepens, rather than ends, with college graduation. The goals of its program activities center on significant issues in families, communities, government halls, and world assembly chambers. Its efforts constitute a priceless part of the global experience in the 21st century.', '886', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('640a7dea-8630-4aa1-8be8-940a336e359d', 'Alpha Kappa Psi', 'Alpha Kappa Psi is a professional fraternity that welcomes all individuals with interest in business and provides its members with world-class professional and leadership development opportunities. Learn more at http://www.akpsineu.org/', 'Alpha Kappa Psi is a professional fraternity that welcomes all individuals with interest in business and provides its members with world-class professional and leadership development opportunities. We focus on the values of ethics, education, and community leadership that are necessary to succeed in today''s evolving world. Learn more at http://www.akpsineu.org/. ', '867', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a561e329-6337-4ba9-ab92-e92b0b1f1a40', 'Alpha Kappa Sigma', 'Alpha Kappa Sigma, established here in 1919, is one of Northeastern''s only two local fraternities. We are a social fraternity open to anyone interested. Attend one of our fall or spring rush events for more information. Hope to meet you soon!', 'Alpha Kappa Sigma, established here in 1919, is one of Northeastern''s only two local fraternities. We are a social fraternity who place a strong emphasis on brotherhood, personal and professional growth, and creating lasting memories and lifelong friends. Attend one of our fall or spring rush events for more information. Hope to meet you soon!', '334', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1e5fc4c7-78d8-4dbf-8612-bfd44c2bc113', 'Alpha Phi Omega', 'Alpha Phi Omega (APO) is a national co-ed service fraternity. We partner with over 70 community service organizations in Boston, foster a community of service-minded individuals, and promote leadership development.', 'Alpha Phi Omega (APO) is a national coeducational service organization founded on the principles of leadership, friendship, and service. It provides its members the opportunity to develop leadership skills as they volunteer on their campus, in their community, to the nation, and to the organization. As a national organization founded in 1925, Alpha Phi Omega is the largest co-ed service fraternity in the world, with more than 500,000 members on over 375 campuses across the nation. Alpha Phi Omega is an inclusive group, open to all nationalities, backgrounds, and gender. APO provides the sense of belonging to a group while also providing service to the community by donating time and effort to various organizations. Our chapter partners with varied and diverse nonprofits in the Boston area. Some places we volunteer include Prison Book Program, Community Servings, Y2Y, National Braille Press, and the Boston Marathon. We also foster community through fellowship and leadership events. + +https://northeasternapo.com', '188', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8e72d3e3-ae92-4968-8ac7-57cd14fdc778', 'American Academy of Orthopedic Manual Physical Therapists Student Special Interest Group', 'Develop skills in manual physical therapy & enhance use of current evidenced based manual physical therapy. AAOMPT sSIG serves to supplement the existing didactic education in the physical therapy curriculum to best prepare students for their future.', 'The American Academy of Orthopaedic Manual Physical Therapy (AAOMPT) is an organization that fosters learning and research in orthopedic manual physical therapy. The student special interest group (sSIG) encourages students to develop skills in manual physical therapy and enhance their use of current evidenced based manual physical therapy. Since the curriculum is only able to provide an introduction to manual therapy, this organization serves to supplement the existing didactic education to best prepare students for their co-operative education, clinical rotations, and future career.', '292', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('efd81923-a8b2-4598-aa31-ffc0eefca530', 'American Cancer Society On Campus at Northeastern University', 'A student group on campus supported by the American Cancer Society that is dedicated to education raising awareness and bringing the fight against cancer to the Northeastern community. We do this in four major ways including; Advocacy, Education, Survi...', 'A student group on campus supported by the American Cancer Society that is dedicated to education raising awareness and bringing the fight against cancer to the Northeastern community. We do this in four major ways including; Advocacy, Education, Survivorship, and Relay For Life. + + + +We host many events throughout the year, including Kickoff, Paint the Campus Purple, a Luminaria Ceremony on Centennial Quad, Real Huskies Wear Pink, the Great American Smoke Out, and Relay For Life, in addition to attending off campus events.', '239', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6e4d26ee-29ea-4db1-a124-6bd2e237a24f', 'American College of Clinical Pharmacy Student Chapter of Northeastern University', 'The objective of the ACCP chapter at Northeastern University is to improve human health by extending the frontiers of clinical pharmacy. Our mission is to concentrate on helping students understand the roles and responsibilities of various specialties.', 'The objective of the ACCP chapter at Northeastern University is to improve human health by extending the frontiers of clinical pharmacy. Our mission: Concentrate on helping students understand the roles and responsibilities of various specialties of the clinical pharmacist Explore all the opportunities that exist for students as future experts in this field Provide leadership, professional development, advocacy, and resources that enable student pharmacists to achieve excellence in academics, research, and experiential education Advance clinical pharmacy and pharmacotherapy through the support and promotion of research, training, and education.', '133', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b64572a6-8c30-4d84-8828-0ab5a3719967', 'American Institute of Architecture Students', 'We are a resource to the students, the School of Architecture, and the community. We focus on providing students with more networking, leisure, and professional opportunities. We, the students, have the power to change the profession that we will enter.', 'The American Institute of Architecture Students (AIAS) is an independent, nonprofit, student-run organization dedicated to providing unmatched progressive programs, information, and resources on issues critical to architecture and the experience of education. The mission of the AIAS is to promote excellence in architectural education, training, and practice; to foster an appreciation of architecture and related disciplines; to enrich communities in a spirit of collaboration; and to organize students and combine their efforts to advance the art and science of architecture. Learn more at: aias.org. + +Freedom by Design (FBD) constructs small service projects in the chapter’s community. + +The Northeastern AIAS chapter offers many events throughout the school year that aim to meet the national mission. We host firm crawls that allow students to visit local firms in Boston and Cambridge to provide a sense of firm culture expectations and realities. It offers a mentorship program for upper and lower class students to meet and network, and provide a guide for lower class students as they begin in the architecture program. Northeastern’s chapter also host BBQ’s, game nights, and other architecture related events.', '244', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a660b03d-e5cf-4ea6-bf19-8373baab801a', 'American Institute of Chemical Engineers of Northeastern University', 'American Institute of Chemical Engineers is a national organization that caters to the needs of Chemical Engineers. The organization fosters connections between Undergraduate students, Graduate students and Professions in the Chemical Engineering field', 'American Insitute of Chemical Engineers is a national organization that caters to the needs of Chemical Engineers. The organization fosters connections between Undergraduate students, Graduate students and Professions in the Chemical Engineering field. AIChE exists to promote excellence in the Chemical Engineering profession. The organization also strives to promote good ethics, diversity and lifelong development for Chemical Engineers. We host informative and social events that include student panels, industry talks, lab tours, and a ChemE Department BBQ! + + + +We also have a Chem-E-Car team that works on building and autonomous shoe box sized car powered by chemical reaction developed by students. On the day of competition we learn the distance the car has to travel and based on our calibration curves determine the quantity of reactants required for the car to travel that distance holding a certain amount of water.', '351', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5685f13d-b42b-42d3-913d-909cf043bd84', 'American Society of Civil Engineers', 'Northeastern University Student Chapter of the American Society of Civil Engineers', 'Founded in 1852, the American Society of Civil Engineers (ASCE) represents more than 145,000 members of the civil engineering profession worldwide and is America’s oldest national engineering society. + +Northeastern University''s ASCE student chapter (NU ASCE) help their members develop interpersonal and professional relationships through a variety of extracurricular activities and community service projects within the field of civil and environmental engineering. Each week we hold a lecture presented by a different professional working in civil and environmental engineering careers. We work closely with a variety of civil and environmental engineering clubs and organizations, such as Engineers Without Borders (EWB), Steel Bridge Club, Concrete Canoe, the Institute of Transportation Engineers (ITE), Northeastern University Sustainable Building Organization (NUSBO), and New England Water Environmental Association (NEWEA); and we participate in the Concrete Canoe and Steel Bridge competitions. NU ASCE also coordinates with Chi Epsilon Civil Engineering Honor Society to organize tutoring for civil and environmental engineering students, and has helped with 30 years of community service projects.', '188', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6ae239d3-e712-44a4-a4d1-99d8df8a6286', 'American Society of Mechanical Engineers', 'We are a campus chapter of the American Society of Mechanical Engineers. We host weekly industry meetings from professionals across the field, workshops to gain hands-on skills, a Solidworks certification course, and more events for the MechE community!', 'We are a campus chapter of the American Society of Mechanical Engineers. We bring in representatives of companies and other professionals to talk to students about engineering companies as well as new and upcoming information/technology in the field. It is a great way to make connections and explore your future career. We also teach an advanced 3D modeling training course (SolidWorks) to better prepare students for their Co-ops. We aim to help students grow as professionals, gain experience, and build a healthy resume.', '636', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0c4628be-3745-4c63-aacf-8046ce2bf7d0', 'Anime of NU', 'Twice every week, we watch and discuss Japanese anime and culture. This is a club where you come, watch a couple of episodes, laugh and cry with everyone, then chat about it afterward. + + + +Make sure to join our discord: https://discord.gg/pwrMBptJ3m', 'Do you like stories of traveling to a new world and defeating villains? How about stories of love and sacrifice? Maybe you''re more into suspense and drama? At Anime of NU, we offer all of that and more! We are a club with one simple objective: to watch and discuss Japanese anime and culture. Every week, we watch a slice-of-life (typically more humorous, romantic, and/or heartfelt) and action (do we need to explain what "action" is?) anime, and we also throw in some seasonal movies and activities. We also act as a social space for members. This is a club where you come, watch a couple of episodes, laugh and cry with everyone, then chat about it afterward. It''s a fun time for the whole family! + +--- + +Tuesdays, 7-9pm, 201 Hastings ----- Fridays, 7-9pm, 106 West Village G + +Make sure to join us in Discord here so you can get all the updates and vote on which shows we''ll watch!', '1016', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0946f70a-0a66-4df6-b52e-8735ef7edd5f', 'Arab Students Association at Northeastern University', 'Our purpose is to bring Arab students attending Northeastern University together to create connections and friendships. Also, we raise awareness about Arabs'' diverse and unique cultures, values, and customs within the entire Northeastern Community.', 'Arab Students Association at Northeastern University looks to create a space for students of Arab backgrounds, as well as those who seek to create connections with the Arab culture and world, to mingle and meet one another. We also look to bring all Arab students attending Northeastern University together and make them raise awareness of their diverse and unique cultures, values, and customs within the entire Northeastern Community. Also, the ASA will provide its members, both Arab and non-Arab, with the needed academic and career support in order for them to excel and succeed.', '999', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b95c5bf2-e75b-4af8-8f09-cf9ea9403c91', 'Armenian Student Association at Northeastern University', 'ASANU brings together Armenian students within Northeastern University and its nearby schools. It works to introduce Armenian history, language, music, dance, and current events to all its members in an effort to preserve the culture through education.', 'ASA brings together the Armenian students within Northeastern University. It introduces Armenian history, language, music, dance, current events, and food to all Armenian and non-Armenian members of the University. Additionally, ASA works closely with the ASA groups with other colleges in the Boston area including BU, BC, Bentley, MCPHS, Tufts, Harvard, and MIT, but we are not directly affiliated with them. + +If you are at all interested in joining or would like to learn more about what we do, please feel free to reach out to the E-Board at asa@northeastern.edu or find us on instagram @asanortheastern', '375', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4f9b1c4d-2f02-43d8-9d8c-b7ecebf423a1', 'Art Blanche at NEU', 'Art Blanche provides space for everyone to express their visions and ideas through art (painting, drawing, doodling, etc), aka weekly hang-out with other creative and artistic people. Skills & experience do not matter as long as you are open-minded.', 'Art Blanche is an art club at NEU that provides art enthusiasts unlimited options to express their creativity. We want to unite everyone interested in creating art and arrange a place where students can express themselves through any fine art. We welcome any 2D and 3D media. We want to give proficient artists a chance to improve their skills through communication and help from other fellow-artists. We will arrange "critique rounds," where we would discuss each other''s work and share tips and tricks. + +Apart from having proficient artists, we also welcome newcomers interested in learning how to do art and express their voice through the art form. By inviting professional artists and students to teach and lecture at our club, newcomers as well as more proficient artist will be able to develop and improve their own style. + +We will organize "life drawing " sessions to do figure studies. Having the Museum of Fine Arts right around the corner we will take advantage of it to seek inspiration for our own work by arranging visits and guiding a group discussion. + +At the end of each semester we will arrange student exhibitions presenting work created during the last months.', '638', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2d6b5173-0074-4a29-8b40-b99227344f63', 'Art4All', 'Art4All is committed to giving every student an equitable opportunity to foster their creativity. Our free Boston-based virtual mentoring programs and community partnerships view students first and foremost as creators, building more resources for all. ', 'Art4All believes the key to addressing these inequities relies on supporting students and their pursuits at the community and individual level. All our resources are tailored to incorporate the ACE model, which serves as the three main values of Art4All’s mission: accessibility, creativity, and education. Our free Boston-based virtual mentoring programs and community partnerships view students first and foremost as creators — each with unique and individual challenges that require personalized guidance and support. Art4All also organizes arts-based fundraisers and student exhibitions, giving students a quality means and open platform to confidently express their art to the communities. We work in collaboration with EVKids and other community partners. ', '88', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d8c815c1-b68f-4675-8ac8-70911ca7963f', 'Artificial Intelligence Club', 'Step into the world of artificial intelligence where learning knows no bounds. Join us to explore, create, and innovate through projects, discussions, and a community passionate about the limitless potential of AI and its responsible and ethical use.', 'Welcome to the Artificial Intelligence Club, where you can dive into the fascinating realm of artificial intelligence without any limits to your learning journey. Immerse yourself in a community driven by passion for exploring, creating, and innovating with AI through engaging projects and thought-provoking discussions. Here, we emphasize the boundless potential of AI while always ensuring its responsible and ethical use. Join us to be part of an exciting space where your curiosity and ideas are truly valued.', '208', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d4770261-f9a0-4edb-8c3e-0b7d413484cf', 'Artistry Magazine', 'Artistry Magazine is an online and print publication that features articles and student artwork related to any and all forms of art and culture. We welcome all into our community and encourage students to engage with the arts and the city of Boston.', 'Artistry Magazine is an online and print publication that features articles and student artwork related to any and all forms of art and culture. We welcome all into our community and encourage students to engage with the arts on Northeastern''s campus and throughout the city of Boston. We are always looking for talented writers, photographers, and designers to work on web content as well as the semesterly magazine. Check out our website and social media to learn more about the organization and how to get involved and click here to read our latest issue!', '981', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f2392921-48f8-49d7-aea2-fc645e16228d', 'Asian American Center (Campus Resource)', 'The Asian American Center at Northeastern seeks to establish a dynamic presence of the Asian American community at the University. The role of the Center at Northeastern is to ensure the development and enhancement of the University’s commitment to the...', 'The Asian American Center at Northeastern seeks to establish a dynamic presence of the Asian American community at the University. The role of the Center at Northeastern is to ensure the development and enhancement of the University’s commitment to the Asian American community. In providing the Asian American community a vehicle for increasing visibility on campus, the Center aims to support student exploration of social identity development and empower students to take an active role in shaping their experiences at Northeastern. To that end, the Center strives to promote continued dialogue on the rich diversity and complexity of the Asian American experience, and how that complexity manifests itself in various aspects of life within and outside of the University.', '778', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2963e562-891c-456e-a461-d7ea9174febe', 'Asian Pacific American Law Student Association', 'The Asian Pacific American Law Students Association (APALSA) is an organization for Asian American and Pacific Islander (AAPI) students at Northeastern University School of Law, including Native Hawaiian, Pacific Islander, South Asian, Southeast Asian...', 'The Asian Pacific American Law Students Association (APALSA) is an organization for Asian American and Pacific Islander (AAPI) students at Northeastern University School of Law, including Native Hawaiian, Pacific Islander, South Asian, Southeast Asian, East Asian, mixed-race and other students who identify under the AAPI umbrella. In addition to providing a social and academic support network for AAPI students at the law school, APALSA is active both in the Boston community and on campus. APALSA works with the law school administration and other student organizations, and is represented on the Admissions Committee and the Committee Against Institutional Racism (CAIR). Throughout the year, APALSA hosts various social, educational and professional events for both AAPI law students and law students in general.', '370', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8ea18cba-d416-4281-9bc8-af9552a87689', 'Asian Student Union', 'We are a student organization that strives towards culturally sensitive advising, advocacy, services, programs, and resources for the Asian-American students of Northeastern University as well as the neighboring area. ', 'We are a community that strives towards culturally sensitive advising, advocacy, services, programs, and resources for the Asian American students of Northeastern University as well as the neighboring area. This organization provides resources for prospective, current or alumni students, offering insight into the Asian American community and experience at Northeastern. We strive in promoting Asian American Spirit, Culture and Unity.', '73', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bd086043-40ad-4712-ab61-0b1590be9485', 'ASLA Adapt', 'Northeastern University''s only organization centered on landscape design! Advocate for climate action and environmental justice while exploring landscape architecture and adjacent topics.', 'Adapt is Northeastern’s organization centered on urban landscape design and the professional association for Landscape Architecture students. As a student affiliate chapter of the American Society of Landscape Architects (ASLA) we are working towards growing our department and getting it accredited, advocating for climate action and environmental justice, networking with environmental designers, and encouraging the adaptation of landscape architecture to our ever-changing world. Join us in exploring topics regarding landscape architecture, ecology, environmental science/engineering, urban planning, and related fields! An interest in the landscape is all that is needed to participate, all majors welcome!', '692', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a833d90f-8823-4a43-adba-0e8cc092a98e', 'Aspiring Product Managers Club', 'Aspiring Product Managers Club at Northeastern University aims to bring like-minded individuals who want to learn more about Product and eventually break into the Product Management domain.', 'Aspiring Product Managers Club at Northeastern University aims to bring like-minded individuals who want to learn more about Product and eventually break into the Product Management domain. + +Till today we have conducted 80+ events with 800+ participants where our events were broadly classified as – meetups, Mock Interviews, Workshops, Speaker Series, and Case Study. + +This spring 2024 semester, we plan to bring several upgrades to our flagship programs and several new engaging programs for our members! + +We are expanding and have started working on real-time products with members as product managers. Come join us to get a slice of a product manager''s life! + + ', '283', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b27ab19e-d197-4740-bbb9-e30535e44cac', 'Association of Latino Professionals for America', 'ALPFA, founded in 1972, stands for the Association of Latino Professionals For America. ALPFA is a national non-profit organization that has become the largest Latino Association for business professionals and students with more than 21,000 members na...', 'ALPFA, founded in 1972, stands for the Association of Latino Professionals For America. ALPFA is a national non-profit organization that has become the largest Latino Association for business professionals and students with more than 21,000 members nationwide (this includes 43 professional and over 135 student chapters). ALPFA serves as the catalyst connecting professionals with decision makers at Fortune 1000 partners and other corporate members seeking diverse opportunities. In addition, ALPFA has developed various events at a local and national level to prepare students from college to career-ready professionals through mentorship, leadership training and development, job placement and community volunteerism. ALPFA-NU was officially recognized in February of 2014 and has successfully become the first student chapter in the city of Boston to continue the growth of the organization with the mission to empower the growth of diverse leaders through networking, professional development, and career opportunities with our corporate sponsors.', '695', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('69be0953-8919-475f-a917-0515f261d421', 'Baja SAE Northeastern', 'NU Baja is a student-run competition team that designs, builds, and races a single-seat, off-road vehicle. Our team members learn valuable skills in design, manufacturing, and leadership. Visit our website to learn more and join the mailing list! + +', 'NU Baja is for anyone interested in learning by doing. We are a close-knit team that designs, builds, and races a vehicle from the ground up. Our team members learn the engineering design cycle, CAD, manufacturing techniques, management skills, and leadership qualities. We welcome new members at any experience level! + +Every year, our team races a high-performance vehicle in national Baja SAE collegiate design competitions. The challenges include rock crawls, hill climbs, and a grueling four-hour endurance race. We are a group of highly motivated (mostly) engineers that work together to create a vehicle capable of withstanding these obstacles and outperforming hundreds of other colleges from around the world. + +If this sounds like something that interests you, please sign up for our mailing list! Mailing List Signup + +Baja Promo Video', '536', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1a98a66f-9057-4921-9d40-7c8054b574f7', 'BAPS Campus Fellowship', 'BCF meets weekly for discussion based on BAPS Swaminarayan concepts and teachings. Students discuss topics that affect them in college and will be able to learn to balance their life as college student while practicing the Hindu faith.', 'Through youth group discussions, campus events, and community service projects, students will have the opportunity to introduce the Hindu faith to the rest of the NEU community!', '896', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b88022e2-6c10-4133-92ca-818d25168c34', 'Barkada', 'NU Barkada is NEU''s Filipino culture organization. Our mission is to promote diversity and fellowship by sharing the richness of Filipino heritage through member and community engagement in cultural, educational, and social activities.', 'Northeastern University''s Barkada began as a small group of Filipino/Filipino-American students who aspired to have their culture recognized at the university. They wanted to have an organization that united people who embrace Filipino culture and wish to spread it through cultural, educational, and social activities. With hard work, dedication, and the aid of their club advisor Dean Perkins, Barkada became an official NU organization on January 26, 1998. Throughout its years as an established student organization, NU Barkada has grown to become a bigger family than its founders had ever imagined. However, the organization still holds true to the guidelines and values set forth by its founders, and continues to build upon their strong foundation. "Barkada" is a word from the one of the main Filipino languages, Tagalog, which means "group of friends." We embrace each and every one of our members as not only friends, but family, as well. + +NU Barkada''s logo, from one aspect, resembles the Nipa Hut, a bamboo shelter built in the rural, coastal areas of the Philippines. Barkada, like the Nipa Hut, provides its members with support and is built to withstand adverse conditions, day-in and day-out. Sheltered within the Nipa Hut beneath the sun and the moon, the flag of the Philippines symbolizes the rich Filipino culture from which Barkada draws its roots. The logo also resembles two people, hand-in-hand, dancing Tinikling, a Filipino cultural dance. This encompasses one of the primary goals of NU Barkada, which is to educate others about the Filipino culture and try to bridge the gap that separates people from different walks of life.Keep up with us at all of our social medias, which are linked below! Peace, Love, Barkada! ❤️', '797', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3a43a2a4-1c7d-494a-b579-ec40bd54ae1d', 'Bee Society', 'A student organization dedicated to pollinator advocacy, bees, and beekeeping on campus.', 'We are a student organization that works closely with Facilities and Grounds, other student environmental groups, and the MassBee Association to promote pollinator interests and give Northeastern students the chance to suit up and join us at our club hive.', '112', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('590db4c5-efa3-4a2a-a843-d5284b0ae3ed', 'Best Buddies', 'College chapter of the Best Buddies International organization', 'Mission: The mission of Best Buddies is to enhance the lives of people with intellectual disabilities by providing opportunities for one-to-one friendships. We do this by matching college student volunteers in mutually enriching friendships with persons with intellectual disabilities.', '428', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a14ed6a2-38c9-48d7-9879-fcbda58a1653', 'Beta Alpha Psi', 'Beta Alpha Psi is an honorary organization for Accounting, Finance, and Management Information students and professionals from the College of Business. The primary objective of Beta Alpha Psi is to encourage and give recognition to scholastic achievement', 'Beta Alpha Psi is a national honorary organization for Accounting, Finance, and Management Information Systems students and professionals within the field of business. The primary objective of Beta Alpha Psi is to encourage and give recognition to scholastic and professional excellence in the business information field. This includes promoting the study and practice of accounting, finance and information systems; providing opportunities for self-development, service and association among members and practicing professionals, and encouraging a sense of ethical, social, and public responsibility. + + + +Please email neubap@gmail.com to be added to the contact list!', '256', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fc0914c5-38f3-47f9-a0f5-6f356e997d66', 'Beta Beta Beta', 'Beta Beta Beta (TriBeta) is a society for students, particularly undergraduates, dedicated to improving the understanding and appreciation of biological study and extending boundaries of human knowledge through scientific research. The organization off...', 'Beta Beta Beta (TriBeta) is an undergraduate honor''s society dedicated to improving the understanding and appreciation of biological study and extending boundaries of human knowledge through scientific research. The organization offers resources for students to further their paths in the many biological fields.', '586', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6347b395-430f-4724-ad78-58551eaca8f3', 'Beta Chi Theta', 'Founded on December 3, 2011, Alpha Alpha Chapter of Beta Chi Theta Fraternity Inc. believes in fostering brotherhood and creating leaders within the Northeastern University community. We are the nation''s premiere South Asian Interest Fraternity, and we...', 'Founded on December 3, 2011, Alpha Alpha Chapter of Beta Chi Theta Fraternity Inc. believes in fostering brotherhood and creating leaders within the Northeastern University community. We are the nation''s premiere South Asian Interest Fraternity, and were recently awarded recognition as the best chapter of Beta Chi Theta Fraternity nationally. The gentlemen of this chapter hold themselves to the highest, moral, professional, academic, and social standards. The brothers promote the six pillars of Beta Chi Theta: Brotherhood, Tradition, Service to Humanity, South Asian Awareness, Academic Excellence, and a Unified Nationwide Network in the world around us.', '320', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f21180bf-2ac2-4881-b979-7e4be312a7b1', 'Beta Gamma Epsilon', 'Founded in 1919, Beta Gamma Epsilon is Northeastern''s oldest fraternity. Exclusive to engineering and science majors, BΓE has a long and rich tradition at Northeastern and in Boston''s historic Back Bay district.', 'Founded in 1919, Beta Gamma Epsilon is Northeastern''s oldest fraternity. Exclusive to engineering and science majors, BΓE has a long and rich tradition at Northeastern and in Boston''s historic Back Bay district.', '607', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('97654d06-b860-4644-9054-05c09f04f259', 'Beta Theta Pi', 'The Eta Zeta Chapter of Beta Theta Pi''s mission is to cultivate a brotherhood of unsullied friendship and fidelity, which will assist, support, and guide their noble pursuits throughout their collegiate years and beyond.', 'https://vimeo.com/309675499 + + + +The Eta Zeta Chapter of Beta Theta Pi''s mission is to cultivate a brotherhood of unsullied friendship and fidelity, which will assist, support, and guide their noble pursuits throughout their collegiate years and beyond, commit to serve our University and surrounding communities through service, philanthropy, and leadership, establish a strong involvement with the Northeastern University community, hold the highest moral, academic, professional, and social reputation of excellence. + + ', '176', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8e7a984a-c091-4ec9-b529-12cab33fa494', 'Big Sister Boston Northeastern', 'The Big Sister Association of Greater Boston is one of 340 affiliated Big Brothers Big Sisters organizations across the country, but the only exclusively female-focused program. Join Northeastern''s Chapter for guidance to grow as Bigs together!', 'Big Sister Association of Greater Boston is one of 340 affiliated Big Brothers Big Sisters organizations across the country, but the only exclusively female-focused program. Big Sister Association of Greater Boston ignites girls'' passion and success through positive mentoring relationships with women and enrichment programs that support girls'' healthy development. Big Sister Boston Northeastern empowers femme students to become leaders by facilitating on-campus engagement opportunities, planning fundraising and recruitment events, and by discussing content that relates to women''s and girls'' interests.', '744', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('82c76098-e4f2-489b-b87d-098cbfc92d08', 'Biochemistry Club', 'Northeastern University Biochemistry Club provides professional, academic, and social events for those within the major or interested in the field. Events include guest speakers, panels, and social outings!', 'We''re excited to welcome you to the Northeastern University Biochemistry Club! We are dedicated to providing resources to those in the major and those who are interested in the field. Our bi-weekly meetings are a great way for members to network, learn about exciting graduate school and career opportunities following an undergraduate Biochemistry degree, and make meaningful connections with faculty, guest speakers, and fellow Biochemistry majors. At our meetings, we host co-op, career, and graduate school panels, a variety of guest speakers (faculty and industry), and more, and hold many social events. We''re excited to see you at our meetings this year, and please reach out to bcc.neu@gmail.com with any questions.', '984', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('64d4520d-4d0a-4bed-b9cc-1b3210b1f8bb', 'Bioengineering Graduate Student Council', 'The Bioengineering Graduate Student Council (BioE GSC) seeks to provide bioengineering graduate students with an enriched academic environment and sense of community amongst fellow students.', 'The Bioengineering Graduate Student Council (BioE GSC) seeks to provide bioengineering graduate students with an enriched academic environment and sense of community amongst fellow students. The primary focus of the BioE GSC is to provide social, scholastic, and administrative outlets to support students’ academic and career advancement.', '743', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6f5a74bd-6f89-47d2-8eb1-3f0c09eb27ac', 'Biology Club', 'The Biology Club is a great way to participate in fun biology-themed activities on and off campus, meet other students in the major, get graduate/medical school information, and find out about upcoming lectures and events around Northeastern.', 'The Biology Club is a great way to participate in fun biology-themed activities on and off campus, meet other students in the major, get graduate school information, and find out about upcoming lectures and events both here at Northeastern and at other institutions. We are involved in professional events such as co-op panels, guest speakers, and undergraduate research symposiums. We also put on fun events like museum outings, parties for Halloween, mixers with other universities, etc..', '883', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('252cac46-b5e5-4917-9737-f8fb468afaa9', 'Biomedical Engineering Society', 'This club is for students interested in Bioengineering. Students will meet their peers and learn about their opportunities as Bioengineers at Northeastern and post-undergrad. ', 'This club is for students interested in Biomedical Engineering in any capacity. We will work to educate and inspire students about opportunities in Biomedical Engineering.', '1020', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('97412c7e-d2e3-4019-b1ef-76b3ebcc4bcf', 'Bipartisan Disagreement', 'Bipartisan Disagreement is a student think-tank at Northeastern University that focuses on using different tools - in-person or virtual discussion, podcasting, and print - to bridge the divide between political parties and seek common ground. ', 'Bipartisan Disagreement is a student think tank at Northeastern University that uses a variety of tools - discussion, podcasting, and print - to bridge the divide between political parties and seek common ground. We encourage politically diverse, yet non-divisive conversation to help foster an understanding of different perspectives, rather than seeking to be “right.” + +Become a contributor on our website and follow us on Instagram for our polls, events,, and meeting updates!', '208', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('20083dc8-cbe0-45dd-b713-c3a2a63faa94', 'Black Athlete Caucus ', 'Northeastern University Black Athlete Caucus (NUBAC) seeks to represent the voice of Northeastern’s Black student-athletes, while diversifying & implementing change in Northeastern Athletics.', 'The Northeastern University Black Athlete Caucus (NUBAC) seeks to represent the voice of and bring exposure to the Black Athletic community at Northeastern. We strive to provide educational, community-building, and outreach opportunities while promoting our Black Student-Athletes and advocating for change within our athletic administration. Our vision, to create a support system and a safe space for learning and guidance, as well as to encourage our fellow Black Student-Athletes to network and form strong connections, all fall in line with NUBAC’s core values: Boldness, Leadership, Accountability, Collaboration, and Kindness. With this we hope to see powerful changes including more voices being understood and the pipeline of Black student athletes coming in and out of Northeastern feeling not only included at our University but have a true sense of belonging. With NUBAC we would heavily focus on giving back to our community/ getting involved with low-income schools, and also holding our institution/programs accountable for continuing the positive racial/social change at Northeastern. Our intended audience: Black student athletes at Northeastern University. We aspire to host events that include educational guest speakers, host fundraisers, collaborate with other programs for community nights, etc. We are creating a group where Black student athletes on campus will bed heard and be proactive.', '102', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4a8970d4-e043-43ee-b122-79df6d8d0201', 'Black Business Student Association', 'The Northeastern Black Business Student Association aims to promote excellence, enrichment, and engagement for its members through a business lens.', 'The mission of the Black Business Student Association (BBSA) is to connect and provide students with information, opportunities, and community to promote excellence, enrichment, and engagement through a business lens.', '299', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1b07929e-e312-4a84-a39a-f7fe09639262', 'Black Christian Fellowship', 'Black Christian Fellowship creates and cultivates the unique Black Christian experience on Northeastern’s campus. Through weekly meetings, service events, and other big events (Easter, Christmas, etc.), we gather to challenge and uplift each other.', 'The Black Christian Fellowship is geared towards creating and cultivating the unique Black Christian experience on Northeastern’s campus. As college students, the journey of faith is a hard one. We strive to create a welcoming community that centers Jesus in all of our efforts and events. Together, we learn and grow by challenging and uplifting each other to live Christ-like. We gather to study the Bible and use it as instructions for our daily living. BCF strives to build a comfortable, inviting, and non-judgmental environment for students to thrive. We aim for our efforts to leave a lasting impact on not only our members but the entire Northeastern campus and Boston community. As a Christian organization, one of our pillars is service. In our programs, we discuss the challenges we’ve faced and how we can go out into the community and help others overcome these obstacles. BCF provides a space where students can be comfortable to grow, challenged to give, and uplifted to prosper. ', '375', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('35e73f06-3d7e-4f6d-88c6-86ac5c40f64d', 'Black Engineering Student Society', 'The Black Engineering Student Society serves to provide an environment for minority engineers & STEM students to thrive academically, professionally, and socially at Northeastern. BESS is also a National Society of Black Engineers(NSBE) chapter.', 'The Black Engineering Student Society serves on the Northeastern campus to provide an environment for minority engineers & STEM students to thrive academically, professionally, and socially. We welcome students of different majors to join and benefit from our resources as well. BESS is also a chapter of the National Society of Black Engineers(NSBE).', '640', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('30713479-8e72-4bba-84b3-6eaa3f7f6008', 'Black Islamic Association', 'The Black Islamic Association is a club that is dedicated to providing a welcoming space to Black Muslims on campus.', 'The Black Islamic Association is a club that is dedicated to providing a welcoming space to Black Muslims on campus. It is quite easy to feel isolated and alone on a college campus of around 15,000 people, thus we believe it is important for every student to have an understanding support system on campus. BIA provides programming regarding shared personal experiences, Islamic lectures, and socials to ensure that club members create a community founded on compassion and reassurance. We also plan to educate members on the rich history Black Muslims have made in the Islamic world. We aim to hopefully carry this message not only within our community but to the surrounding Muslim communities to teach others about the big impact Black Muslims have made. ', '512', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6afb64d9-e319-4e32-95fd-7d8aad4d0af2', 'Black Law Student Association, Kemet Chapter', 'The Black Law Student Association-Kemet Chapter is committed to maintaining a safe-space and preventing the silencing of the voice and vote of students of Black-African descent that is inevitable with an integrated body. It is our mission to serve the ...', 'The Black Law Student Association-Kemet Chapter is committed to maintaining a safe-space and preventing the silencing of the voice and vote of students of Black-African descent that is inevitable with an integrated body. It is our mission to serve the NUSL and legal community by increasing educational and career opportunities for students of Black-African descent. Members are encouraged to help aid students of Black-African descent to achieve success and to prepare them to make choices over their lifetime in achieving their full potential in the legal profession. It is also our mission to support an environment of social camaraderie and preserve the rich cultural history of those members who came before us. Members are dedicated to recruitment, community involvement, and activism as a means to remedy the small number of students of Black-African descent. With this mission, the Kemet Chapter adheres to the following goals in addition to the aforementioned national goals: (1) To instill in attorneys of Black-African descent and students of Black-African descent a greater awareness of and commitment to the needs of the African-American and African Diaspora community, (2) To influence the legal community to bring about meaningful socio-economic change to meet the needs of Black-African and African Diaspora community, (3) To promote the hiring and retention of faculty and staff of Black-African descent, and (4) To provide and promote opportunities for students of Black-African descent to establish relationships within the greater legal community.', '1021', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6faaad9f-a15c-4b6b-a61e-85f58e6b898a', 'Blockchain@NEU', 'Blockchain@NEU is a student-led organization started in September 2021 whose mission is to cultivate an open community of thought leaders, researchers, and innovators to support the education and development of blockchain technologies.', 'Blockchain@NEU is a student-led organization started in September 2021 whose mission is to cultivate an open community of thought leaders, researchers, and innovators to support the education and development of blockchain technologies. We are fostering an open community across undergraduate, graduate, alumni, and industry professionals to build a Blockchain hub at Northeastern University.', '514', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f56c182b-95f4-47c9-9d59-91e43ebc3c79', 'Boston Health Initiative at Northeastern University', 'Boston Health Initiative is a student-led organization that works collaboratively with community partners towards advocating for health equity and providing health education in underserved Boston communities.', 'Boston Health Initiative is a student-led organization that works collaboratively with community partners towards advocating for health equity and providing health education in underserved Boston communities. Undergraduate volunteers will serve as BHI''s core workforce, utilizing their health content training, lived experiences, and perspectives to impact the future of those we serve. + +Our vision is to move towards a world where comprehensive, equitable health education is the standard, not an exception. BHI aims to work with non-governmental organizations (NGOs) and Boston Public Schools (BPS) to provide immersive, accessible programming for all individuals. + + ', '13', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6cafa98a-3b08-4460-a21c-cb25b8afa83e', 'Botanical Society of Northeastern University', 'The Botanical Society of Northeastern University aims to create a community dedicated to bringing together all those interested in the various aspects of plants and botany. The organization aims to promote the importance of nature, educate students on...', 'The Botanical Society of Northeastern University aims to create a community dedicated to bringing together all those interested in the various aspects of plants and botany. The organization aims to promote the importance of nature, educate students on environmental wellness, and bring together plant lovers for fun activities. Ultimately, the organization will work as a framework through which students may learn, share, create, and explore! + + + +If you would like to get in touch with us, the best way is to contact our email: nubsinfo@gmail.com', '299', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ba099964-2709-4907-9644-4e0d0cd5fd30', 'Brazilian Student Association at Northeastern University', 'BRASA Northeastern is dedicated bringing together the Brazilian community here at Northeastern, continuing to offer fun and professional events to link the community both socially and professionally.', 'The Brazilian Student Association (BRASA) was created in 2014 as the result of the actions of a group of Brazilian students studying in various American universities. This not-for-profit organization is dedicated to the Brazil''s development through the creation of platforms between our home country and students abroad. At its core, BRASA has proactivity, excelency, meritocracy, and commitment to Brazil. BRASA is currently present in over 90 universities in the United States, Canada, France, and the UK, and already has more than 7,000 members. + +Our goal moving forward is to continue to bring together the Brazilian community here at Northeastern, continuing to offer fun and professional events to link the community both socially and professionally. + +gobrasa.org', '545', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('53032ab1-d787-4528-bba0-cf5517df3ae0', 'Bull & Bear Research', 'Bull & Bear Research (BBR) was formed to empower a financial advantage through comprehensive industry, equity, and macroeconomic research at Northeastern University. ', 'Bull & Bear Research (BBR) was formed to empower a financial advantage through comprehensive industry, equity, and macroeconomic research at Northeastern University. The historic void of a quality research organization on Northeastern’s campus has meant that students lack an outlet to explore careers related to research. BBR provides a resource for students to foster growth in their qualitative and quantitative financial analytics skills. In addition, BBR takes on a unique role in the D’Amore McKim extracurricular ecosystem by providing research to the student-led funds on campus in a traditional buy-side role, enabling students to make more informed investment decisions. Our goal is to erode the barriers that traditionally encircle quality equity research accessibility and provide a differentiated growth opportunity for anyone interested in public markets, quantitative methods, and the broader world of finance.', '661', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('77c73388-0ddd-4907-b5b2-a056925e4a8a', 'Burmese Students Association of Northeastern University', 'We aim to foster an inclusive and welcoming community for students of Northeastern University students and serve as a place for both Burmese and non-Burmese Northeastern students who are interested in learning more about the unique culture and taste of...', 'We aim to foster an inclusive and welcoming community for students of Northeastern University students and serve as a place for all Northeastern students who are interested in learning more about the unique culture of Myanmar. Our organization’s focus will be on promoting awareness about Myanmar through its various events, providing networking opportunities and a sense of community for the members.', '898', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('977fb50e-bfd6-4fea-8aa7-8c71a7777209', 'Caribbean Students'' Organization', 'The Caribbean Students'' Organization, established in 1982, is a social and cultural group that caters to all diasporas but primarily to people of the West Indian Descent. The organization promotes Caribbean unity, cultural awareness, togetherness, ...', 'The Northeastern Caribbean Students'' Organization, established in 1982, is a social and cultural group that caters to all diasporas but primarily to people of West Indian Descent. The organization was formed in order to promote Caribbean unity, cultural awareness, togetherness, social interest, and academic excellence. We also encourage the fostering of friendships and association among students, and the academic development and achievement of all members. We provide a familiar environment and inclusive space for students from the Caribbean region, Caribbean parentage, or of Caribbean interest to share experiences and empathize with one another. Our slogan says it best: "Unity is strength, and our culture makes us one."', '297', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('60268d7e-5aaa-4553-a5fa-78b198dffc73', 'Catholic Student Association', 'The Catholic Student Association is an ever-growing spiritual group that has been described as ''a relevant down to earth community of college students.'' We provide a broad range of service, social, and spiritual activities to promote a personal and love.', ' + + + + + +The Catholic Student Association is an ever-growing spiritual family of college students. We provide a broad range of service, social, and spiritual activities to promote a personal and loving relationship with Jesus and the Catholic faith. We understand the profound spiritual journey is not to be taken lightly, and our community works in as many ways possible to be a guide, a support, and a friend for you on your personal trek with faith. + + + +The Catholic Center at Northeastern University stands as a sign of HOPE in Jesus Christ. With CHRIST-like care and LOVE for every PERSON, the Catholic Center BRINGS in students to know the faith, BUILDS up students to live the faith and SENDS out students to share the faith for the good of the WORLD, the growth of the CHURCH, and all for the glory of GOD! + + + +Register for our weekly emails here! + + + + + +', '198', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('59fe27cb-931e-4c46-a272-0a6f6aff113f', 'Center for Spirituality, Dialogue and Service (Campus Resource)', 'Welcome to the Center for Spirituality, Dialogue and Service, an important and exciting university initiative which builds on the successes of the former Spiritual Life Center and seeks to advance a new model of campus religious/spiritual programing, i...', 'Welcome to the Center for Spirituality, Dialogue and Service, an important and exciting university initiative which builds on the successes of the former Spiritual Life Center and seeks to advance a new model of campus religious/spiritual programing, interfaith and intercultural dialogue, and civic engagement for global citizenship. This website is currently under construction. Please contact the new center Executive Director, Alexander Levering Kern, to learn more about our programs. To join our email list for program updates, or to inquire about group use of the Sacred Space or Reflection Room, please visit our website and fill out the electronic forms at www.northeastern.edu/spirituallife To learn about worship services and opportunities with Northeastern’s religious communities, please contact Hillel, the Catholic Center, the Islamic Society of Northeastern, the Lutheran-Episcopal Ministry, and our other groups. The Sacred Space and Reflection Room in Ell Hall are available for your individual prayer and reflection. We look forward to welcoming you and working with you.', '527', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('09584e54-ab26-4984-9c33-42891bf3326e', 'Chabad at Northeastern University', 'Chabad at Northeastern University, part of the world-wide network of Chabad on Campus, is dedicated to furthering the understanding and observance of Jewish traditions to all, regardless of their background.', 'Chabad at Northeastern University, part of the world-wide network of Chabad on Campus, is dedicated to furthering the understanding and observance of Jewish traditions to all, regardless of their background. In the spirit of the teaching and example of the Lubavitcher Rebbe, Rabbi Menachem M. Schneerson, we try to assist others in whatever capacity possible. At Chabad, our Shabbat, holiday programs, classes, events, and the general atmosphere are all geared to make college students feel at home. Come socialize in a comfortable and home-like setting, with friends, food, and discussion. Relax in our warm and welcoming home, where you are free to explore your Jewish heritage in a nonjudgmental and friendly atmosphere. Founded on strong personal relationships, Chabad educates and empowers you to live the Joy of Judaism. Through the many social activities we provide, you can gain a deeper understanding and appreciation of your heritage, in a fun and interactive way.', '848', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e559f504-8b9a-4bba-9823-eba61794b7d5', 'Changing Health, Attitudes, and Actions to Recreate Girls', 'CHAARG is a nationally backed health and wellness organization with chapters across the country with the goal of female empowerment through fitness. We focus on healthy living + creating a supportive environment for women to explore fitness.', 'CHAARG was founded in 2007 at Ohio State University, and since then has spread to over 100 universities across the country. CHAARG''s main goal is to "empower women through fitness" and prove that fitness can, and should be fun. In order to do this, we host weekly workout events for our members as well as wellness events, social events, and smaller group meetings to promote health + wellness as well as create a sense of community on campus. We partner with studios such as equinox, flywheel, crossfit, and more in order to expose our members to different types of workouts and help them "find their fit".', '563', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8918e5df-e641-4ec3-8fa5-0112b15a5857', 'Cheese Club', 'Cheese Club is an organization to promote the knowledge of the production, consumption, and importance of everybody''s favorite food, cheese. We cover cheeses from around the world, from different animals, and different ways to eat and display cheese.', 'Yes, it’s exactly as it sounds: + +Cheese Club is a club where we learn about and eat delicious cheeses every week. Join us weekly on Thursdays at 8pm (meeting rooms are posted on our Instagram @nucheeseclub and our newsletter) where we’ll introduce a new curated selection of some popular favorites, niche picks, and funky options for more adventurous members to try. The club is open for anyone and everyone looking for a low key, casual event and great people to meet and socialize with. We hope to see you soon!', '367', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('852114f4-a6e2-498e-ba3d-23afaee23052', 'Chemical Engineering Graduate Student Council', 'The Chemical Engineering Graduate Student Council (ChemE GSC) is a committee of your peers appointed to enhance the overall experience for chemical engineering graduate students at Northeastern University by promoting both on and off campus student act...', 'The Chemical Engineering Graduate Student Council (ChemE GSC) is a committee of your peers appointed to enhance the overall experience for chemical engineering graduate students at Northeastern University by promoting both on and off campus student activities and networking throughout the entire department. We also work with the department faculty to offer recommendations on academic improvements to our graduate program.', '681', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('08289f56-0322-4ef4-a67d-ce0f08819c9a', 'Chi Epsilon', 'Chi Epsilon is the National Civil Engineering Honor Society in the United States. We honor engineering students who have exemplified the principles of "Scholarship, Character, Practicality, and Sociability" in the civil engineering profession.', 'Chi Epsilon is the National Civil Engineering Honor Society in the United States. We honor engineering students who have exemplified the principles of "Scholarship, Character, Practicality, and Sociability" in the civil engineering profession. + +Our members are civil and environmental engineering students in the top of their classes graduating within the next two years. + +We provide tutoring year-round as well as FE review sessions in the fall. Please contact nuchiepsilon@gmail.com for tutoring requests or questions about FE review sessions.', '154', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d72ab90a-4cc4-437e-a7d9-4ad881ccd042', 'Chi Omega', 'Founded in 1895 at the University of Arkansas, Chi Omega is the largest women''s fraternal organization in the world with over 345,000 initiates and 180 collegiate chapters. Throughout Chi Omega''s long and proud history, the Fraternity has brought its m...', 'Founded in 1895 at the University of Arkansas, Chi Omega is the largest women''s fraternal organization in the world with over 345,000 initiates and 180 collegiate chapters. Throughout Chi Omega''s long and proud history, the Fraternity has brought its members unequaled opportunities for personal growth and development. As a Chi Omega, you will have fun, grow, thrive, and achieve success. Chi Omegas are well balanced women who are involved on their campuses and in their communities. As a prominent national women''s fraternity, Chi Omega provides countless opportunities for fun and friendship during college and beyond.', '449', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9d763d47-1b04-40aa-9330-e55d6afb5640', 'Chinese Christian Fellowship', 'Welcome to Northeastern University Chinese Christian Fellowship (NUCCF). We serve to help students know and learn about Christianity, and to provide a Christian faith gathering for students and staff. We welcome everyone regardless of your background o...', 'Welcome to Northeastern University Chinese Christian Fellowship (NUCCF). We serve to help students know and learn about Christianity, and to provide a Christian faith gathering for students and staff. We welcome everyone regardless of your background or religion.', '921', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ccda223b-81e7-4d9e-96e3-d0031e997b3f', 'Chinese Student Association', 'The Chinese Student Association is a student organization that supports awareness of Chinese and Chinese American culture. As a group, we strive to unite students interested in Chinese American heritage and to give their voices representation in the No...', 'CSA, or the Chinese Student Association, was founded in 2012 with the purposes of unity, exploration, enrichment, community, and chilling out and having fun! We unite students interested in the Chinese American identity, explore traditional Chinese and Chinese American culture and heritage, enrich student life through meaningful events and relationships, foster a sense of community and provide a voice to those who identify within that community, and also provide an enjoyable space where students can escape the everyday stresses of school and work. To do this, we pride ourselves especially on the fun, yet educational, events and general meetings that we hold and on our robust family system. We invite people of all backgrounds to join the Chinese Student Association. + + + +We invite you to check out https://northeastern.edu/csa/ or linktr.ee/nu_csa, where our socials and the links to our newsletter and Google Calendar are easily accessible. Our website also has more information about our purpose, history, and executive board. + + ', '859', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6332bde1-4212-4958-bf76-fcf8bc3e7892', 'Chinese Students and Scholars Association', 'The object of Northeastern University Chinese Students and Scholars Association (hereafter referred to as NUCSSA) is to unite and help Chinese students and scholars registered in Northeastern University, and promote the culture communication between Ch...', 'The object of Northeastern University Chinese Students and Scholars Association (hereafter referred to as NUCSSA) is to unite and help Chinese students and scholars who will study or are studying in Northeastern University, and our Chinese alumni, and promote the culture communications between Chinese community and other culture groups. Please visit our website for more introduction, events and additional information at https://www.nucssa.org/ in Simplified Chinese.', '686', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1cec5bce-1a6b-45e2-b5fd-a06beec2261c', 'Circle K', 'Circle K International is the college-level branch of the Kiwanis International organization. We are a community service group that serves our community in as many different ways as possible while having fun doing it!', 'Circle K International is the collegiate version of the Kiwanis International organization. We are a community service organization that helps connect Northeastern students to service partners across the city. We help provide the people power that organizations need to achieve their top goals! + +Some of the in-person service partners we work with are Community Servings, BalletRox, Fenway Community Center, and Women''s Lunch Place. We also started offering virtual service opportunities such as transcribing historical artifacts with the Smithsonian and donating rice through Free Rice. During the 2021-2022 service year, Northeastern Circle K completed over 1,000 service hours - even throughout the COVID-19 pandemic! + +We meet every other week on Thursdays at 6 PM EST - join the Engage page to be added to our email list, and visit our website to learn more about our club and the service we engage in throughout Boston.', '261', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1f61f2ea-7ecc-4779-ab87-f705ecd19e30', 'Civil & Environmental Engineering Graduate Student Council', 'We are here for students and the community.', 'The purpose of the Civil & Environmental Engineering Graduate Student Council (CEE GSC) is to enhance the visibility of resources and create a greater sense of community within the Department of Civil and Environmental Engineering. We aim to be a bridge that unifies all CEE concentrations in a way that fosters fellowship - collaboration in academic and non-academic settings through sharing of cultures, research, and general interests. + +CEE GSC organizes a series of recurring events that include but are not limited to social functions, cultural functions, and informational sessions. Social functions include game nights and socials that bring together students for food and games, typically around the holiday periods (e.g. Semester Kick-off, Valentines Day, Halloween, Finals Week, etc). Examples of cultural functions are the celebration of Chinese New Year and Holi, where students are encouraged to bring food and share the importance of such events. Informational sessions include dispersal of information between students and administrative staff that result in town halls and new student question and answer sessions. All events create a more unified, friendly, and well-functioning department and CEE GSC provides a way for all members of our community to come together and establish lifelong friendships and resources. + +In addition, we serve as an informational avenue to communicate the needs of the student body to department administrators and faculty/staff. Through all of our events, we are able to listen to questions and concerns brought by students and convey them in a way where change can be effective, whether that is being a resource, connecting the correct parties, or supporting with follow up action items. An example is student concern about programming abilities, which has resulted in reoccurring programming workshops.', '645', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('af748daa-e6e1-4fe5-805a-6cfb4979f58e', 'Clay Cave', 'The Clay Cave is an open ceramics studio designed for students who want the opportunity to learn using clay through different mediums. All are welcome to try ceramics and make your own art to keep for personal use or gifts. No prior experience necessary!', 'The Clay Cave is an open studio for ceramics designed for students and faculty who want the opportunity to learn ceramics through different methods of using clay. No experience is required to join! There will be a lesson plan with projects that set members of the club up with fundamentals that are key to being a ceramicist. A full range of different projects will provide members a foundation in which they will be able to pursue whatever project seems interesting to them, whether that be hand-building pots, throwing pots on the wheel, sculpting, or even the chemistry behind glazing pots. For those with previous experience in the field, they can create whatever they desire and set up their own plans for projects. This is an experience beneficial to students of all groups because art uses a completely different part of the brain, allowing for a change in headspace and a break from an otherwise demanding and stressful workday. With this new productive hobby, the Clay Cave will certainly be your home away from home! The studio is meant to be a safe space and a place where there are no wrong answers or projects. Finally, at the end of each semester, we will hold an open ceramics gallery in which individuals can display their craftsmanship. + +Join our very own discord channel at https://discord.gg/SGj9t3QvVn !', '590', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f79d7003-0acb-4289-8b1f-cf6ee3aa81b9', 'Climbing Team', 'The Northeastern Climbing Team is the official competitive rock climbing team sanctioned through Northeastern University Club Sports. The team continues to flourish as the best in the northeast division.', 'The Northeastern Climbing Team is the official competitive rock climbing team sanctioned through Northeastern University Club Sports. Founded in 2014, the team continues to flourish with the highest ranking in the northeast division. + +Our 24-person team currently trains at the Central Rock Climbing Gyms in Watertown, Cambridge, and Randolph, MA. Tryouts are held during September for the fall semester and are open to all undergraduate or graduate students. The team competes in the Northeast Region of the USA Climbing Collegiate Series, as well as participating in other local competitions. + +In addition to competition-related endeavors, Northeastern Climbing Team members give back to the community through volunteer events and outreach. The team has partnered up with organizations such as The Access Fund and One Summit to facilitate a positive impact in the community, and is continually pursuing ways to do so on the local and global scale. + +Club Climbing is dedicated to its core principles of supporting climbers of all backgrounds in the world of competitive climbing. ', '497', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b493b28b-c86c-4623-ac56-0cc42cda3cd9', 'Club Baseball', 'The Northeastern University Club Baseball team is a competitive intercollegiate organization at the D1 National level. The program was established in the Fall of 2005. In its history, the team has won a National Collegiate Baseball Association (NCBA) ..', 'The Northeastern University Club Baseball team is an intercollegiate organization competing at the D1 National level. The program was established in the Fall of 2005. In its history, the team has won a National Collegiate Baseball Association (NCBA) National Championship, as well as three New England Club Baseball Association (NECBA) championships. To learn more about the team please contact nuclubbaseball@gmail.com with questions.', '430', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ab164b35-9ec3-4d2b-8007-92081c1f1343', 'Club Esports at Northeastern University', 'Northeastern Club Esports is an organization housing all of the Competitive Esports titles at Northeastern. Various games are available such as Rocket League, Valorant, Overwatch, League of Legends, and several others.', '*** IMPORTANT ***If interested, please join a connected discord server using this link: linktr.ee/gonuesports + +Tryouts and all other club information will be through these servers. Thanks! + +https://www.youtube.com/watch?v=VqTKboT84qM', '608', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('76a52892-f13b-40a9-8dd3-b0bb71243d90', 'Club Sailing Team', 'We are a COED team that competes in the intercollegiate sailing association. ', 'We are a team that competes in the intercollegiate sailing association.', '546', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a09e48ca-4bd7-42b5-8921-6f8b9cbe3e05', 'Code 4 Community', 'C4C is a student organization at Northeastern focused on developing and maintaining software solutions for non-profits in Boston. We empower our members via workshops, while enabling them to connect with, give back to, and support the local community.', 'Code4Community (C4C) is a student organization at Northeastern University focused on developing and maintaining software solutions for non-profit organizations within Boston. We empower our members via mentoring and workshops, while enabling them to connect with, give back to, and support the local community they live in. C4C strives to deliver work engineered with excellence and led by inclusive design principles to ensure our solutions are intuitive, performant, and deliver the best user experience.', '143', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4bb4dd74-837b-471a-bd32-fbaabd5988e4', 'COE PhD Council', 'The COE PhD Council is the official PhD student-led liaison between the PhD students of the Northeastern COE and the administrative body of the COE.', 'We are a student organization dedicated to fostering a sense of community among STEM enthusiasts. Our mission is to bring together students from various engineering disciplines, creating a vibrant space for collaboration, networking, and shared experiences. Through a series of engaging events, workshops, and social gatherings, we aim to strengthen the bonds within our diverse community, encouraging cross-disciplinary interactions and knowledge exchange. Join us as we embark on a journey to unite the brilliant minds of the College of Engineering, forging connections that transcend academic boundaries and enhancing the overall STEM experience for every student. Together, let''s build a supportive and inclusive community that propels us towards success in our academic and professional pursuits.', '273', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('35cd3be1-3bf2-4205-aca9-616ff954b153', 'College of Science Student Diversity Advisory Council', 'COSSDAC intends to create an inclusive community for diverse undergraduates who identify as underrepresented in the sciences and offer resources for academic, professional, social and post-graduate success.', 'COSSDAC intends to create an inclusive community that supports and strengthens undergraduates who identify as underrepresented in the sciences, connecting all members of diverse groups (race, learning abilities, gender, ethnicity, sexual orientation) whilst providing academic, professional, and post-graduate resources. Through the construction of a space where others can create change; we aim to craft a legacy, adding to the roads by which students can find interpersonal support among advisors, garner perspectives from their peers, play an active role in the community that surrounds us, and begin to take advantage of the opportunities afforded to them. Cultural inclusion is the root of understanding and progress, and thus, we aim to empower today''s students to become the leaders of science of tomorrow.', '551', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('dab66b71-5760-42a0-906a-07a1a50d9144', 'ColorStack at Northeastern University', 'A supportive organization created to help Black & Latinx Computer Science Students to complete their degrees and gain rewarding technical careers.', 'The ColorStack chapter at Northeastern University, an organization that focuses on increasing the number of successful Black and Latinx computer science students. The initiatives include providing academic and professional support, as well as social and community engagement opportunities, to support access, placement, retention, and attraction at all levels. Through ColorStack, the goal is to make a meaningful difference in the lives of Black and Latinx students and improve representation in the technology industry. The belief is that by providing support and resources to these individuals, a more diverse and inclusive industry can be created that benefits everyone. Ultimately, the goal is to contribute to a more just and equitable society where everyone has the opportunity to succeed and thrive.', '146', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2d151ef0-938d-4aeb-8407-f66f3b606aa4', 'Computer Science Mentoring Organization of Northeastern University', 'The Computer Science Mentoring Organization (CoSMO) is open to all Northeastern students interested in Computer Science. This organization serves to better connect various majors, combined majors, minors and non-majors who have a passion for Computer S...', 'The Computer Science Mentoring Organization (CoSMO) is open to all Northeastern students interested in Computer Science. This organization serves to better connect various majors, combined majors, minors and non-majors who have a passion for Computer Science. The main function of this club will be to matching mentors and mentees together, as well as provide events and workshops to help students connect with their peers. Such events could include, but would not be limited to: student panels regarding different majors, co-ops, or research, student-lead workshops on various technical skills, and non-academic affinity events to better connect students outside the sphere of classes. + + + +Join our mailing list to keep updated to our upcoming events!', '865', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('dc3ce9ed-d64d-45a7-b962-f9756259ba2c', 'Consulting & Advisory Student Experience', 'The purpose of this organization is to provide students with the training, resources, experience, and knowledge to pursue co-op and full-time positions in consulting and advisory services.', 'The Consulting & Advisory Student Experience (CASE) is a student-run undergraduate organization that provides insightful presentations, events, workshops, and other activities to help students learn more about, engage with, acquire and practice the skills required to excel in the consulting industry. CASE serves as a forum connecting Northeastern students from all majors with professionals in the industry, faculty members, and Northeastern alumni to equip our members for careers in consulting. Furthermore, CASE establishes partnerships with firms and current professionals to explore further consulting opportunities.', '51', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e25ec7c0-2652-4409-ba77-b7d01d976bd1', 'Coptic Orthodox Student Fellowship', 'This club will serve as a meeting space for all Orthodox (Coptic Orthodox students are the main audience, but all other Orthodox students are encouraged to come) students to pray and discuss topics relevant to their faith and culture.', 'The Coptic Orthodox Student Fellowship serves all of Northeastern University’s Orthodox Students. The organization was created by Coptic Orthodox students, but we welcome all other Orthodox students (Oriental Orthodox*, Eastern Orthodox, and Greek Orthodox). We also welcome all other students interested in the Coptic Church culture, faith, and history. + + + +* By Oriental Orthodox, we are referring to the Armenian Apostolic Church, the Syriac Orthodox Patriarchate of Antioch and All the East, the Malankara (Indian) Orthodox Syrian Church, the Ethiopian Orthodox Tewahedo Church, the Eritrean Orthodox Tewahedo Church, and of course the Coptic Orthodox Church of Alexandria. + + + +—— + + + +In our meetings, we pray and discuss topics relevant to our faith. We gather weekly for prayer, worship, and Bible study, make memories together, and share in the blessings of spiritual outreach and community service. We attend and pray the Divine Liturgy at the St. Paul & St. John Chrysostom Coptic Orthodox Church of Boston currently located at 5 Park St.', '755', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('86219681-e680-4f36-a7a9-95d281afe244', 'Council for University Programs', 'CUP is the official programming board providing campus-wide entertainment for the Northeastern University student body. We are run by students, for students. + + + +We plan the majority of events on campus, including Springfest & Homecoming!', 'CUP is the official programming board providing campus-wide entertainment for the Northeastern University student body. We are run by students, for students. + +We plan a wide variety of events on campus, including Northeastern''s signature Springfest Concert (Drake, Snoop Dogg, Charli XCX anyone?) and Homecoming Headliner (Dan Levy & Annie Murphy, Ali Wong, Hasan Minhaj). We also plan regular FREE events throughout each month such as concerts, showcases like comedy shows, Q&As, and drag shows, and many other special events! + +We have a very open and welcoming environment, there are no fees or applications to join, no penalty for missing meetings, we just want to give everyone the opportunity to learn about the entertainment industry and booking process, and make some pals along the way :) + +All we ask is that you sign up for our newsletter if you want to be notified about events on campus. Sign up here!', '490', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c4f8b6ff-eef0-43da-9167-0ceef9720e94', 'Criminal Justice Student Advisory Counsel', 'CJSAC is a student group open to students of all majors designed to enhance the Criminal Justice major and also to act as a liaison between students and faculty. We discuss current events in the field of criminal justice and the impact that they have o...', 'CJSAC is an organization open to students of all majors designed to enhance the Criminal Justice major and diversify the voices involved in discussions around our justice system and policing, through experiential learning, speaker series, investigating and analyzing criminal and civil cases, and diving into the inner workings of the Boston criminal justice system, By expanding the mission of the School of Criminology and Criminal Justice, CJSAC builds a wider network for students to take full advantage of their time at Northeastern. Events we host include documentary screenings, self-defense classes, LSAT Prep information, courthouse tours, and much more.', '47', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a2e169ec-3450-4c8e-a1be-ad25f04a9fc9', 'Criminology Forensic Science and Neuropsychology of Criminal Minds Club of Northeastern University', 'A club for anyone (all majors welcome) with interests in criminology and forensic science! We welcome a wide range of topics and interests and plan on holding events that range from guest speaker seminars to criminal TV game nights! ', 'Our club seeks to bring together people who share interests in the realm of criminology. This can include students pursuing degrees in criminal justice, psychology, behavioral neuroscience, biology, chemistry, biochemistry...or really anyone with aligning interests! We welcome a wide range of topics and interests within criminal justice and forensic science and plan on holding events that range from guest speaker seminars to criminal TV game nights.', '97', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5766548c-7b8c-4f51-ac1c-42a3b465613b', 'Criminology-Criminal Justice Graduate Student Association', 'For graduate students in the School of Criminology and Criminal Justice to:1. Engage in improving knowledge and scholarship through active engagement in and dialogue with the Northeastern and Boston communities.2. Facilitate strong relationships...', 'This organization serves all masters and doctoral students in the School of Criminology and Criminal Justice. We seek to (1) Engage in improving knowledge and scholarship through active engagement in and dialogue with the Northeastern and Boston communities, (2) facilitate strong relationships through a social network for students invested in the field of criminal justice and criminology, (3) foster a healthy graduate student culture in which students can develop academically as well as professionally, learn, and establish long-lasting relationships with fellow students and faculty, (4) advance contribution to the field through service and scholarly achievement, and (5) establish a united environment and integrated forum of expression and growth for future leaders in criminology and criminal justice', '157', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('95b13530-00b8-44d2-a5ec-a4107aa432cc', 'Cruelty-Free Northeastern', 'Cruelty-Free Northeastern (CFN) is a student-led organization focused on creating conversation about vegan living. Anyone who is curious about veganism or the plant-based movement is welcome! ', 'Cruelty-Free Northeastern (CFN) is a student-led organization focused on elevating discourse around vegan living. Our organization is dedicated to providing a safe space for anyone to learn more about the different aspects of veganism, and why it is not only a moral imperative, but essential in order to mitigate climate change, environmental degradation, future pandemics, antibiotic resistance, and racial and social injustice. We welcome students of all backgrounds. + +We also have a focus on advocacy, with a dedicated team. Our team is currently hard at work on an initiative to increase plant-based choices at Northeastern and the Boston area and creates social media content that shares information related to the vegan movement. + +In the past, we have hosted potlucks, restaurant outings, guest speakers, documentary showings, and more. We have also worked with other activism organizations and plant-based businesses. + +We welcome anyone to join, regardless if you''re vegan, vegetarian or an omnivore. + +Join our mailing list + +Follow us on instagram', '760', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8c6259cb-9198-42e0-b84c-69ba32830aa6', 'CSC Game Room', 'The Curry Student Center Game Room', 'The Curry Student Center Game Room', '780', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('64003b38-b495-4e6f-b5d9-1e97ef6829d7', 'CSI Test Organization', 'This is a test account for CSI.', 'This is a test account for CSI. + + + + ', '323', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2dcdd4a8-4c6d-4def-8268-4726be585821', 'Data Analytics Engineering Student Organization', 'DAESO is a graduate program based student organization. We want to build a platform where students from all disciplines can come and learn more about the fields of data analytics, data engineering and data science for career or academic purpose.', 'The purpose of DAESO is to build a platform where students from all disciplines can come and learn more about the fields of data analytics and data science. The organization seeks to mentor incoming students about the course, provide a constant support for all the current students with their curriculum, enhance their knowledge of the applications of data analytics in the real-world industry and develop a network of professionals in the industry that students can reach out to. Student members will learn the different career paths in analytics like data science, data analytics, data engineering and business intelligence and how best they could shape their profile to set their foot and thrive in the industry. Lastly, we aim at spreading awareness of the Data Analytics Engineering program at Northeastern.', '40', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('98ff28fb-ab4c-4f99-8f7e-10e7d71113ea', 'DATA Club', 'To promote data literacy in all disciplines', 'DATA Club provides speakers, workshops, data challenges, and overall support for students to pursue their interests in data.', '302', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('063a13a8-0dcd-4d5b-9191-24cd426b17ed', 'Delta Alpha Pi International Honor Society', 'Delta Alpha Pi is an honor society dedicated to recognizing the academic achievements of students with disabilities. The purpose of the society includes raising disability awareness within the university and the surrounding communities.', 'Delta Alpha Pi is an honor society dedicated to recognizing the academic achievements of students with disabilities. The purpose of the society includes raising disability awareness within the university and the surrounding communities. We meet every other Monday at 7 PM throughout the fall and spring, in EV 102. + + + +***Due to Coronavirus, we will not be hosting meetings for the rest of Spring 2020***', '343', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('03650e7d-8909-4608-b6bf-b29abf62c689', 'Delta Kappa Epsilon', 'The Nu Alpha Chapter of the Delta Kappa Epsilon International Fraternity. + + + +Founded on June 21st, 2019. + + + +Where the candidate most favored is equal parts gentleman, scholar, and jolly good fellow. + +', 'The Nu Alpha Chapter of the Delta Kappa Epsilon International Fraternity. + +Founded on June 21st, 2019. + +Where the candidate most favored is equal parts gentleman, scholar, and jolly good fellow.', '436', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('38de0f70-3e05-4f81-9e59-69d3fb27b5bc', 'Delta Phi Epsilon', 'Phi Eta Chapter of Delta Phi Epsilon Sorority. Chartered 1969 on Northeastern''s campus. Founded on the principals of Sisterhood, Justice and Love.', 'Phi Eta Chapter of Delta Phi Epsilon Sorority. Chartered 1969 on Northeastern''s campus. Founded on the principals of Sisterhood, Justice and Love. + + ', '884', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ec436418-2545-4197-8a14-69cdd5127e8a', 'Delta Sigma Pi', 'Delta Sigma Pi is a professional fraternity organized to foster the study of business in universities; to encourage scholarship, social activity, and the association of students for their mutual advancement by research and practice.', 'Delta Sigma Pi is a professional, co-ed, business fraternity for Business and Economic majors at Northeastern. Our four pillars are professional activities, scholarship, community service, and social activities and we plan different events in each of these categories throughout the year. We are able to combine a life-long brotherhood and professional network with business development. For more info just send us a message! + +-------------------------------------------------------------------------------------------------------------- + +Organization Mission Statement: Delta Sigma Pi is a professional fraternity organized to foster the study of business in universities; to encourage scholarship, social activity, and the association of students for their mutual advancement by research and practice; to promote closer affiliation between the commercial world and students of commerce, to further a higher standard of commercial ethics and culture for the civic and commercial welfare of the community.', '177', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a3cc4d9d-e0b4-4d14-80d1-3bf2031e1ccd', 'Delta Sigma Theta Sorority, Incorporated', 'Delta Sigma Theta Sorority, Incorporated was founded on January 13th, 1913 on the campus of Howard University by twenty-two young and determined undergraduate women. Their vision was to promote a better enriching world of social welfare, academic excel...', 'Delta Sigma Theta Sorority, Incorporated was founded on January 13th, 1913 on the campus of Howard University by twenty-two young and determined undergraduate women. Their vision was to promote a better enriching world of social welfare, academic excellence, and cultural enrichment while de-emphasizing the social side of sorority life. The Iota Chapter of Delta Sigma Theta Sorority, Incorporated, formally known as the New England Chapter, was the first chapter of any black sorority in the New England Area. Iota chapter was chartered on December 29, 1921, and it is the ninth chapter of the sorority. The sorority’s First National President, Sadie T.M. Alexander, and Virginia Alexander came from Grand Chapter in Washington, D.C. to initiate the women who had hopes of becoming members of Delta Sigma Theta Sorority, Inc. Iota Chapter was initially a mixed chapter that consisted of undergraduate and graduate women. The chapter’s charter includes, Berklee College, Boston University, Emerson College and Northeastern University.', '861', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0ab8dd8e-c49d-4587-a94c-0840547c14f3', 'Delta Tau Delta', 'Delta Tau Delta is a values-based organization and fraternity. Our mission and values are offered to the public as a representation of the core values contained in our Ritual. All Delt men live by a common mission: "Committed to Lives of Excellence."', 'Delta Tau Delta is a values-based organization and fraternity. Our mission and values are offered to the public as a representation of the core values contained in our Ritual. All Delt men live by a common mission: "Committed to Lives of Excellence." All programs offered by the Fraternity reflect our values, and are designed to help the men of our Fraternity reach the level of excellence for which we all strive. Here at Northeastern University, Delta Tau Delta was Chartered in March of 2014. As a Fraternity, we strive to uphold our values and commit to our own mission statement here at Northeastern, "Committed to a Higher Standard"', '649', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('880afe62-9636-4519-aac9-e897cb6c07e7', 'Delta Zeta Sorority, Xi Upsilon', 'The Delta Zeta Sorority was founded nationally in 1902 and locally at Northeastern University in 1989. We were founded on the principles that make up our six pillars: sisterhood, social, service, scholarship, standards and self. Every day, we strive to...', 'The Delta Zeta Sorority was founded nationally in 1902 and locally at Northeastern University in 1989. We were founded on the principles that make up our six core tenants: generosity, belonging, empowerment, friendship, citizenship, and curiosity. Every day, we strive to live our lives regarding these values. Through sisterhood activities, social events, and an academic mentoring program we continuously strive to achieve excellence in each other and ourselves. Xi Upsilon prides itself on our strong bonds of an incomparable sisterhood and a balanced life.', '1', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('906332c9-4835-4e7a-be9f-28e242ab7837', 'Department of Marine and Environmental Sciences Terra Society', 'The Terra Society organizes events that supplement our members’ education in the Earth & Environmental sciences.', 'The Terra Society organizes events that supplement our members’ education in the Earth & Environmental sciences. We provide students with a chance to work with professors in the Earth & Environmental Sciences department and network with students in similar disciplines. Past Terra Society programs have included field trips, potlucks, hosted speakers, and professor presentations that aim to broaden our knowledge of the natural world. The Society is open to all students and welcomes anyone interested in the areas of ecology, environmental science, marine science, geology, environmental studies, and sustainability.', '362', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0d63d8d3-774c-4887-abd2-ca62c3c92b7e', 'Digital Illustration Association', 'A welcoming, open-minded community that fosters passion for digital illustration for all levels of experience and connects artists to patrons. We support each other through drawing parties, art challenges, and supportive critiques. We''d love to have you!', 'Welcome to DIA! We''re a welcoming, open-minded community that fosters passion for digital illustration for all levels of experience and connects artists to patrons. We support each other through drawing parties, art challenges, and supportive critiques. + +We''d love to have you! Join our Discord server, where we chat and host meetings, and check out some of our members'' artwork. + +Or, look at our pretty website.', '623', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b7596646-74ba-4e5e-bce3-98fc451db789', 'Disrupt', 'Disrupt aims to inform, empower, and connect the next generation of students interested in the growing space of Finance Technology (FinTech).', 'Disrupt aims to inform, empower, and connect the next generation of students interested in the growing space of Finance Technology (FinTech).', '664', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5fe7c175-f7c4-461b-bcaa-a79122b26b77', 'Distilled Harmony A Cappella', 'As one of the most successful collegiate A cappella groups in the Boston area and one of three co-ed a cappella groups on campus, Distilled Harmony prides itself in quality vocal music performance.', 'Distilled Harmony is one of the many collegiate a cappella groups in the Boston area, and one of three all-gender a cappella groups at Northeastern University. In addition to hosting shows on campus and singing with other groups in the area, they often participate in various competitions such as the International Championship of Collegiate A Cappella (ICCA). They have placed highly in both quarter and semifinal competitions, and have won Best Choreography, Outstanding Soloist, and Outstanding Vocal Percussion awards in previous years. + +Additionally, they have recorded two studio albums as well as an EP, which have garnered awards from Contemporary A Cappella Recording (CARA) and Voices Only. They like to be competitive and take their music seriously, but never lose sight of having fun! Feel free to check out their Spotify at Distilled Harmony, and all other social media @DistilledHarmonyNU to stay up to date will all things DH! + +Want to learn more about us? Check out this video! https://www.facebook.com/watch/?v=2970521202999818 + + + +Want to hear us sing on our new EP “Mirage”? Check it out! + +https://open.spotify.com/album/2JiSCBhXuT7wpFHAVqkqyt?si=Vd90qLHnSF6ovlObz2gXHg', '582', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9cb59962-92f5-4eff-a8ed-15a5374489b8', 'Diversability', 'We’re Diversability! We’re a club all about supporting and uplifting disabled and neurodivergent students at Northeastern, though we are open to all! We''re committed to promoting advocacy, education, and collaboration within the Northeastern community.', 'Hello everyone! We’re Diversability! We’re a club all about supporting and uplifting disabled and neurodivergent students at Northeastern, though we are open to all! As a club started by disabled students, for disabled students, we want to offer a new perspective in the disability narrative and give disabled students a chance to support themselves and each other. We have 3 goals: + +- Educate both disabled and abled people about disability issues and topics + +- Innovate to ensure that Northeastern is accessible for people of all abilities + +- Collaborate with Northeastern clubs, students, staff, and other disability organizations to work on projects around accessibility + +We accept all non-disabled and abled people in this club! Whether you’re here for education, a desire to support disabled people, or just curious, we’re excited to have you here! + +Join our discord!', '656', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('12ee8ced-5fdf-4384-a2c6-b563e7134d60', 'Downhillers Ski and Snowboard Club', 'We run buses to the best mountains in VT, NH, and ME every weekend the university is in session from January to March. Come shred and meet fellow skiers & boarding at our season meetings and trips!', 'We run ski trips to the best mountains in VT, NH and ME every Saturday that the university is in session from January to March. There is no membership fee and sign-ups for buses are on a week-by-week basis so you can pick which weekends you want to ride. We look forward to seeing you on one of our trips!', '313', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a3737b0f-3683-4da7-b553-e23f73edfe3d', 'DREAM Program at Northeastern University', 'DREAM Program at Northeastern University is a mentoring program that pairs NU students with children living in affordable housing in Madison Park Village and Orchard Gardens in Roxbury, MA.', 'DREAM Program at Northeastern University is a mentoring program that pairs NU students with children living in affordable housing in Madison Park Village and Orchard Gardens in Roxbury, MA. We strive to teach our mentees that they can have successful futures and go to college if they stay determined and motivated. We work in unison with our community partners to serve the residents of these neighborhoods meaningfully. We pride ourselves on our dedication to the program, our mentees, and each other.', '429', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('58f5c3d2-c359-4e9f-baf8-fc90963e89bb', 'ECONPress', 'ECONPress is an editorial journal exclusively showcasing undergraduate economic research. Started in the Spring of 2009 by motivated individuals with a passion for economics, the journal has continued to publish papers addressing a variety of topics. ', 'ECONPress is a publication showcasing undergraduate research. We receive econometrics papers from students and evaluate whether to publish them in our end of year journal based on whether they contribute to the existing body of research on a topic. We also discuss current events and interesting topics in economics. + + + +Students of all majors and backgrounds are welcome to join. Meetings are held weekly on Tuesdays from 7-8pm. + + + +If you have any questions or want to learn more, please email us or check out our website. + +Email: nueconpress@gmail.com + +Website: https://web.northeastern.edu/econpress/', '574', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b03c58f2-e195-4d8d-a599-5e0497f2810f', 'EcoScholars', 'EcoScholars is an organization of Northeastern students who work with local elementary schools and afterschool programs to provide climate change and environmental education appropriate to their grade levels.', 'EcoScholars is an organization of Northeastern students who work with local elementary schools and afterschool programs to provide climate change and environmental education appropriate to their grade levels. + +Our mission is two-fold: to conduct lessons and programming at schools and to develop and publish a curriculum library for use by other organizations. We seek to help students in and beyond Boston understand the science behind climate change, the many implications of climate change, and how they can help fight it. In particular, climate change will affect future generations as the temperature of our planet increases, so it is important that young students are educated and aware from a young age. Students who are interested in environmental science, environmental engineering, teaching, science, and/or have an interest in sustainability, teaching and the impacts of climate change are encouraged to join. Most of the students we teach are grade students during scheduled after-school programs. + +We have weekly meetings to introduce the club to new members and set expectations for teachers. After the start of programming, we have biweekly meetings explaining and reviewing the upcoming lessons in classrooms. + + + +We mainly communicate via email/Instagram (@bostonecoscholars) + +Subscribe to emails here: http://eepurl.com/dluRQn + + ', '830', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('72edaaad-3206-4ced-b3b9-d935405de7b1', 'Electric Racing at Northeastern University', 'Come design, build, and test with Northeastern Electric Racing as we create an electric, formula style car from scratch in a single school year, and compete in competition with teams from around the world!', 'Join Electric Racing at Northeastern University, and participate in a dynamic, action packed engineering competition. We design, build, and test all-electric Formula-style cars, with which we compete in annual competitions each spring and summer. We have mechanical, electrical, business, and software subteams. If you are at all interested in what we do, we have something for you! + + + +No matter your prior experience or your interests, Northeastern Electric Racing has a place for you! Below are just a few things we do across our interdisciplinary teams: + +▪ Mechanical: CAD, design simulations, power tools, machining + +▪ Electrical: circuit design and prototyping, soldering, custom battery design + +▪ Business: coordinating projects, writing code, managing finances, designing marketing materials + + + +------- Info Session ------- + +Please check out our Instagram @nuelectricracing for updates on our new member info sessions! This year''s will be on January 9th at 9 pm in Richards 300.', '781', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('848ef5eb-b703-4641-a89e-784917003abc', 'Elite Heat', 'Elite Heat is dedicated to training for obstacle course races like Spartan and Tough Mudder. We are open to all skill levels and have practice twice a week, host monthly events, compete in various intramural sports, and attend races throughout the year.', 'Elite Heat is an organization dedicated to training for obstacle course races like Spartan, Rugged Maniac, and Tough Mudder. We are open to all skill levels and have practice twice a week, host monthly events, compete in various intramural sports, and attend races throughout the year. For practice, we hold strength-based HIIT workouts on Mondays and more cardio-based workouts on Thursdays. As a club and a community, we believe obstacles are meant to be overcome rather than stand in our way.', '998', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('cf38457d-91a5-491b-89e6-d24029a8a6a5', 'EMPOWER Weightlifting', 'EMPOWER Weightlifting is a weightlifting club that serves to teach all levels of gym-goers a wide range of topics, from proper lifting technique to adequate nutrition. We focus on inspiring females to gain confidence in the gym.', 'EMPOWER Weightlifting is a weightlifting club that serves to teach all levels of gym-goers a wide range of topics, from proper lifting technique to adequate nutrition. The purpose of EMPOWER is to inspire weightlifters to gain confidence in the gym and to provide a safe place to build a strong community around fitness. EMPOWER will focus on uplifting women in the fitness space and will host several exciting events every semester, like fitness industry guest speaker events, group lifts, public gym outings, fun social events, and informative meetings. The 3rd floor of Marino isn''t as scary as you think! Join us!', '374', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5ee085a9-3861-4f00-9b2a-9644feb13f08', 'Encounter Every Nation Campus Ministries of Northeastern University', 'Encounter is a group that seeks to Encounter God, His Love, and His gifts and to help others do the same. Based out of small groups, we build families of God-centered people so they may feel connected and supported in Northeastern, Boston, and beyond.', 'Encounter is a group that seeks to Encounter God, His Love, and His gifts and to help others do the same. Based out of small groups, we build families of God-centered people so they may feel connected and supported in Northeastern, Boston, and beyond. The Bible says that when two or more are gathered in His name, He communes with us. Our groups center on the Bible and it’s Gospel - or Good News - and seek to 1.Encourage Christians and non-Christians in learning about the gifts of the spirit and encountering God through Biblical teaching, 2. Engage students in Gospel-centered conversations and help people encounter the Good News through small group discussion, and 3. Equip students to continually grow and adapt to the progression of campus life at all stages through mentorship and community. We are always open to people from all faith backgrounds, all places, and all walks of life. Encounter longs to bring people home.', '22', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6a5b9d23-5f38-41be-992b-62d613842634', 'Engineers Without Borders', 'EWB is an entirely student-led organization working with communities in Guatemala, Uganda and Panama to provide accessible drinking water. The group was started in 2004 and is a part of EWB-USA, a national nonprofit with 250 chapters in the U.S.', 'EWB is an entirely student-led organization working with communities in Guatemala, Uganda and Panama to provide accessible drinking water. The group was started in 2004 and is a part of EWB-USA, a national nonprofit with 250 chapters in the United States and projects in over 45 countries around the world.', '385', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('70f36e73-251b-445a-9af4-a0a96da80ee4', 'English Graduate Student Association', 'The EGSA, a student group officially acknowledged by the University, includes all graduate students in the English Department at Northeastern, but primarily functions as a small group of elected representatives. Its mission is to ensure and improve the...', 'The EGSA, a student group officially acknowledged by the University, includes all graduate students in the English Department at Northeastern, but primarily functions as a small group of elected representatives. Its mission is to ensure and improve the quality of the graduate programs, promote the professional development of graduate students, develop policies and procedures that benefit graduate students, encourage faculty-student communication, and foster collegiality among members of the department through cooperation between graduate students, faculty and staff in the English Department.', '777', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('49dc7465-7dd5-4f1e-8f52-12a80c3f382c', 'Entrepreneurs Club', 'The NU Entrepreneurs Club is Northeastern University''s largest student organization. Our 1000+ members attend our 4 programs, including soft/hard skill workshops, community initiatives, an executive speaker series, and a venture incubator. ', 'The NU Entrepreneurs Club is Northeastern University''s largest student organization. Our 1000+ members come from a diverse set of backgrounds to attend our 4 programs, including workshops, community initiatives, an executive speaker series, and a startup incubator. Our community is now global and you can get involved in Northeastern Oakland and London campus! ', '289', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c1b69a04-f42b-4162-afbb-6f838065da85', 'Environmental Science and Policy Leaders for the Environment', 'ESP-LFE is primarily an organization for Northeastern’s Environmental Science and Policy graduate students. Our purpose is to improve academic and professional development to its members, while also enriching the lives of the Northeastern student body. ', 'ESP-LFE is primarily an organization for Northeastern’s Environmental Science and Policy (ESP) M.S. program for graduate students. Our purpose is to provide leadership experience, facilitate alumni interactions, increase career development and professional enrichment opportunities, and offer opportunities for service and community involvement. As students of the Northeastern ESP program, we intend to give support to individuals prior to their acceptance at Northeastern, during their enrollment, and beyond their graduation. Most importantly, this organization intends to build environmental leaders within each cohort that exists within our program. + +We plan to support young adults interested in environmental science and policy through mentoring and guidance programs, educating them on career options, and advancing their aspirations. Northeastern students will have the opportunity to recommend specific courses to other students, create individualized career tracks, and attend networking and career events. With the increasing intensity of climate change impacts and other sources of anthropogenic disturbance, new and innovative solutions are required that are not currently addressed in the curriculum. ESP-LFE provides a voice for the students to advocate for new classes and coursework that addresses these evolving issues. Post-graduation, members will have access to diverse alumni mentorship that is specific to their chosen major or career and enables them to find resources and opportunities that may be otherwise unavailable. + +Finally, and most importantly, this group aims to build diverse and equitable leadership opportunities as far as our network can reach. As the social, economic, and political issues surrounding climate change continue to worsen, there is a growing need for leaders and experts that can help develop environmental and policy solutions. ESP students are engaged and equipped to fill this role within our local, national, and international community. Whether this takes the form of events or fundraisers for issues such as climate change awareness, hosting seminars for prominent leaders, or simply having a safe place to voice anxieties around current and emerging socio-political and environmental issues, this group will be a focal point for all of those interested.', '810', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4986e524-a387-431b-98c5-397a708b3ea1', 'Eon Dance Troupe', 'Eon Dance Troupe is a classical, ethnic, and fusion dance group that strives to promote awareness for the rich culture and history behind Chinese dance while fostering a community that welcomes dancers of all experience levels and cultural backgrounds.', 'Eon Dance Troupe expresses culture through our classical, ethnic, and fusion dances. Through our performances, we hope to promote awareness of the rich history and diversity within Chinese dance. Eon seeks to engage and foster community by interacting and collaborating with organizations in the Northeastern community and in the Greater Boston area through dance performances and cultural events. With our non-audition policy, Eon welcomes dancers of all experience levels and cultural backgrounds to learn, perform, and bond with one another. + +Follow us on instagram to keep up with announcements and updates! + +MAILING LIST: Sign up for weekly updates!', '247', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('14244dab-1757-4dca-a0ad-70ef22f8b0fd', 'Eta Kappa Nu', 'Eta Kappa Nu, Gamma Beta Chapter, is Northeastern Universities Electrical and Computer Honor Society. HKN is Committed to the advancement of academic and professional success of Northeastern ECE students who are both members and non-members. HKN provi..', 'Eta Kappa Nu, Gamma Beta Chapter, is Northeastern Universities Electrical and Computer Honor Society. HKN is Committed to the advancement of academic and professional success of Northeastern ECE students who are both members and non-members. HKN provides tutoring services and organizes information sessions for students interested in research and graduate studies, as well as opportunities for scholarship, alumni outreach, and so on.', '206', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4e10d8e3-829b-48c0-8c9d-8183063d1b82', 'Ethiopian and Eritrean Student Association ', 'Our mission is to showcase our exceptional culture by promoting harmony among Ethiopian and Eritrean students. ', 'Our mission is to showcase our exceptional culture by promoting harmony among Ethiopian and Eritrean students. We want to establish a place where students of Ethiopian and/or Eritrean background, as well as those interested in the two cultures, can come together to communicate and form relationships in order to foster social and cultural cohesiveness within our community. We, the Ethiopian and Eritrean Student Association, also known as EESA, strive to cooperate with other Ethiopian-Eritrean groups in adjacent universities in addition to working with the other multi-ethnic organizations here at Northeastern. + +We will strive to unite students through shared heritage, tradition, and knowledge. We will work to inform and educate students about significant cultural concerns that impact both their local and global communities. We will educate and enlighten our members on the history, customs, and current affairs of the two East African nations. We will endeavor to provide a setting where members can interact and succeed both intellectually and socially. We will invite students who are interested in learning more about Eritrea and Ethiopia. We will promote togetherness among the group''s participants, and WE WILL WELCOME EVERYONE.', '521', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6d298ba4-4ec7-413b-aa6d-1e8be6715c8f', 'Evolve', 'Evolve is a student-led fund and accelerator that empowers early-stage healthcare and life sciences ventures in Northeastern’s entrepreneurial ecosystem to take the next step in their development. ', 'Evolve is a student-led fund and accelerator that empowers early-stage healthcare and life sciences ventures in Northeastern’s entrepreneurial ecosystem to take the next step in their development. At the same time, we provide students with experiential learning opportunities and connect them with entrepreneurs, industry experts, and investors.', '682', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7ecb1661-f674-4d21-8282-e95581c72da2', 'Family Business Consulting Club', 'Family Business Consulting Club mission is to teach and broaden students'' understanding of consulting through interactive projects and workshops run by students-for students. We do this education and project based work with family businesses.', 'The Family Business Consulting (FBC) Club is the first of its kind at Northeastern. We focus on providing management consulting services to family-owned businesses of all sizes. + +Consulting projects we take on include financial analysis, sales optimization, customer/competitor analysis, growth strategy, new product development and more. + +Consulting teams are 4-5 people in size, with an experienced team lead and team members of all experience levels.', '938', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('717a1103-1d28-4759-aa60-d025edbb96ed', 'Feminist Student Organization', 'The Feminist Student Organization (FSO) is a Northeastern University student group committed to promoting discussion, debate, and action as it relates to feminism and its many intersections in society.', 'The Feminist Student Organization (FSO) is a Northeastern University student group committed to promoting discussion, debate and action as it relates to feminism and its many intersections in society. FSO is a discussion-based group which also coordinates community outreach and programming, and thrives on diverse opinions and lively discussion. + + + +Meetings are fully in-person – Thursdays from 8-9pm at Curry Student Center room 144 (aka the Center for Intercultural Engagement [CIE]).', '331', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0f5d835d-d1ed-465f-8994-4893c8f6aa23', 'Fiction Addiction Book Club', 'Fiction Addiction is a book club open to all Northeastern students. We read roughly one book a month and meet bi-weekly to discuss them. We also attend BPL book sales, host Blind Date with a Book, book-movie night adaptations, & other fun reading events!', 'Fiction Addiction is a book club open to all Northeastern students. We read roughly one book a month and meet bi-weekly to discuss them. Contrary to the name of the club, we don''t just read fiction! Monthly book club picks are chosen by general member voting on book nominees recommended by all members of the club. We also attend BPL book sales, the Boston Book Festival, local author signings and book store visits. Our club also hosts and annual Blind Date with a Book event, book adaptation movie nights, and collaborations with other clubs related to the books we are reading. This club is for anyone who has an interest in reading or enjoys discussing literary topics with others. + + + +Join our Mailing list HERE! + +Join our Discord server HERE! + +Follow us on Instagram! + +Friend us on Goodreads!', '670', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('77a1edc7-a5d1-4192-9002-c712b24fd445', 'Fighting Game Club at Northeastern University', 'FGCNU is a way to foster an environment of healthy improvement and practice. The purpose of FGCNU is to help the members of FGCNU practice their hobby of fighting games and provide opportunities for the members of FGCNU to attend tournaments.', 'FGCNU is a way to foster an environment of healthy improvement and practice. The purpose of FGCNU is to help the members of FGCNU practice their hobby of fighting games and provide opportunities for the members of FGCNU to attend tournaments. FGCNU’s mission is to practice, improve, compete, and have fun while playing fighting games, all while creating an environment where the members of FGCNU can ask questions, experiment with their play, and review and criticize matches.', '548', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8f3d37d7-1241-41ee-816e-85585c592d60', 'Finance and Investment Club', 'The mission of the Finance and Investment Club is to support the development of future financial professionals not only in their field, but in the university and the community at large. Through career-oriented activities such as weekly presentations b...', 'The mission of the Finance and Investment Club is to support the development of future financial professionals not only in their field, but in the university and the community at large. Through career-oriented activities such as weekly presentations by guest speakers, faculty members, and Northeastern alumni, students are given the opportunity to learn about various career paths and useful information that will help them advance in the workplace. The Finance and Investment Club meets weekly on Mondays from 6-7pm.', '487', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5a54dfa0-65b9-4e74-b4b5-8d3ba03c18c4', 'Finance Board', 'The Northeastern SGA Finance Board provides allocation, analysis, and oversight of the Student Activities Fee (SAF).', 'The Finance Board is responsible for allocating the Student Activity Fee for a wide variety of events on campus for the undergraduate student body at Northeastern University. Every student organization that has been recognized by the Student Involvement Board and the Center for Student Involvement has the opportunity to request funding from the SAF Fund through the Finance Board. Campus-wide events, which include but are not limited to speakers, comedians, concerts, and cultural events are encouraged. Furthermore, annual budgets, equipment budgets, publication budgets, and supplemental budgets are also heard by the Finance Board. The Board strives to fund student organizations in the most equitable way with greater emphasis on events that encourage collaboration between student organization, events that mirror the student organization’s goal, and events that create the most value for the undergraduate student body.', '520', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('02ec7c51-3bfd-42ae-ac34-b9bc0fba203c', 'Finance For the Community', 'Finance For the Community (FFC) is a volunteer-based organization that instructs high-schoolers in the Boston area on personal finance topics. Anyone can join regardless of their current personal finance or public speaking skills.', 'Finance For the Community (FFC) is a volunteer-based organization that teaches personal finance to Boston Public High School students. New members will learn FFC''s simple financial literacy curriculum then instruct BPHS students through the use of small group activities, presentations, and games. No background knowledge or experience with personal finance is required. You can attend as many or as little teaching sessions as you want. + + + +Why Join? + + + +Engage with the community and help improve the lives of local students. + +Become financially fit and get a hold of your own personal finances. + +Boost your resume. + +Practice public speaking. + + + +Meetings: Mondays, 7-8 pmJoin here: http://bit.ly/ffcemail', '703', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a8c7ed2d-f0d5-4572-a7c4-3c37fea4e6bd', 'First and Foremost Literary Magazine', 'First and Foremost Literary Magazine features art and literature made by first-gen, low-income, and undocumented students and their allies. First and Foremost was created to be a platform for these communities to share their creativity and thoughts.', 'First and Foremost Literary Magazine features art and literature made by first-gen, low-income, and undocumented students and their allies. First and Foremost was created to be a platform for these communities to share their creativity and thoughts.', '646', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5a626302-85a7-495f-bd46-872e740bf4bf', 'First Generation | Low Income Student Union', 'The First Generation Low-Income Student Union—a vibrant student-led organization bridging the information and support gaps that impact low-income and first-generation college students. Join us in driving advocacy, programming, and building a community.', 'Welcome to FGLISU - the student-led organization that strives to empower, support, and connect with first-generation and/or low-income college students. + +Discover a range of dynamic workshops and events designed to bridge the gap of information and resources. From financial literacy to college acceleration, we cover an array of topics to empower our community. + +Come join us on Thursdays at 6 PM in the CIE (144 First Floor Curry)! Join our Slack here.', '677', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b9203d3a-dd72-4b20-adae-351a1330ee62', 'FIRST Robotics Team 125 - The NUTRONs', 'FIRST is a international organization promoting STEAM to high school students through robotics. The NUTRONs are a team led by professional and college mentors that participate in this competition, mentoring and teaching high school students.', 'FIRST is an international organization promoting STEAM to high school students through robotics. The NUTRONs are a team led by professional and college mentors that participate in this competition, mentoring and teaching high school students. While this student group is focused on recruiting mentors for the FRC Team 125, the NUTRONs, we also accept members interested in volunteering for all FIRST events including FIRST Lego League and FIRST Tech Challenge.', '621', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8eeedfb1-2b0b-4a5b-9bc4-e5036300503f', 'FirstByte', 'FirstByte provides educators with the materials, curricula, and support to teach computer science and engineering, regardless of budget or technical background.', 'FirstByte, founded in 2017, is a Northeastern student-run organization that provides educators with the resources to teach computer science and engineering, regardless of budget or technical background. We are building an online library of engaging curricula and loaning out technology kits for free so that every classroom has the opportunity to learn about computer science and engineering. Additionally, our one-on-one support helps teachers adapt each lesson to fit their own unique classroom. + + + +While FirstByte’s current audience is local middle school teachers, our organization has the potential to reach educators of any grade or institution, both in Boston and beyond. Our online database of curricula is accessible worldwide, and the scope of this curricula will grow as other educators begin to contribute their own lessons. + + + +FirstByte has already participated in and held a variety of events, such as the BPS Parent x University STEM Cafe held at Northeastern, where we demonstrated projects from our MaKey MaKey curriculum for students of all ages to interact with. FirstByte held a professional development event for Boston Public School teachers at the Campbell Resource Center, where we demonstrated the technology kits available as part of our loaner program, as well as how to upload and download curricula on our website. We continued our outreach pursuits by holding an event entitled “Women in Tech: from Student to Teacher” at the Ann Taylor store in Cambridge, in which we led a discussion with five diverse panelists about breaking barriers within technology education. Our goal was to inspire students and teachers alike to learn about technology, and show them that although it may seem hard at first, technology education is accessible to everyone. FirstByte members also regularly attend monthly ScratchEd Meetups at the Harvard Ed Portal, where we participate in technology education conversations and meet new teachers to collaborate with. In the future, we intend to continue hosting and attending events such as these.', '52', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2d434677-7947-4868-8795-c1798fa57c26', 'Food Allergy Awareness Club', 'FAAC is an organization open to everyone that aspires to spread awareness regarding allergies/dietary restrictions in a fun and creative way! Additionally, we work to share resources and offer support to students with dietary restrictions on campus. ', 'FAAC is an organization open to everyone that aspires to spread awareness regarding allergies/dietary restrictions in a fun and creative way! Additionally, we work to share resources and offer support to students with dietary restrictions on campus. ', '523', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('87168e5f-903a-403e-a0fa-b101de3f6a30', 'Food Recovery Network', 'Join us for daily food recoveries: delivering surplus food that would otherwise be thrown away to local homeless shelters.', 'Food Recovery Network is Northeastern’s first student-led food recovery program. Our program mainly consists of running daily food recoveries: delivering surplus food that would otherwise be thrown away to local homeless shelters. Our goal is to bring awareness to and reduce food insecurity and food waste within our community. + +Join our Discord to get involvedurl: https://discord.gg/q832ARPf5u + +Feel free to reach out to us at neufoodrecovery@gmail.com or follow our Instagram for updates: nufoodrecovery + + ', '760', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7248654e-c897-4cd7-a75d-c6a62d445547', 'Friends of MSF Chapter at Northeastern University', 'FoMSF is an all-inclusive student chapter of Doctors Without Borders (MSF) aiming to raise awareness about MSF''s work in the field and global humanitarian crises via fundraising, research, and advocacy work.', 'Find us on Mondays, 6-7pm in 001 Cahners Hall in-person and virtually! + +Purpose Statement: To raise awareness and knowledge about MSF’s work in the field and global health crises by fundraising MSF’s work, encouraging students to get involved in their community, and raising awareness of medical humanitarian issues via advocacy campaigns and informational resource creation. + +Description: + +As an affiliated student chapter of the Doctors Without Borders non-profit organization, we aim to raise awareness and knowledge about MSF’s work in the field and global health crises by fundraising MSF’s work, encouraging students to get involved in their community, and raising awareness of medical humanitarian issues via advocacy campaigns and informational resource creation. We will accomplish our goals by actively fundraising for the Doctors Without Borders organization, engaging in volunteer efforts at NEU and within the local community, hosting prominent guest speakers from NEU, Doctors Without Borders, and other organizations, and more. In addition, the Friends Of MSF chapter at NEU will help students of any major find a path by which they may aid in humanitarian efforts around the world. + +MSF Student Chapters aim to: + + + +Raise awareness and knowledge about MSF’s work in the field and about humanitarian issues + +Encourage students to consider working with non-governmental organizations, such as MSF, post-graduation + +Support MSF in advocacy campaigns + +Raise money for MSF, their work in the field, and specific campaigns + + + +What do we do? + + + +Spread awareness of MSF’s activities and mission + +Provide educational and community service opportunities + +Foster engagement of Northeastern students in the health of our local community + +Conduct research to develop advocacy campaigns for polarizing medical humanitarian issues that students at Northeastern may not be aware of + +Provide professional development opportunities for students to help them acquire meaningful community service opportunities, develop the career-essential skills they need to succeed in both interviews and a professional setting such as a co-op, and learn more about a variety of healthcare disciplines and how they may fit onto that path even if they are not necessarily on the pre-health track + +', '948', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a79d6d94-b4be-4533-b4d0-353884b443a3', 'Game Studio Club', 'A multidisciplinary community of student game developers interested in learning how to make games. Have a dream game idea or a rule set you want to implement? Want to practice skills like art, programming, story-telling, etc? Come to Game Studio Club!', 'A multidisciplinary community of student game developers interested in learning game development by making games. Have a dream game idea or a rule-set you want to implement? Want to practice skills like art, programming, story-telling, etc? Come to Game Studio Club! Join our Discord and check out our Club Website!', '474', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('15729dee-2327-4fa7-9c97-3ae0d0181674', 'Genetics Club', 'Northeastern’s inaugural Genetics Club hopes to cultivate a supportive community of aspiring genetic counselors to help them learn about the burgeoning career and prepare for master’s programs.', 'Northeastern’s inaugural Genetics Club hopes to cultivate a supportive community of aspiring genetic counselors to help them learn about the burgeoning career and prepare for master’s programs. + +This interdisciplinary field involves many interests: namely biology, human services, psychology, and communication. Genetic counseling celebrates the marriage of science and people, and we strive to do just that. Beyond genetics, GCSIG will teach and foster compassion, medical ethics, and interpersonal skills. To strengthen the community, we plan to host both informational sessions and have one on one activities with current students and professionals in the field. + +Looking to join our email list? https://forms.gle/xwFfZNZwQN8Lq52Q8', '537', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('00e4557b-57dc-44e0-b2f3-74335c249d88', 'German Club of Northeastern University', 'The GCNU provides a gathering space for German native speakers (from Germany, Austria, Switzerland etc.), students learning German, and anyone who would like to grow their knowledge of German culture and language.', 'The GCNU provides a gathering space for German native speakers (from Germany, Austria, Switzerland etc.), students learning German, and anyone who would like to grow their knowledge of German culture and language. We hold fun events on-campus such as Sprachstunde, co-op panels, film nights, as well as occasional off-campus events and Germanic holiday events. ', '453', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0f136ff2-5ef3-4608-9825-d2455e90991d', 'Give a Hand', 'Give a Hand is a Northeastern University Club made up of a diverse student body. Our goal is to design, fabricate and build affordable 3D printed prosthetic hands and transform a prosthesis from a luxury item to an affordable device. ', 'Give a Hand is a Northeastern University Club made up of a diverse student body from Engineers, Designers, Business Majors, etc. Our goal is to design, fabricate and build affordable 3D printed prosthetic hands for people near the bay area who were born with a hand malformation or got an amputee. The exorbitant prices of bionic hands can go from $15,000 to $70,000 USD making them inaccessible for the wider population. As members of https://enablingthefuture.org/, a global network of volunteers, we hope to expand their impact. The Innovation in design and manufacturing could transform a prosthesis from a luxury item to an affordable device. The process of fabricating the hands is complex but not extremely difficult to learn and teach. The goal is to gather as many students as possible and find people in need of a prosthetic and build them one. These devices are extremely affordable costing under 50 dollars each. We hope to fundraise money so that the patient will get a device under no cost. Furthermore since most of the receivers are children the design is extremely flexible and they get to pick the colors, design and themes. The idea is to create a local network of volunteers and transform how medical devices are viewed. We currently have our own website where we go more in depth about our mission and the devices we fabricate (​​https://www.giveahandclub.org/). ', '809', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('500f3a05-d88b-450f-895a-03f16371b0c1', 'Global Dental Brigades', 'Global Dental Brigades aims to promote oral health via education and through volunteering in communities abroad by helping provide oral health services. ', 'Global Dental Brigades is a branch off of the larger organization, Global Brigades, whose focus is on promoting oral health. Global Dental Brigades aims to provide care and education to communities abroad in a sustainable fashion so that these communities can carry out this care on their own after our trips. Global Dental Brigades is aimed at pre-dental students as well as other students interested in the healthcare field or those interested in humanitarian work abroad. As a chapter on campus, our goal is to recruit students who are interested in global volunteer work and to hopefully raise money to hold a brigade in the future. The chapter would likely hold fundraisers for future brigades, work closely with other Global Brigades on campus, and raise awareness about the importance of oral health. The chapter would also provide oral health education to the community via flyers, virtual presentations, and collaborations with other healthcare clubs on campus. ', '539', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5ef447dc-74b7-4a11-8102-55157e99ccd7', 'Global Journal for International Affairs', 'The Global Journal for International Affairs is both an online and print publication. The Global Journal will allow students, faculty, alumni and Co-Op employers to share their International Affairs experience with the Northeastern community. The Glo...', 'The Global Journal for International Affairs is both an online and print publication. The Global Journal will allow students, faculty, alumni and Co-Op employers to share their International Affairs experience with the Northeastern community. The Global Journal is not limited to International Affairs students; it welcomes all students of the Northeastern community who have gone abroad through NU.in, Dialogue, or international Co-Op. We want to hear your stories and experiences, gather your tips and tricks, and share this information with students and staff campus wide.', '534', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('23927bf8-bf5c-4283-a517-d6c28438545b', 'Global Markets Association', 'Providing opportunities for students to engage with and further their knowledge & understanding of existing and emerging markets in China.', 'The Global Markets Association provides Northeastern students with opportunities to engage with and further their knowledge & understanding of existing and emerging markets all over the globe. + + + +We have weekly meetings in which we analyze the current state of a specific global market (such as Real Estate, Foreign Exchange, Private Equity, etc.), and discuss the potential implications that current events may have on the future outlook of that market. Meeting formats include presentations on the current state/relevance of a particular market, Q&A sessions with guest speakers, case study analyses, and educational workshops that are tailored to our members'' more specific interests in a particular market. Additionally, we provide opportunities for students to join our research team and get involved in researching various global markets and publishing research reports. + + + +At GMA, we strongly believe that understanding the world''s economy is key to understanding our current world. Through providing opportunities to analyze and explore global markets through multiple lenses, we strive to help students gain a holistic perspective of various countries and their relevance in our world.', '928', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2413469c-1902-49cf-b9dc-a055d2b21bd1', 'Global Medical Brigades', 'The mission of Medical Brigades is to work with licensed medical professionals and community health workers to provide comprehensive health services in rural communities with limited access to healthcare in Greece and Honduras. ', 'The mission of Medical Brigades is to work with licensed medical professionals and community health workers to provide comprehensive health services in rural communities with limited access to healthcare. Our current partners are Greece, Honduras, Ghana, and Panama where Medical Brigade volunteers have the opportunity to shadow licensed doctors in medical consultations and assist in a pharmacy under the direction of licensed pharmacists. Members also get the opportunity to develop interpersonal connections by triaging patients and taking vitals (blood pressure, heart rate, respiratory rate etc.). Our Chapter''s focus is to raise funds and supplies needed for Northeastern students to engage with communities abroad, while also gaining valuable insight into global development and building sustainable solutions abroad. + + ', '996', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3b4f091f-820a-4602-8c25-ba7ac02d0e8e', 'Global Research and Consulting Group - Northeastern Branch', 'GRC is a community of passionate students from a variety of cultural and academic backgrounds who collaborate with non-profits from around the world to complete pro bono consulting and research projects. ', 'The Global Research & Consulting Group "GRC" is a community of passionate students from a variety of cultural and academic backgrounds who collaborate with non-profits from around the world to complete pro bono consulting and research projects. Our mission is to help global NGOs and social impact startups achieve their goals while simultaneously empowering students to give back to the global community. + + + +In total, GRC has over 1,000 members and alumni across 20 chapters in top universities (Harvard, Stanford, Oxford, Wharton) in North America, Europe, and Asia. We are officially registered as a 501(c)3 non-profit organization and complete several experiential strategic advisory and insights projects every semester. + + + +Follow us on Instagram @grcnortheastern or email us for more information! Visit our website and learn more about GRC.', '793', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fa53bec8-d416-47dc-b8e8-8d349cc928de', 'Global Student Success (Campus Resource)', 'GSS provides English-language, academic, and cultural support to Northeastern''s international and non-native English-speaking students, scholars, faculty and staff though the International Tutoring Center and numerous workshop series and classes.', 'GSS provides English-language, academic, and cultural support to Northeastern''s international and non-native English-speaking students, scholars, faculty and staff though the International Tutoring Center. GSS provides one-on-one English-language tutoring focusing on: Reading, Pronunciation, Presentations, TOEFL, Career preparation, Conversation, Writing- Planning, Writing- Grammar, Writing- Organization, and Writing- Citations. GSS also offers Reading Workshops, Writing Workshops, Language and Culture Workshop series, as well as a non-credit Listening and Speaking course. GSS and ITC services are open to all international and non-native English-speakers in all programs, colleges, and campuses.', '248', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1de638bd-2c03-4085-9a80-48bc2d53aeae', 'GlobeMed', 'We are the Northeastern chapter of GlobeMed! Our 3 main functions are:• Fundraise for our hygiene and sanitation project in Masaka, Uganda to alleviate poor health caused by unclean water.• Organize on-campus events to educate students ', 'We are the Northeastern chapter of GlobeMed! Our 3 main functions are: + +• Fundraise for our hygiene and sanitation project in Masaka, Uganda to alleviate poor health caused by unclean water. + +• Organize on-campus events to educate students about our projects and related global health issues. + +• Serve internationally alongside our partner organization, Kitovu Mobile LTD, and locally in the community. + +Email us at northeastern@globemed.org if you''re interested in joining! Here is the link to view the recording of our information session https://drive.google.com/file/d/1nMVcBqGW6hDI74Lmj2NhYLFB80U3ULMP/view?usp=sharing', '1014', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1f15dbd6-fafe-4a25-bbde-26b05ba5ab64', 'Goldies Dance Team', 'Goldies is a Northeastern University based dance team focused on exposing students in the Boston area to open style dance culture and opportunities', 'Goldies is a Northeastern University based dance team focused on exposing students in the Boston area to open style dance culture and opportunities. Our main goal is to provide opportunities for students to perform and grow as dancers in a productive but judgment-free environment. Ultimately, we hope to inspire dancers to involve themselves in the greater East Coast dance community.', '794', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ebc1a82e-d284-441e-8c03-f35c422c3041', 'Graduate Consulting Club', 'Graduate Consulting Club aims to provide education and mentorship to graduate students who are interested in consulting, and help create meaningful connections with professionals in the industry. ', 'Graduate Consulting Club aims to provide education and mentor-ship to business students who are interested in consulting, and help create meaningful connections with professionals in the industry. The club will provide a platform to practice and promote skills needed in the consulting sphere and foster leadership and expertise.', '87', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1bb913cc-4e88-44f9-970b-8ac7822d330d', 'Graduate Student Education Research Association', 'GSERA facilitates and promotes the transition from graduate student to practitioner, educator, and/or researcher. GSERA is Northeastern''s campus chapter of the American Education Research Association (AERA), a national community of education researchers.', ' + +Northeastern University''s Graduate Student Education Research Association (GSERA) facilitates and promotes the transition from graduate student to practitioner, educator, and/or researcher by providing opportunities within Northeastern, the American Educational Research Association (AERA), and associated regional organizations for growth, development, and advancement. + + + + + +In addition, GSERA seeks to help the Northeastern Graduate School of Education students navigate the obstacles, rewards, challenges, and support networks of academic life. + + + + + +Through AERA and in conjunction with the Northeastern Graduate School of Education faculty, GSERA offers students a rich array of programs and services through the AERA divisions, special interest groups, and the AERA Graduate Student Council. Students interested in exploring opportunities in professional development, mentoring, and networking can engage with scholars around the world and other graduate students across the country. + + + + + +GSERA embraces its five major responsibilities: + +1. Community building, experiential learning, and networking + +2. Student advocacy + +3. Self-governance + +4. Information and research dissemination + +5. Meeting and event planning', '614', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0a4fcbfb-2113-46ad-a79b-2fe4641eda6f', 'Graduate Student Government', 'The Graduate Student Government (GSG) is the official voice for graduate students at Northeastern University. GSG addresses concerns, raise awareness, and promotes graduate student life on Huntington Avenue and abroad. Our primary goal is to enrich th...', 'The Graduate Student Government (GSG) is the official voice for graduate students at Northeastern University. GSG addresses concerns, raises awareness, and promotes graduate student life on Huntington Avenue and abroad. Our primary goal is to enrich the graduate experience at Northeastern and we do so through funding and research support, sponsoring social and networking events, and providing a forum for graduate students to present concerns, issues, and ideas to Northeastern University administration, faculty, and staff. Please visit our website for meeting location and additional information at http://www.northeastern.edu/gsg/. + + ', '272', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d1dd90f4-0e5b-427b-8bf5-d50db9159482', 'Graduate Students of Color Collective', 'The purpose of the GSCC is to build community for graduate students of color at Northeastern University by promoting education, professionalism, and civic duty. The GSCC fosters student, staff, and faculty relationships to establish a campus home for h', 'The purpose of the GSCC is to build a community for domestic and international graduate students within the Black, Indigenous, and People of Color (BIPOC) on all Northeastern University Campuses by promoting education, professionalism, and civic duty. The GSCC fosters BIPOC student, staff, faculty, and alumni relationships to establish a campus home for higher education at Northeastern. Through civic engagement with surrounding communities, the GSCC recognizes the continued struggles of marginalized populations, and the need for those who have succeeded in giving back.', '805', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('db0db8b5-9414-4577-952b-43776ca28368', 'Graduate Women in Science and Engineering', 'GWISE is a group of graduate students and postdocs designed to assist in the professional and personal advancement of women in science and engineering at Northeastern University. GWISE strives to provide women with the support and resources necessary ...', 'GWISE is a group of graduate students and postdocs designed to assist in the professional and personal advancement of women in science and engineering at Northeastern University. GWISE strives to provide women and other underrepresented groups with the support and resources necessary to be successful, as well as to create a sense of community. To achieve this, GWISE will sponsor events covering a wide variety of topics including networking, career options, balancing work and personal life, and other issues affecting womxn in the sciences. Become a member by subscribing to our mailing list by emailing gwise.neu@gmail.com with the subject line "Subscribe." Check out our linktree to stay up to date https://linktr.ee/NortheasternGWISE! + +Our mission: To identify and break down the barriers limiting the representation of women of all backgrounds in STEM careers and empower their participation and advancement. + +Our vision: equitable STEM fields for women of all backgrounds.', '760', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d40a2f07-9dfb-48e4-ad34-f6ffb8cb4287', 'Green Line Records', 'Northeastern University''s student-run record label', 'Green Line Records is Northeastern University''s student-driven record label. Based in Boston, Massachusetts, our label aims to accelerate the careers of emerging artists. We offer our diverse lineup of artists a full range of services including studio and live recording, marketing, merchandising, booking, and management. For more than two decades, Green Line Records has served as the hub where learning and local arts collide.', '935', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('02dd47a8-9754-4c9e-9421-832f4d5f44c2', 'Hawaii Ohana at Northeastern University', 'HONU accepts people of all different backgrounds who have an interest in Hawaii’s culture. Our organization is here to be a hanai ''ohana (adoptive family) to students at Northeastern who want to keep connected with home and share our local culture!', 'With Northeastern expanding its reach around the world, an increasing number of students from Hawai''i are enrolling at the university. The growing population of Hawai''i students in the Boston area can benefit from connecting to each other through our shared background. Thus, the Hawai''i Ohana at Northeastern University (HONU) was formed to bring together people who the share the Aloha spirit. Not restricted to those originating from Hawaii, HONU accepts people of all different backgrounds who have an interest in Hawaii’s culture. Our organization is here to be a hanai ''ohana (adoptive family) to students at Northeastern who want to keep connected with home. We also want to share our state’s unique traditions through fun activities and events. On a broader scale, we hope to connect with other students in the area to build the Boston/Hawaii network.', '261', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('aef74eca-0898-46f5-a5b1-632cae970d7d', 'Health Disparities Student Collaborative', 'The Health Disparities Student Collaborative (HDSC) is a group of students committed to building partnerships between schools, local organizations and communities in Boston aimed at addressing local health disparities.Born out of the Health Disparities...', 'The Health Disparities Student Collaborative (HDSC) is a group of students committed to building partnerships between schools, local organizations and communities in Boston aimed at addressing local health disparities. Born out of the Health Disparities and Higher Education Symposium in November 2007, the HDSC was founded by students who are alarmed that, despite its prestigious reputation as a hotbed of cutting-edge medical training, treatment, and research, Massachusetts is home to some of the most serious and shocking health disparities – particularly those affecting racial and ethnic minorities. Driven by a sense of responsibility and community, these students believe in utilizing the tremendous academic institutions and resources in Massachusetts in order to work with communities to close this gap. The HDSC is led by a central Leadership Committee that meets regularly to plan support, and publicize university-community collaborations, events, and activities. Mission: The Health Disparities Student Collaborative is a collaboration of students and community members who believe that together we can achieve health equity through education, advocacy and service.', '208', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2d05b5c0-f7e5-4a56-ba3c-6f946c806616', 'Health Humanities Club', 'Are you interested in looking at healthcare in a new way? Or do you want to learn about interesting NUpath courses? Are you a health, humanities, and society minor and looking for a community within the minor? Come to our meetings to learn more!', 'Our organization provides students interested in the health humanities an outlet to explore this interest. The health humanities is an academic field that sheds light on how the different tools of the humanities can be integrated into medical practice as well as be used to analyze health as a whole. Many pre-health students have limited spaces in their schedule to take coursework related to this subject though. This is a void that we hope to alleviate! We will both enrich coursework as well as introduce the subject to members who have not taken health humanities coursework. ', '596', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8328f618-7188-41e6-ba9b-40da53ecad27', 'Healthcare Management and Consulting Club', 'Healthcare Management and Consulting Club', 'Are you passionate about changing the healthcare industry? + +Do you want to see lower costs, better access, and more equity? + +HCMC is the first club of its kind, solely dedicated to preparing, networking, and guiding Northeastern undergraduates interested in the Healthcare Management & Consulting concentration. + +We strive to equip students with the skills for a successive post-academic career in one of today''s most innovative and expanding fields within the healthcare industry through the fostering of both a diverse and cohesive academic community. ', '362', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7b806197-85dc-40d8-b38f-4e6bf1ec5ae0', 'Hellenic Society of Northeastern University', 'Northeastern University''s Hellenic Society created for fellow Greek students to mingle and network with each other. This group will focus on educating students about Hellenic culture, participating in Hellenic events throughout Boston, and spreading th..', 'Northeastern University''s Hellenic Society created for fellow Greek students to mingle and network with each other. This group will focus on educating students about Hellenic culture, participating in Hellenic events throughout Boston, and spreading the idea of "philotimo","friendship among members", to everyone who joins.', '7', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a3057c60-14c0-4414-809e-d974c4e3b8a5', 'Her Campus Northeastern', 'Her Campus at Northeastern is our chapter of Her Campus Media, the #1 digital publication run and curated entirely by female-identifying college students. We create and share articles and social media content daily.', 'Her Campus at Northeastern is our chapter of Her Campus Media, the #1 digital publication run and curated entirely by female-identifying college students. We create social media content and articles around mental health, news, pop culture, career, culture, style, and beauty content. Founded in 2009 by three Harvard grads, HC''s roots are close to home and we are proud to be one of Boston''s local chapters. We meet weekly on Mondays from 6:15-7pm in East Village 002. Find our Slack through our Instagram bio and learn how to join us!', '231', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('98caf9dd-d89b-410a-ab52-0627d139ddf8', 'Hillel Club', 'Hillel Club''s mission is to enrich the lives of Jewish undergraduate and graduate students so that they may enrich the Jewish people and the world. Hillel student leaders and professionals are dedicated to creating a pluralistic and welcoming environment', 'De missie van Hillel Club is om de levens van Joodse studenten en studenten te verrijken, zodat zij het Joodse volk en de wereld kunnen verrijken. Hillel-studentenleiders, professionals en lekenleiders zijn toegewijd aan het creëren van een pluralistische, gastvrije en inclusieve omgeving voor Joodse studenten.', '422', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('937fb8db-9d3c-4cef-81b0-2df0be46824b', 'Hindu Community of Northeastern University', 'The Hindu Communities at Northeastern University, founded on the sacred principles of the Vedas (timeless wisdom from Eastern tradition), promote the physical, mental, emotional and spiritual well-being of everyone through thought-provoking discussions', 'The Hindu Communities at Northeastern University, founded on the sacred principles of the Vedas (timeless wisdom from Eastern tradition), promotes the physical, mental, emotional and spiritual well-being of everyone through thought-provoking discussions, healing yoga/meditation practices, and healthy cultural demonstrations.', '548', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9b8a96b2-a0c7-4ec9-b985-1d84321f26c5', 'Hindu Undergraduate Student Organization', 'HUSO’s mission is to help students cultivate strength and peace by connecting with the Hindu faith and wellness techniques while also fostering meaningful connections with their peers.', 'HUSO’s mission is to help students cultivate strength and peace by connecting with Hindu culture and wellness techniques while also fostering meaningful connections with peers. We come together to build a supportive, welcoming community on campus. + +Our events include: + + + +Pujas and Festival Celebrations + +Meditation and Wellness workshops + +Social Mixers + + + +ALL undergraduate students (regardless of race, gender, nationality, faith or no faith) are welcome.', '439', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1acca48a-ed55-4656-afa5-edae4bf70c2e', 'Historical Review', 'The purpose of this club is to provide a historical research outlet for students outside of classes. NHR will allow students to research historical topics that they are interested in, receive editing advice from peers, and publish their research.', 'The purpose of this club will be to provide a historical research outlet for students outside of classes. Too often students have no avenue for research if a class is not offered on the subject. The goal of this club will be to create that avenue. NHR will allow both undergraduate and graduate students of any background to research historical topics that they are interested in, receive guidance and editing advice from peers, and publish their research to the public. NHR will publish a review once a year in print and online in a continuous manner.', '375', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6947079a-1d22-466d-a095-a3da8747f6c1', 'History Graduate Student Association', 'The History Graduate Student Association will provide an official social network for incoming graduate students, will facilitate communication between History graduate students, faculty in the History Department, and the College of Arts & Sciences. The...', 'The History Graduate Student Association provides an official social network for incoming graduate students and facilitates communication between History graduate students, faculty in the History Department, and the College of Arts & Sciences. The organization organizes academic events, conferences, and seminars on behalf of Northeastern''s History Department.', '59', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4ad8385f-b5f9-4837-8e3c-382975aa5bc9', 'Hong Kong Student Association', 'The Hong Kong Student Association is a student organization in Northeastern University that aims to promote the unique Hong Kong culture and provide a taste of home to Hong Kong students.', 'The Hong Kong Student Association is a dynamic student organization that brings together students from Hong Kong or those interested in Cantonese culture, society, and current affairs. Through a combination of social gatherings, collaborative events, and food outings, the Hong Kong Student Association aims to provide a welcoming environment where students can connect and share new experiences.', '914', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f75db770-a6ac-4533-955e-29b832f1a03d', 'Human Services Organization', 'The Human Services Organization strives to foster an inclusive community of students who are interested in the Human Services major or are passionate about social change by developing and hosting academic and social events. ', 'The Human Services Organization strives to foster an inclusive community of students who are interested in the Human Services major or are passionate about social change by developing and hosting academic and social events.', '863', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e408a231-2bcb-4980-b4fb-d9ccac5b5085', 'Huntington Angels Network', 'Our organization connects Northeastern affiliated startups to strategic partners and investors in the Venture Capital ecosystem. ', 'Huntington Angels’ mission is to grow the University venture community by connecting startups with a global investor network and venture capital firms to fill the known gap of $25,000-$2,000,000 of angel funding and pave the way to the next round of VC investment. Made up of a dedicated team of students passionate about the Venture Capital industry, our team is dedicated to finding the right investors for the selected startups we vet out that suit our pipeline. + +Huntington Angels does not take equity positions in any ventures but serves as a vehicle to connect ventures with investors and help their growth.', '445', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('90e770a8-f127-4a0f-9372-4b2152306726', 'Huntington United Ski Nordic Club', 'Opportunity for cross country skiers and interested beginners to get on snow together. Works towards training for Dec-Feb intercollegiate racing league with beginner opportunities. Dryland on campus and on snow nearby. Come ski with us! + +', ' + + + + + + + + + + + + + +HUski Nordic is a new collegiate Nordic ski club created last spring to create an opportunity for cross country skiers and students interested in learning to get on snow together. We have tentative status under Northeastern''s "club" department (Center for Student Involvement, CSI), but are not a part of the "Club Sports Department". + +The team works towards training skiers for a Dec-Feb intercollegiate racing league, but also offers opportunities for beginners. We have weekly dryland practices on Northeastern''s campus and get on snow nearby. We''re open to grad students and tentatively open to students from nearby colleges. + +This is the first year the club has been running, so bear with us as we work on getting things organized! Also, please check out our main website here https://sites.google.com/view/huskinordic/home or by clicking the globe icon below! + + + + + + + + + + + + + +', '909', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d4992212-45be-440c-940d-bbf49328a670', 'Huskick‘s Sneakers Club', 'Huskick’s Sneakers Club is a non-profit organization that promotes sneaker history and culture, delves into current market trends of footwear in the fashion world, and hosts sneaker-oriented activities on and off campus for all students and sneakerheads.', 'Sneakers, a common footwear of the youth, are almost an indispensable part of many students'' childhood and even current daily life. They are more than just objects that we wear on our feet since they tell important stories and evoke certain emotions. Our goal and purpose here at Huskick’s Sneakers Club is to bring these unique, emotional and entertaining stories behind every sneakers together on campus and share them with as many huskies as possible. Through that process, Huskick’s Sneakers Club is committed to building our very own sneakers community for Northeastern University because we believe that every husky who is walking on the Huntington Avenue deserves his or her own sneaker story to tell. As we share our sneaker culture here at Northeastern, every husky is presented with various new opportunities to learn more about each other, as well as discover and dive deep into the sneaker world. Through sneakers, mentorships and friendships happened, history learning of footwear is promised, and most importantly, a vibrant cultural/special interest community is formed for generations to come. Thanks to the power of the internet and the influences of social media today, the exposure of sneaker culture is beyond overwhelming as it is covered in some of the hottest spots online aside from sneakerheads around us in real life.For more information, please feel free to join Huskick''s Discord server: https://discord.gg/ujjvyRAWAr + + ', '470', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('12b88afc-2652-4366-b8bd-b6bc165858c1', 'Huskies Club Ultimate Frisbee', 'The Huskies''s Club Ultimate Frisbee team has a place for everyone, fielding a nationally competitive A team in addition to developmental B and C teams. Whether you''ve played Ultimate for years or have never picked up a disc, we''d love to have you!', 'Want to join the program in the fall? Fill out this Google Form to get on our email list and stay updated: https://forms.gle/uNGW2ueL9PWQfV9N8 + + + +Also check out our 2019 & 2020 highlight video here: https://youtu.be/ufan6g4GLs4 + + + +The Northeastern University Ultimate Frisbee team was founded in 1998. Although we are a relatively young program, we are constantly improving ourselves on and off the field. Led by a passionate core, Northeastern Ultimate strives to transform itself from "team" to "program". Our A Team is nationally ranked and competes around the country, finishing T-13 at College Nationals in 2019. Our developmental B and C teams focus on the growth of our players, allowing players to hone their skills and move up to A team or simply find a relaxed and enjoyable team environment. Whether you''ve played Ultimate for years or have never picked up a disc, we''d love to have you!', '277', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('14f63889-eced-4f22-a677-0a5976e574e2', 'Huskies for Israel', 'Northeastern''s Israel education, culture, and advocacy student club!', 'We are Northeastern University''s Israel education and advocacy student group. It is a non-religious affiliated club and throughout the year we host a host of a variety of fun events, thought-provoking lectures, and general body meetings about Israel''s history, culture, current events, and innovation. If you go to Northeastern and have an interest in Israel, then this is the club for you! Check our Instagram and Facebook and subscribe to our email list to stay up to date.', '777', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('57639e08-48ea-474b-99dd-387d34520dcb', 'Husky Ambassadors (Campus Resource)', 'Husky Ambassadors are a distinguished group of undergraduate student leaders dedicated to providing campus visitors a glimpse into the power of a Northeastern education. We do this through a number of means including, but not limited to, leading campu...', 'Husky Ambassadors are a distinguished group of undergraduate student leaders dedicated to providing campus visitors a glimpse into the power of a Northeastern education. We do this through a number of means including, but not limited to, leading campus tours, staffing NU Preview Day and Welcome Day events, serving as lunch hosts and panelists, and consistently acting as a positive reflection of the University in our everyday lives. Additionally, there are many paid opportunities within Undergraduate Admissions that Husky Ambassadors are prime candidates for. Through the professional volunteer opportunities that Husky Ambassadors are involved in, we support admissions initiatives, which in turn support University initiatives. Our slogan is "We all have stories to tell. What will yours be?" With each visitor that we speak with, it is our goal to have shared all of our personal stories surrounding global experiential education, research, intellectual life, campus involvement, and Boston pride. By skillfully highlighting what has made Northeastern the correct fit for us, we hope to allow prospective students to see themselves in our shoes in the future. In addition to gaining important professional and leadership experience in one of the most impactful offices at Northeastern, you will be welcomed into one of the premiere student communities on campus, have the ability to participate in awesome on and off campus programs, and get the inside scoop on University wide initiatives and plans. With that in mind, we look for dedicated, professional, talented, organized, energetic students who are excited to share their Northeastern story.', '848', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('99e28aba-91f1-4b15-ae03-149e33009e79', 'Husky Communicators', 'We are a collaborative graduate student group that promotes experiential learning projects from around the College of Professional Studies. ', 'Husky Communicators is a student-led organization that focuses on helping students with a passion for communication thrive and connect. In addition, as an organization, we also focus on fostering community by strengthening knowledge and professional experience and providing peer support. + +While at Husky Communicators, students will have an opportunity to explore and tune in their skills through various teams. + +Website Management – Students learn the ins and outs of website management tools to create and develop website content for the following websites: Husky Communications and Inspire & Influence. + +Social Media – Students focus on creating and promoting content across various channels: Instagram, LinkedIn, YouTube, and TikTok. + +Event Planning – Students focus on developing & executing all the organization’s events. + +Writing – Students enhance their writing skills and have an opportunity to publish their unique pieces on our Husky Communications and Inspire & Influence website.', '757', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bf9a3e7a-4aa0-4539-8ffd-430e57a5c89c', 'Husky Competitive Programming Club', 'Whether you want to sharpen your technical interview skills, compete among hundreds of collegiate teams worldwide, or simply just chill and make friends while you solve Leetcode-style problems, the Husky Competitive Programming Club welcomes you!', 'The Husky Competitive Programming Club seeks to be a group for students interested in the competitive side of computer programming. Whether you want to sharpen your technical interview skills, compete among hundreds of collegiate teams worldwide, or simply just chill and make friends while you solve Leetcode-style problems, HCPC welcomes coders of all skill levels! + + + +The gist of competitive programming is basically solving problems fast. "Fast" is both in the sense of algorithmic efficiency (big O) and in the sense of problem solving speed. That may sounds daunting but don''t worry. We aim to provide an iterative learning process via informative workshops and practical contests to teach you the skills and techniques needed to succeed. + + + +If competitions are your jam, we send several teams each year to compete in ICPC - the International Collegiate Programming Contest, where competitions are held at a qualifying, regional, divisional, national, and international level. Each contest consists of teams of 3 working together to solve a set of challenging problems in a set amount of time. Overall, it''s an intense time but a fantastic experience. If you''re looking for more competitions, websites such as CodeForces, USACO, and Hackerrank provide contests that we may occasionally take an interest in as well. + + + +If you aren''t interested in competitions, that''s fine too! The skills you learn through our contests and workshops is not only applicable to competitions, but also technical interviews and coding challenges. We invite you to come to our internal contests where you can make friends and brainstorm with others to solve challenging problems. In addition, our workshops aim to provide knowledge on various CP topics such as prefix sums, graph traversal, and dynamic programming. + + + + + +So come through to HCPC! We meet every week on Mondays 6:00 PM - 7:30 PM Eastern Time. Every meeting will be held in East Village 002. Hope to see yall there! + + + + + + + + + + + +If you''re interested, we invite you to sign up for our newsletter so you can be updated on what we''re up to and when/where we''re meeting. Also be sure to join our hub of communication via Discord, where we chat, bond, and post contest links so you can participate in our club, wherever you are. + +', '832', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('60af3c04-3c66-4524-ad49-611d9cae89f9', 'Husky Environmental Action Team', 'Husky Environmental Action Team (HEAT) is a student group working towards environmental sustainability and carbon neutrality at Northeastern University. We target issues such as food, waste, energy, divestment from fossil fuels, and recycling.', 'Husky Environmental Action Team (HEAT) is a student group working towards environmental sustainability and carbon neutrality at Northeastern University. HEAT raises awareness about sustainability issues at Northeastern University, works with the Administration of the University to establish and advance sustainability initiatives, and hosts events that promote responsible use of energy and waste. We target issues such as food, waste, energy, product life cycles, divestment from the fossil fuel industry, and recycling.', '1022', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('06854eca-e16c-4cad-b936-3701870f1706', 'Husky Systers Code', 'Coming together to build a Graduate Women community over a broad spectrum, right from building strong fundamental technical skills to confidently articulating and expressing our ideas and beliefs – enabling students to tap into their potential', 'As women in the graduate school, we realized the need for a platform for all our female students to come together, share, learn and grow. A platform that is a safe space for us to overcome our inhibitions and at the same time a space that challenges us to be better versions of ourselves + +When one woman helps another, amazing things can happen. Our aim is to Encourage and Build a strong community for our fellow women, over a broad spectrum, right from building strong fundamental technical skills to being articulate and confident about expressing their ideas and beliefs – enabling them to tap into their potential, their wisdom and apply it to real-world problem solving. + +We welcome every graduate woman in technical domain looking for a place to start or connect with her peers through the technical and skill shaping workshops, and personality tuning events organized by the club. ', '287', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6dcc6c21-b647-4fa0-be32-e911c274ad63', 'iGEM', 'iGEM is a worldwide annual competition that allows high-schoolers, undergraduates, graduates and postgraduates to design and create innovative approaches for a better future through synthetic biology. ', 'https://www.youtube.com/watch?v=WXy7ifxYRgw', '360', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b1405c53-a14e-45f1-8916-e511f6f81b7b', 'Indonesian Student Association', 'Indonesian Student Association at Northeastern University is a cultural student organization. Our mission is to unite and strengthen the Indonesian community as well as to promote Indonesian culture and tradition to the Northeastern community', 'Indonesian Student Association of Northeastern University is a cultural student organization. Our mission is to unite and strengthen the Indonesian community at Northeastern University as well as to promote Indonesian culture and tradition to the Northeastern Community.', '746', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6b58e39d-6bfb-43cc-b3b1-4dafeb78b635', 'Industry Pharmacists Organization', 'IPhO is the organization whose pharmacist members are universally recognized within the pharmaceutical industry as being the most professionally equipped to contribute to the development, commercialization, promotion, and optimal use of medicines.', 'IPhO is the organization whose pharmacist members are universally recognized within the pharmaceutical industry as being the most professionally equipped to contribute to the development, commercialization, promotion, and optimal use of medicines. IPhO Student Chapters are dedicated to enhancing student pharmacists’ understanding of the pharmaceutical industry by raising awareness of the roles that industry pharmacists play in drug development, drug safety, drug regulations and other aspects of industry.', '369', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8c3d3076-495f-464f-8a02-f08514c049ac', 'Innovators for Global Health', 'Innovators for Global Health is dedicated to improving global access to healthcare through medical device design and innovation. Through IGH, students develop the skills and knowledge to tackle technical and design challenges with a global mindset.', 'NU IGH is composed of different groups that work together to promote global health through medical device access, including our Design Group and Campus to Country group. We maintain long-term global partnerships with hospitals and universities, including three medical facilities in Ghana, the University of Ghana, and Academic City University. With our partners, we work to develop low-cost medical devices and increase awareness of global health issues. We also lead yearly international trips to complete in-person needs-assessments at our partner facilities. + +Our Design Group is dedicated to designing and prototyping low-cost, sustainable medical devices tailored to the needs of low-resource hospitals. Recent design projects have included a surgical lamp, EKG electrodes, and a pulse oximeter. Currently, our projects include an oxygen regulator splitter, a medical suction pump valve/alarm, a low-cost hospital bed, and an infant incubator. Each of these projects was chosen based on in-person needs assessments at our partner hospitals. Design group is a great place to research medical device needs and problems, come up with creative solutions, and build engineering skills. This is the truly "engineering" portion of IGH, but you don''t need to have experience or even be an engineering student to contribute! + +Our Campus to Country group is dedicated to educating our members about global health issues and researching the commercialization of medical devices in low-resource nations. Thus, they seek to identify gaps in medical care faced by low-resouce nations and look for ways that these gaps can be sustainably addressed by the work of organizations like IGH and others. In addition, we work with local students and technicians to help them build engineering, design, and needs assessment skills. + +In addition to our main groups, we also often feature speakers in the global health field and conduct fundraising for our yearly international trips and design projects. + +Here is the video recording of our info session from spring 2023!', '447', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8eba8f4c-5e07-4908-8c15-27bbe338b2ac', 'inSIGHT', 'Are you considering a career in the health sciences or would like to pursue a niche in the medical field? If so, inSIGHT may be for you! This is a club that will introduce potential members to the wonderful field of eye-health and what it consists of.', 'inSIGHT is an organization that provides a foundation for students interested in an eye-health-related field. We provide a network of professionals in the field including inviting optometrists, ophthalmologists, eye researchers, and optometry school representatives to share their insight into the eye care world. We also hold biweekly meetings to share scientific articles about the most recent advances in the "eye world,” talk about upcoming application due dates and testing strategies, and network with graduate programs to learn more about educational opportunities in this field. Overall, we aim to provide an inclusive, welcoming environment for all to figure out their career path!', '639', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9e241979-b013-4774-b21b-b8ecfe153981', 'Institute for Operations Research and Management Sciences at Northeastern University', 'The Institute for Operations Research and the Management Sciences at Northeastern University', 'INFORMS serves the scientific and professional needs of Analytics Professionals and Operations Researchers including educators, scientists, students, managers, analysts, and consultants. The Institute serves as a focal point for analytics and O.R. professionals, permitting them to communicate with each other and reach out to other professional societies, as well as the varied clientele of the profession''s research and practice.', '366', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c945dc51-b468-4293-a6f7-cc487a67c7ac', 'Institute of Electrical and Electronics Engineers', 'IEEE is the professional society for electrical and computer engineers at Northeastern! We have weekly chapter meetings with guest speakers from industry, advice sessions, or chances to meet professors. We run workshops and do community outreach too!', 'As a student branch of the IEEE (Region 1), IEEE at Northeastern University is the third largest student branch in the Boston Area. With an active membership of over 90 students and several IEEE technical societies, IEEE at Northeastern University strives to "promote the engineering process of creating, developing, integrating, sharing, and applying knowledge about electro and information technologies and sciences for the benefit of humanity and the profession". We at IEEE at Northeastern University believe this can be accomplished by enabling students with access to both the latest technological tools, as well as access to industry leaders who have been and/or are the vanguard of their engineering fields.', '627', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('051d0aad-50d8-4ce2-a9af-67c53119a85a', 'Institute of Industrial and Systems Engineers', 'We are Northeastern University''s chapter of the Institute of Industrial & Systems Engineers. NU IISE gives students the chance to learn more about Industrial Engineering through different industries and encounters with professionals. We provide opportu...', 'We are Northeastern University''s chapter of the Institute of Industrial & Systems Engineers. NU IISE gives students the chance to learn more about Industrial Engineering through different industries and encounters with professionals. We provide opportunities for students to meet and discuss current issues in IE, gain valuable leadership skills in their field, and actively participate in community service, among other things. NU IISE creates an environment where IE students can grow professionally and academically while having fun, bonding with classmates, and networking with industry professionals. + + + +Subscribe to Our Mailing List for meeting updates. + +Join Our Slack to discuss job opportunities, meeting logistics, and more.', '547', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9da950b0-221a-46ef-bdac-5c938c6e6e69', 'Interfraternity Council', 'Register for the IFC recruitment process: https://ifcnu.mycampusdirector2.com/landing/', 'Our 12 recognized member and associate member chapters are: + + + +Alpha Epsilon Pi: Website | Instagram + +Alpha Kappa Sigma: Website | Instagram + +Beta Gamma Epsilon: Website | Instagram + +Beta Theta Pi: Website | Instagram + +Delta Kappa Epsilon: Instagram + +Delta Tau Delta: Instagram + +Kappa Sigma: Website | Instagram + +Phi Delta Theta: Website | Instagram + +Phi Gamma Delta (FIJI): Website | Instagram + +Pi Kappa Phi: Instagram + +Sigma Phi Epsilon: Website | Instagram + +Zeta Beta Tau (Associate Member): Instagram + +', '825', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d81599b5-0b57-4328-9140-2887c76fd6dc', 'International Business Club', 'The International Business Club is designed to provide members with a structured environment that''s conducive to gaining an understanding of international business topics through the opportunity to present semester-long research at semi annual conference', 'The International Business Club is designed to provide members with a structured environment that is conducive to conducting research and gaining an advanced understanding of modern international business practices and solutions. + +IBC provides members with the resources to conduct a semester-long international business study, and present their solutions to real-world international business problems at a semi-annual conference. This includes assisting members in reaching out to business professionals and interpreting complex geopolitical issues. + +Along the way, members will attain a high degree of confidence in topics relating to: + +Globalization, Conflict Resolution, Trade Compliance, Global Management, Strategy, and Ethical Reasoning + +We encourage students of all majors who are interested in international business to participate in order to learn about the global business machine and build a diverse network of aspiring global professionals.', '664', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2be39040-2d97-4a31-bdca-cd6a466c0681', 'International Relations Council', 'The International Relations Council is the most interactive and integrated student group for Northeastern Students interested in foreign policy, international relations and the finer points of global politics. ', 'The International Relations Council is the most interactive and integrated student group for Northeastern Students interested in foreign policy, international relations and the finer points of global politics. Weekly meetings are complemented by collaboration with the Model UN, Model NATO, and Model Arab League courses offered by the Political Science Department as part of NU''s experiential education. The team attends numerous prestigious collegiate simulated conferences each semester in locations like Washington D.C. and Montreal and hosts our own various conferences for middle school, high school, and college students. There is simply no better way for students to engage in and discuss the most prominent international current events while perfecting debate and public speaking skills. If you are interested in joining us, feel free to send us an email at northeastern.irc@gmail.com for information about our current meetings and events. + +If you want to know more about what we do, check out this video from our info session for the Virtual Summer Involvement Fair a few years ago! + +https://www.youtube.com/watch?v=jf2BXvzJ3rg', '806', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6a12546b-afcb-4c0e-9c94-4dc4846c86b0', 'International Students in Business', 'ISIB hopes to assist international students integrate in the US workforce by helping find companies willing to sponsor international students and help develop members into global business leaders. Overall, we aim to build a safe community here.', 'Vision: ISIB hopes to be a resource in a club form that offers to primarily assist international students integrate in the US workforce and become global business leaders. + +One major setback that international students face when coming to study in the US, is the uncertainty of having viable job prospects in the US after graduation due to the Visa/Work Permit issue. Currently, US college graduates without a STEM major get 12 months of OPT and STEM students a total of 29 months. After this period, students must hope that companies will sponsor them for an H-1B visa, which very few companies do and these companies are also difficult to find. + +Additionally, the club also hopes to offer guidance to international student on how to be successful as internationals in the professional world, and how they should be able to utilize their skills to their advantage. + + + +Strategy: We hope to have our club consist of two components. The first component would be to have a research division to the club. The researchers would have the responsibility of researching & contacting companies for positions that offer sponsorship or offer to hire international students. In the long run we would hopefully be able to build relationships with these companies where we can hopefully send an international student every year to work there. The findings of our research will be available to all our members and we would also encourage members to have a genuine crowdsourcing mentality, where if they find a position that does not require sponsorship, that they share it with the rest of the group members. + +Alternatively, we would also like to bring in guest speakers, in a group discussion setting, to give members the opportunity to talk and discuss on how to be successful international professionals. Researchers and Eboard members in our club would also be responsible for reach out to potential guest speakers. + + + +Objectives: The three objectives we have are Place & Educate & Serve. We want to place as much of our international members into secure jobs after graduation. We want to educate the international student body on how they are able to be global leaders by bringing in proven professionals in an array of fields to offer advice and guidance. Lastly, it is also important to serve. This is done by researchers in the club and general members sharing jobs that they have found that do not require sponsorships to all other members of the club. We would highly encourage researchers to be non-international students that want to ensure that their peers have as many opportunity possibilities as possible after graduation. + + ', '495', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('04eb0410-6ab0-4795-be9c-163606fc8e25', 'InterVarsity Multiethnic Christian Fellowship', 'Our vision is to foster a community that gives every corner of Northeastern an opportunity to explore Jesus, be transformed, and change the world! We want to see all –cynics, seekers, followers, leaders– welcomed, loved, challenged, and changed together', 'Hey there! Wondering how to get connected? Come on over to NUIV! We’re a community that loves to open up conversations about life and Jesus. There are always difficult, yet totally fair questions about the Christian faith and the world that surrounds us... and that’s where the fun begins! We always try to create inclusive spaces for real conversations and build genuine relationships that reflect the love of Jesus. From fun and lighthearted games to deeper, candid conversations, we hope to experience the full depths of life and live out the reality of a loving God. + +We are a dynamic group of students who want to: + +1. Be a diverse community growing together in love, faith, and knowledge of Jesus Christ. + +2. See the power of Christ transform the lives of students at Northeastern holistically, spiritually, emotionally, intellectually. + +3. Promote dialogue and be a safe and open place for all wanting to grow deeper in the knowledge and understanding of Jesus Christ and his teachings, regardless of one''s spiritual background. + +4. Promote the biblical basis for ethnic and racial reconciliation. + +5. Engage in issues surrounding poverty through local and global outreach and service opportunities. + + + +Join our Slack: https://join.slack.com/t/nuintervarsity/signup', '1012', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('91c13e24-d069-45d8-8780-420224dc2b44', 'IoT Connect of Northeastern University', 'Run by students in Computer Systems Engineering (concentration in the Internet of Things), NU IoT connect is a common platform for all things IoT, at Northeastern. Through this student organization, we hope to foster a community for students, faculty, ...', 'Run by students in Cyber Physical Systems (concentration in the Internet of Things), NU IoT connect is a common platform for all things IoT, at Northeastern. Through this student organization, we hope to foster a community for students, faculty, alumni, and industrial establishments that are enthusiastic about the endless opportunities this field has to offer. To do this, we regularly conduct workshops, work on real-world projects, and organize meet-ups with companies that are into IoT. It’s an amazing opportunity to stay informed about the latest trends in the field and find a potential career prospect. Attend any of our biweekly meetings to become a member and stay connected. Whether you are a newbie or a professional, all enthusiasts are welcome to join. Let’s strive to maintain a human connection in this increasingly connected world of smart devices.', '290', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('acdf7039-28fc-478d-85ad-bb02cf504817', 'Iranian Student Association of Northeastern University', 'The Iranian Student Association of Northeastern University (ISAN), which was founded by NEU students in 2007, creates a sense of community among students and faculty interested in Iranian culture by means of music, language, food, ideals, and traditions.', 'Iranian Student Association of Northeastern University (ISAN) is a cultural organization founded by the students of NEU in 2007. The purpose of this group is to foster a sense of community amongst Persian students and faculty, as well as any members of the university community who exhibit interest in our culture. Our music, language, food, ideals, and traditions bring us together and create a bond that is strengthened through the community, and we hope you will join us and share in our cultural heritage!', '811', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('36d7b641-5f85-48ad-87d2-8c464dde5151', 'Irish Dance Club of Northeastern University', 'Irish Dance Club of Northeastern University is an organization for Irish dancers of all levels to come together to dance, choreograph, workshop, perform, and develop their skills. ', 'Northeastern University Irish Dance Club (NUIDC) is an organization for Irish dancers of all levels to come together to dance, choreograph, workshop, perform, and develop their skills. We hold practices every week for beginners and championship dancers. We also attend the Villanova Intercollegiate Irish Dance Festival each year in November with our competition team, and perform at various events around St. Patrick''s Day. This year, NUIDC will be competing at the first annual National Collegiate Irish Dance Championships at Iona College in April.', '831', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bab7c81b-7564-4b01-a9a3-2e68f78c4e02', 'Islamic Society of Northeastern University', 'ISNU is an organization that strives to build bonds with Muslim-identifying students across campus through weekly programming and university-wide events. Though we aim focus towards Muslim students, our doors are open to all backgrounds.', 'ISNU is an organization that strives to build bonds with Muslim-identifying students across campus through weekly programming and various university-wide events. Our most popular event is our annual Fall Dinner commemorating and celebrating Eid Al-Adha and Eid Ul-Fitr. Here, students and community members dress in their best gowns and come together to enjoy a catered dinner, along with performance(s). Our regular weekly programming usually takes place on Monday evenings, including snacks and/or dinner. On these occasions, we offer community building exercises, religious programming, and thought-provoking discussions. + +ISNU actively provides essential Islamic services and resources fostering spiritual development, planning social functions, investing time and energy in community service, participating in interfaith dialogue and partnerships, and creating a forum for healthy intellectual discourse. + +Though we are focused on Muslim students, our doors are open to all backgrounds. + + + +Please fill out this google form to be added to our email list; we do not use engage much, if at all, so getting on our email list is the best way to be in the loop with all ISNU events and offerings! Thanks! + +https://docs.google.com/forms/d/e/1FAIpQLSdtL1txYVS1Ez1fwR2vETiSOJpF46peKj4idTAh4eCXERqcTw/viewform?usp=sf_link', '152', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('09af5ded-dbb8-4581-a283-ac51dbdd67a7', 'Japanese Culture Club', 'The Japanese Culture Club (JCC) holds meetings every other Friday in Curry Student Center 342 at 6:00 PM. We have casual meetings that cycle between cooking sessions, movie nights, game nights, and general meetings about Japanese culture and language.', 'The Japanese Culture Club (JCC) holds meetings every other Friday in Curry Student Center 342 at 6:00 PM. We have casual meetings that cycle between cooking sessions, movie nights, game nights, and general meetings about Japanese culture and language. In the spring, we host a Harumatsuri (Spring Festival) featuring Japanese food and performances. If Northeastern ever decides to give us a looot of funding we will bring you on an aesthetic trip like this: + +https://www.youtube.com/watch?v=gqYzEv_AqYM + +Please see attached video for more important information: + +https://www.youtube.com/watch?v=miomuSGoPzI + +You can join our mailing list by going to our website: + +https://neujcc.com/ + +And join our community by joining our discord: + +https://discord.gg/pGJzq257dd + +We also have an Instagram: + +https://www.instagram.com/neujcc/ ', '189', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f14c4d19-ae57-41a3-8529-90a4cb3d4485', 'Japanese National Honor Society', 'The Japanese National Honor Society recognizes and encourages achievement and excellence in the study of the Japanese language.', 'Welcome to the Japanese National Honor Society! Our club is dedicated to honoring and promoting excellence in the study of the Japanese language. Whether you''re just starting to explore Japanese or you''re a seasoned learner, our welcoming community celebrates achievement and learning. Join us for cultural events, language practice, and opportunities to connect with fellow enthusiasts. Together, we strive to foster a love for Japanese language and culture while recognizing the hard work and dedication of our members.', '401', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('418a1f09-32a5-4671-be7b-b4df8debf47a', 'Japanese Student Association', 'We are welcoming all Japanese students and students who are interested in Japan, Japanese culture, or Japanese language to come our events! You can get notified about our events by our Instagram page. (https://www.instagram.com/neujsa/', 'Welcome to JSA!✨ We invite all Japanese students and those who are interested in Japan, Japanese culture, or Japanese language to our events! Stay in touch with us by following our Instagram @neujsa or Join Our Newsletter 📑 ようこそ〜🌸 + +For inquiries, please email jsahusky@gmail.com. We look forward to hearing from you!', '960', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('06bd0a64-02d4-4bde-9838-0423566f1399', 'Jewish Student Union', 'Northeastern Jewish Student Union is the independent voice of Jewish students on campus. Northeastern JSU empowers Jewish students to make a difference in their community and the world. JSU student leaders are dedicated to creating a pluralistic, welco...', 'Northeastern Jewish Student Union is the independent voice of Jewish students on campus. Northeastern JSU empowers Jewish students to make a difference in their community and the world. JSU student leaders are dedicated to creating a pluralistic, welcoming and inclusive environment for Jewish college students, where they are encouraged to grow intellectually, spiritually, and socially.', '979', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e1911d6a-2107-4784-9c04-ead572fd90ea', 'John D. O''Bryant African-American Institute (Campus Resource)', 'To become a national model for African-American and African-Diaspora cultural and research centers that effectively provides service, programs, and engages the community and builds toward becoming self-supporting through research, development and alumn...', 'To become a national model for African-American and African-Diaspora cultural and research centers that effectively provides service, programs, and engages the community and builds toward becoming self-supporting through research, development and alumni participation.', '908', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b8fe43d1-1869-4637-b020-b784f42ca405', 'Journalism Graduate Caucus of Northeastern University', 'The purpose of the Graduate Caucus is to provide all current graduate students attending the School of Journalism and Media Innovation at Northeastern University a community and space for social and academic achievement. ', ' + + + + + +The purpose of the Graduate Caucus is to provide all current graduate students attending the School of Journalism and Media Innovation at Northeastern University a community and space for social and academic achievement. In doing so, the Graduate Caucus provides a means for students to meet and interact, and to provide a forum for discussion and appreciation of our general interest. + + + + + +', '820', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3bffe299-9656-4e6f-a40d-7894b3f21e78', 'Kaliente Dance Group', 'Kaliente is the Latin dance team of Northeastern University that was founded in 2009. The group is comprised of various students of diverse backgrounds, but that are all connected by one single commonality: the love for dance and Latin culture. ', 'Kaliente is Northeastern''s original Latin dance team. Founded in 2009, we are students from diverse backgrounds, connected by one single commonality: the love for dance and Latin culture. We work to promote Latin American heritage through our dance performances, which include salsa linear, merengue, and bachata, and our community service . Our goal is to share our team''s passion with the Northeastern and greater Boston communities, and to encourage others to incorporate some Latin flavor into their lives.', '10', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ef484a82-089f-487d-aec3-fb1e01f1f5b0', 'Kappa Alpha Psi Fraternity, Incorporated', 'Kappa Alpha Psi Fraternity, Inc. was founded on January 5th 1911 at + +Indiana University, Bloomington. ', 'Kappa Alpha Psi Fraternity, Incorporated, a college Fraternity, now comprised of functioning Undergraduate and Alumni Chapters on major campuses and in cities throughout the country, is the crystallization of a dream. It is the beautiful realization of a vision shared commonly by the 10 Revered Founders at Indiana University at Bloomington, Indiana on January 5th, 1911 by ten revered men. It was the vision of these astute men that enabled them in the school year 1910 - 11, more specifically the night of January 5, 1911, on the campus of Indiana University at Bloomington, Indiana, to sow the seed of a fraternal tree whose fruit is available to, and now enjoyed by, college men everywhere, regardless of their color, religion or national origin. It is a fact of which KAPPA ALPHA PSI is justly proud that the Constitution has never contained any clause which either excluded or suggested the exclusion of a man from membership merely because of his color, creed, or national origin. The Constitution of KAPPA ALPHA PSI is predicated upon and dedicated to the principles of achievement through a truly democratic Fraternity.', '428', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6cf1f413-f32d-409a-8f41-204625f4c1fb', 'Kappa Delta Sorority', 'Eta Kappa chapter of Kappa Delta Sorority at Northeastern University, Boston, MA. We pride ourselves on being confident, independent, and strong women who are constantly striving for that which is honorable, beautiful, and highest.Kappa Delta Sorority..', 'We are the Eta Kappa chapter of Kappa Delta Sorority at Northeastern University! We pride ourselves on being confident, independent, and strong women who are constantly striving for that which is honorable, beautiful, and highest. Kappa Delta Sorority is dedicated to four national philanthropies: Girl Scouts of the USA, Prevent Child Abuse America, Children''s Hospital of Richmond, Virginia and the Orthopedic Research Awards If you want to learn more: Facebook: https://www.facebook.com/kappadeltaneu Twitter: @KappaDeltaNU Instagram: @KappaDeltaNU Website: www.neukappadelta.com Or email our President, Jada, at nukdpresident@gmail.com! + + ', '535', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1b32e0d8-bb7e-4494-89a6-ae0cf53fe346', 'Kappa Kappa Gamma - Eta Omicron Chapter', 'Kappa Kappa Gamma is an organization of women which seeks for every member, throughout her life, bonds of friendship, mutual support, opportunities for self-growth, respect for intellectual development, and sisterhood.', 'Kappa Kappa Gamma is an organization of women which seeks for every member throughout her life bonds of friendship, mutual support, opportunities for self-growth, respect for intellectual development, and an understanding of and an allegiance to positive ethical principles.', '142', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3aa95840-5bd8-4545-aa03-1ed54da61a8e', 'Kappa Phi Lambda', 'Sisterhood, Service, Cultural Diversity.Kappa Phi Lambda is an Asian-interest, not Asian-exclusive sorority. Xi Chapter of Kappa Phi Lambda was established on June 15, 2002 and is located in the heart of Boston.', 'Sisterhood, Service, Cultural Diversity. Kappa Phi Lambda is an Asian-interest, not Asian-exclusive sorority. Xi Chapter of Kappa Phi Lambda was established on June 15, 2002 and is located in the heart of Boston.', '643', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bbea8456-45b5-41fe-af35-2c0c8aa405eb', 'Kappa Psi Pharmaceutical Fraternity, Inc.', 'Kappa Psi Pharmaceutical Fraternity is the oldest and largest professional pharmaceutical fraternity in the world. There are over 155 chapters and 87,000 graduate member across the United States. ', 'Kappa Psi Pharmaceutical Fraternity is the oldest and largest professional pharmaceutical fraternity in the world. There are over 155 chapters and 87,000 graduate member across the United States. Kappa Psi values high ideals, sobriety, industry, and fellowship. We aim to support and participate in all projects that advance the profession of pharmacy. The Gamma Lambda chapter was reactivated in the summer of 2013 after being dormant for over 30 years. We plan to help advance the profession of pharmacy at Northeastern and the surrounding communities through professional events, community service, and philanthropy.', '85', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('63da9b45-373a-446e-a095-b72849b28553', 'Kappa Sigma', 'About Kappa Sigma Xi-Beta:The Xi-Beta Chapter of the Kappa Sigma Fraternity was founded at Northeastern University in 1992 and with over 120 active men, is the largest chapter in the university''s fraternity system. Xi-Beta prides itself in its active ...', 'About Kappa Sigma Xi-Beta: The Xi-Beta Chapter of the Kappa Sigma Fraternity was founded at Northeastern University in 1992 and with over 120 active men, is the largest chapter in the university''s fraternity system. Xi-Beta prides itself in its active social life with Fraternities and Sororities on Campus, commitment to academic excellence, dedication to Community Service and Philanthropic events, and its unmatched strength in Brotherhood and Fellowship. Xi-Beta has Brothers involved in all aspects of Northeastern University, ranging from participation in Intramurals to leadership roles in Student Government, IDEA, Finance and Investment Club, TBP, and a Mishelanu Chapter. Xi-Beta has been the recipient of multiple Northeastern University Chapter of the Year Awards since its inception and the National Kappa Sigma Founder''s Circle award for chapter excellence, the highest honor throughout Kappa Sigma. About Kappa Sigma: Founded in 1869 at the University of Virginia, the Kappa Sigma Fraternity is currently one of the largest men''s college organizations in North America, having initiated more than 230,000 members. With more than 250 undergraduate and alumni chapters throughout the U.S. and Canada, the Fraternity teaches its core standards and values through educational programming related to the four cornerstones of Fellowship, Leadership, Scholarship, and Service', '951', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6fafab70-19a6-411c-9a37-cdd8ba4696f1', 'Khoury Graduate Student Association', 'The KGSA''s mission is to support and maintain a community among graduate students in the Khoury College of Computer Sciences. We serve as both a social space and as a democratic body that advocates for the interests of Khoury graduate students.', 'The Khoury Graduate Student Association (KGSA)’s mission is to support and maintain a community among graduate students in the Khoury College of Computer Sciences at Northeastern University. We aim to collaboratively create a more welcoming and supportive environment for all graduate students. Just like other GSA organizations in other departments, we serve as both a social space and as a democratic body that will advocate for the interests of Khoury graduate students with the college administration. + +To learn more about the Khoury GSA, check out this presentation of our agenda as of Summer 2021. There is also a short description of our activities.', '963', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('07e301ff-6110-4fee-bb2d-41d37fa61486', 'Khoury Masters Student Council', 'The Northeastern University Khoury Masters Student Council serves as an official liaison between Khoury masters students and the administration.', 'The Northeastern University Khoury''s Masters Student Council serves as an official liaison between Khoury masters students and the administration. We strive to promote student interests within Khoury, to enrich academics, student life, and overall success in the masters program.', '218', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2aa0afbf-d52b-4284-ab74-3aaf04c59d11', 'Kids in Nutrition', 'Kids in Nutrition (KIN) aims to empower youth to lead healthy lives through nutrition education. To achieve this goal, we connect college students with local elementary students and engage the kids in fun, interactive activities about healthy eating. ', 'Kids in Nutrition (KIN) aims to empower youth to lead healthy lives through nutrition education. To achieve this goal, we connect college students with local elementary students and engage the kids in fun, interactive activities about healthy eating. We believe in the power of encouraging kids to think about how their individual dietary choices impact both themselves and the world around them. ', '490', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('91298d67-b518-46d3-af6d-eba7e6eac29a', 'Kinematix Dance Troupe', 'Founded in 2006, Kinematix is a Northeastern University dance troupe. The team recognizes dance as a powerful, evolving culture and provides a channel for students to grow in that richness.', 'Founded in 2006, Kinematix is a Northeastern University dance troupe. The team recognizes dance as a powerful, evolving culture and provides a channel for students to grow in that richness. Kinematix strives to deepen the talents of its members, promote social collaboration within Northeastern and the Boston community, and create a supportive and nurturing environment. Through performances and choreography Kinematix aspires to extend its horizons and to inspire others through music and “bodies in motion."', '266', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('de695076-5285-4564-8647-64a51615cef3', 'Korea Campus Crusade for Christ', 'Korea Campus Crusade for Christ (KCCC) is a non-denominational movement committed to helping fulfill the Great Commission in our generation (Matthew 28:18-20) by winning, building, and sending in the power of the Holy Spirit! ', 'Korea Campus Crusade for Christ (KCCC), is a non-denominational movement committed to helping fulfill the Great Commission in our generation (Matt. 28:18-20) by winning, building and sending in the power of the Holy Spirit! + + + +It is our desire that we would be used by God to help reach students and faculty of Northeastern University with the Gospel so that every person on campus will know someone who truly follows Jesus Christ. + + + +Weekly Meetings + + + +Large Group: Wednesdays @ 7:30-9:30 PM @ Robinson 109 + + + +Small Group: If you are interested in joining a small group, please contact any of the leaders below (contact info below). There are various ones that meet throughout the week. + + + +Morning Prayer: Tuesday - Thursday 7 AM + + + +If you are interested in our organization, please fill out this form so we know how to best contact you!', '474', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('42c287d3-d5ec-4cda-be72-2163c028677b', 'Korean American Student Association', 'The Northeastern University Korean American Student Association is an organization that serves to promote cultural awareness at Northeastern University and the surrounding Boston area. We strive to bring together students of both Korean and non-Korean ...', 'The Northeastern University Korean American Student Association is an organization that serves to promote cultural awareness at Northeastern University and the surrounding Boston area. We strive to bring together students of both Korean and non-Korean backgrounds to establish a sense of community within the university. By creating and strengthening bonds, NEU KASA serves to unite students by showcasing Korea''s rich heritage and the immense potential and talent that we possess. Open to all students of all backgrounds, race, ethnicity, color and religion, NEU KASA serves to enrich, educate, and exemplify the Korean culture. + +Please like our Facebook page @NEU Korean American Student Association and Instagram @neukasa for further updates!', '874', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('351ba11c-93f5-488a-9e68-1525822ebb84', 'Korean International Student Association', 'KISA strives for general well-being of Korean international students and provide better career opportunities and alumni connection. As a nature of the organization, KISA takes responsibility in representing Korea and Korean organizations to the public.', 'KISA strives for general well-being of Korean international students and provide better career opportunities and alumni connection through a variety of events including new student orientation, movie nights, and seasonal events. KISA provides a community in which students can support each other at times of trouble and act as a family during special days such as Korean traditional holidays. As a nature of the organization, KISA takes serious responsibility in representing Korea and Korean organizations to the public. ', '869', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('20824280-fdfe-4d43-935c-0a935f83623b', 'Korean Investment Society at D’Amore-McKim School of Business', 'Korean Investment Society at D’Amore-McKim School of Business (McKIS), is committed to producing its members turn great ideas into scalable and sustainable business models through various types of business-related experiential projects. ', 'Korean Investment Society at D’Amore-McKim School of Business (McKIS), is committed to producing its members turn great ideas into scalable and sustainable business models. + +We have achieved numerous successes through various types of experiential projects every semester, ranging from marketing strategy competition, stock investment competition, to business plan development, collaborative projects with innovative start-ups and non-governmental organizations. Being part of the McKIS network is the most significant investment that our members will inherit with our successful alumni in various industries. We provide a platform that enables students, future leading business professionals, to meet not only with each other but also with leading business professionals in various sectors in Korea. + +For our new vision plan for 2023, McKIS aims to expand the vision of synergism between thriving Korean economies and the future of businesses. To be more specific, McKIS is willing to provide opportunities to apply their academic knowledge to actions, based on rigorous analysis, responsible leadership, and realistic projects, primarily focusing on South Korea’s entrepreneurial market. McKIS will continue to educate, contribute, and foster to make members get a step closer to being successful future of businesses, and expand that vision for all students in Northeastern University who are seeking interest in Korean enterprises.', '639', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c39b9851-001c-48af-a23b-ad372c5f0a07', 'Korean-American Scientists and Engineers Association', 'Korean-American Scientists and Engineers Association at Northeastern University. We are a non-profit professional organization that promotes the application of science and technology for the general welfare of society, fosters international cooperation...', 'Korean-American Scientists and Engineers Association at Northeastern University. We are a non-profit professional organization that promotes the application of science and technology for the general welfare of society, fosters international cooperation especially between the U.S. and Korea, and helps Korean-American Scientists and Engineers develop their full career potential.', '999', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6095149b-b59f-4f00-8642-9f3b79abf6cc', 'Lambda Kappa Sigma', 'Lambda Kappa Sigma, a professional pharmacy fraternity, strives to lead with integrity, inspire excellence, and professional excellence amongst our members to "provide lifelong opportunities for women in pharmacy. ', 'Lambda Kappa Sigma, one of three co-ed pharmacy fraternities at Northeastern, strives to provide lifelong opportunities for women in pharmacy through professional excellence and personal growth. Founded in 1913 by Ethel J. Heath at the Massachusetts College of Pharmacy, we now have 49 collegiate and 38 alumni chapters and have initiated more than 24,000 members. + + + +We strive to lead with integrity, where we stay true to our values and encourage and empower our members. We inspire excellence and instill passion, confidence, and professional excellence within our members. We also impact our communities by demonstrating compassion and advocating for women''s health issues. + + + + ', '507', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('301554cd-99ea-48ff-a037-5b2f77f59e3a', 'Lambda Phi Epsilon, Inc.', 'Lambda Phi Epsilon was founded on February 25, 1981 by a group of nineteen dedicated men led by principal founder Mr. Craig Ishigo. Hoping to transcend the traditional boundaries of national origins, the founders aimed to create an organization that wo..', 'Lambda Phi Epsilon was founded on February 25, 1981 by a group of nineteen dedicated men led by principal founder Mr. Craig Ishigo. Hoping to transcend the traditional boundaries of national origins, the founders aimed to create an organization that would set new standards of excellence within the Asian American community, develop leaders within each of the member’s respective community, and bridge the gaps between those communities. While the initial charter was comprised of Asian Pacific Americans, the brotherhood was open to all who were interested in supporting these goals. Mr. Craig Ishigo and Mr. Darryl L. Mu signed the charter as President and Vice President, respectively. Lambda Phi Epsilon’s vision is to become the preeminent international Asian interest fraternal organization, providing outstanding leadership, philanthropy, and advocacy in the community. The mission of the organization is to promote Lambda Phi Epsilon and its brothers by: - Developing active members to become leaders through training and hands-on experience, to advance personal growth, and to achieve academic excellence. - Perpetuating leadership of our alumni members in the community, creating opportunities, and encouraging the spirit of fellowship. - Promoting positive Asian American awareness and providing the highest level of philanthropy in the community.', '559', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('65d9d5ce-e0d2-4295-82a4-25fb6aa85210', 'Latin American Law Student Association', 'The Purpose of the Association is to articulate and to promote the needs and goals of Latin@ Law Students and all its members through support, advocacy, and professional development', 'Northeastern LALSA''s mission is to provide a safe space to bring, build, and share Latinx culture and experiences to NUSL and beyond.', '898', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('76a8df2c-b7a3-44fc-a5b1-592966620239', 'Latin American Student Organization', 'Mission Statement: "Dedicated to the Advancement of Our Culture and the Preservation of Our Identity."Since its inception, LASO''s goals have been to promote a positive image of Latin American culture, to inspire, develop, and promote leadership within...', 'Mission Statement: "Dedicated to the Advancement of Our Culture and the Preservation of Our Identity." Since its inception, LASO''s goals have been to promote a positive image of Latin American culture, to inspire, develop, and promote leadership within the membership, to improve the college experience for Northeastern University''s Latin American students and the overall student body, and to contribute to the progress of the Latin American population beyond Northeastern University through various outreach programs.', '828', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e356fa30-cfca-4696-b3ac-290e6ab461ab', 'Latinas Promoviendo Comunidad / Lambda Pi Chi Sorority, Inc.', 'Latinas Promoviendo Comunidad / Lambda Pi Chi Sorority, Inc. (LPC) is a nationally recognized sorority under the National Association of Latino Fraternal Organizations.', 'Latinas Promoviendo Comunidad / Lambda Pi Chi Sorority, Inc. (LPC) is a nationally recognized sorority under the National Association of Latino Fraternal Organizations. Our vision is to create a lifetime network of Hermanas dedicated to empowering themselves and their communities. Our mission is to empower women by providing a supportive network dedicated to their personal and professional advancement. Our Hermandad is further advanced by our shared dedication and promotion of public service and cultural awareness, with an emphasis on Latino history, contributions, and experiences. Our ideals as an organization are La Comunidad (the community), La Cultura Latina (the latin culture), and La Hermandad (the sisterhood). + +Nu Chapter has had its charter since 1999, founded on the campus of Harvard University. Nu Chapter is currently a city-wide chapter, with Hermanas at Northeastern University, Tufts University, Bentley University and UMASS Lowell. While we are a Latina-based sorority, we are not a Latina-exclusive sorority. Therefore the events and goals we set always keep the Latin community and culture in mind, but the women who set to accomplish those goals do not always identify as Latina. These events range from socials where people can gather over Latin food or a fun activity while engaging with one another to professional development workshops where attendees leave with tangible results. We also host philanthropic events based on, but not exclusive to, the philanthropic pursuits of our national organization, which are Project L.E.A.A.P., which works on increasing HIV/AIDS awareness and education or Proyecto H.A.C.E.R., where we help younger generations fulfill their higher education goals.', '871', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5d5f7ac0-e299-4515-aaf4-12734d70f8a5', 'Latinx Student Cultural Center (Campus Resource)', 'The Latinx Student Cultural Center (LSCC) engages Northeastern''s global Network in academic, personal and professional development by providing an inclusive space for self-care, Latinx education and celebration, and experiential opportunities', 'The Latinx Student Cultural Center (LSCC) engages, supports and empowers Northeastern''s global Network in academic, personal and professional development by providing an inclusive space - a home away from home - for self-care, Latinx education and celebration, and experiential opportunities', '745', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('33858a2c-3622-4012-b5fc-b6ea33c2d3ba', 'LEAD360 (Campus Resource)', 'LEAD360 is a collection of FREE leadership programs designed to teach students the vital skills they need to become more socially responsible and well-rounded leaders on campus and beyond.', 'LEAD360 is a collection of FREE leadership programs designed to teach students the vital skills they need to become more socially responsible and well-rounded leaders on campus and beyond. Building upon the values of interdependence, accessibility, justice, and experiential learning, LEAD360 will help you learn more about yourself, evaluate the ways you collaborate and interact with others, and identify the causes and topics that you are most passionate about.', '873', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('21600875-b129-4878-bed0-84f111c863a0', 'Lean Endeavors at Northeastern Club', 'Our mission is to provide students with resources that help them improve their knowledge and exposure to LEAN concepts and get to delve deeper into the industrial practices. We believe lean is a philosophy, a way of thinking and that can be applied in ...', 'Our mission is to provide students with resources that help them improve their knowledge and exposure to LEAN concepts and get to delve deeper into the industrial practices. We believe lean is a philosophy, a way of thinking and that can be applied in a wide variety of domains. We as a lean club will be undertaking activities and projects that will help improve current standards as well as increase efficiency of a process at Northeastern or any other industrial problem. Lean is a versatile concept in itself that can be applied to various functional areas within an organization like operations, sales and supply chain, manufacturing and project management departments, etc. We at lean club will assist students to apply these concepts, use them as a tool to improve themselves as well as organization they are associated with. Lean helps in reducing waste and increasing efficiency be it time, processes or cost and we help students develop that mindset and have a leaner approach to problem solving guiding companies and non-profit organizations to grow sustainably. We aim to provide resources and oppotunities for students to participate in lectures, workshops by experienced professionals in lean operations, envisioning to create an opportunity for students to work on projects with them. We would like to make learning about lean to be a fun activity for example working in a team consisting of students from various streams and competing in process improvement, case presentations, training simulation games. Proactive involvement in such tasks will provide an experience and enhance their soft skills along with clearing fundamental concepts. We also believe that Lean is not just a concept, it is a way of life. Like Peter Drucker concisely said, "There is nothing as useless as doing efficiently, that which should not be done at all" further pointing out adaptability and dynamically improving each and everyday. Join our team to encounter new challenges and gain an enriching experience.', '398', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5f6b1961-350f-4c05-aa79-29139c8d1b30', 'Lean On Me', 'Lean On Me is a student-run text support hotline that anonymously connects students with our Peer Supporters to create conversations. Our mission is to be a listening ear for Northeastern students.', 'Lean On Me is a text support hotline that anonymously connects students with their peers to create conversations where they can be unconditionally supported. + +Lean On Me is composed of Users and Supporters. Our Users are the Northeastern students who utilize the hotline and text in about their problems. Our Supporters are the trained students who operate the hotline and anonymously respond to the Users. Our Supporters are trained in empathetic listening and communication, so that they are prepared for any situation that they may come across. We emphasize that our hotline is not to be used as a substitute for professional help. We are a non-crisis hotline meant for peer-to-peer support. + +Lean On Me envisions a world where everybody has somebody to lean on. + +', '457', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('cfd7545f-6323-4ac1-a7af-0aede709b7b1', 'Legacy Mentoring Program (Campus Resource)', 'The Legacy Mentoring Program is a joint effort of undergraduates, upperclass and graduate students, NU faculty, staff, alumni, professionals and the community at large.We actively promote and support academic excellence, access to professional and educ...', 'The Legacy Mentoring Program is a joint effort of undergraduates, upperclass and graduate students, NU faculty, staff, alumni, professionals and the community at large. We actively promote and support academic excellence, access to professional and educational resources with the goal of increasing the retention and graduation rates of students of color and NU undergraduates. Our academic, social, professional, and cultural mission creates a unique community of personal growth, development,success and academic achievement.', '614', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a3555d95-e1bb-4637-9cf7-1d552e6ef3e2', 'LGBTQA Resource Center (Campus Resource)', 'Welcome to the Northeastern University LGBTQA Resource Center Orgsync page. Here we provide information for the Northeastern Lesbian, Gay, Bisexual, Transgendered, Questioning, and Ally community as well as provide support for those that may have ques...', 'Welcome to the Northeastern University LGBTQA Resource Center Orgsync page. Here we provide information for the Northeastern Lesbian, Gay, Bisexual, Transgendered, Questioning, and Ally community as well as provide support for those that may have questions about the living in this community. The LGBTQA Resource Center is located on the 3rd floor of the Curry Student Center, in room 328. The LGBTQA Resource Center is a place students can come to socialize, relax between classes, study, and learn more about opportunities for students who identify as LGBTQA within the Northeastern Community. There is also a LGBTQA resource library students can use for research or entertainment. Simply put, the LGBTQA Resource Center is the information hub for all that is LGBTQA on the Northeastern Campus. Mission: The LGBTQA Resource Center aspires to create a community that is free from societal issues such as heterosexism and transphobia, by instilling a culture of appreciation, respect and empowerment throughout Northeastern. We initiate and sustain co-curricular programs and services that enrich the holistic development of our lesbian, gay, bisexual, transgender, queer, questioning and ally students. Through dialogue and support services, we strive to increase the visibility of and enhance LGBTQA student life on campus.Sign up here to hear more from our orgs and our newsletter! https://docs.google.com/forms/d/e/1FAIpQLSdkJd-tDklKeTVsFW0bZCvmw0Vp6rGw_GEAblrTv-LxVh73Fg/viewform', '809', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('912fde04-b7ca-4125-961a-96e3a551c87e', 'Live Music Association', 'Live Music Association is a completely student-run group that is your one stop shop for live music on campus. Our club largely consists of non-music industry majors by chance, so it allows students who have an extracurricular interest get hands on expe..', 'Live Music Association is a completely student-run group that is your one-stop shop for live music on campus. + +Our club is not exclusive to music industry majors by design, so it allows students who have an extracurricular interest in live music to get hands-on experience running a show in Northeastern University venues and meet peers that have the same interests. We aim to bring the music community of Northeastern closer together with every meeting and event - such as but not limited to concerts, music festivals, open mic nights, DJ nights, drag shows, music industry panels, music trivia nights, and so much more. + +We aim to promote social justice through a diverse array of artists and a dedicated portion of events that advocate for marginalized communities, fundraise for charities, and push for equity on and off campus. + +Past concerts we have brought to campus in our LMA Presents series include Still Woozy, Duckwrth, Beach Bunny, Sidney Gish, Noname, Poppy, Ashe, Phoebe Bridgers, Louis the Child, Maude Latour, Hippo Campus, UMI, Faye Webster and more. Past drag artists we''ve hosted include Sasha Colby, Kennedy Davenport, Olivia Lux, Neon Calypso, Arabella the Goddess, Kori King, and so many more. + +LMA also hosts open mic nights where Northeastern students can take the stage and perform their own music. We also plan and host other special events including DJ nights, drag shows, music industry panels and more. + +At our general meetings, we discuss the latest in live music and divide into teams (Events and Marketing/Media) to work towards organizing upcoming events. Follow us on Instagram & Tiktok (@livemusicneu) and join our slack to keep up with what we''re up to! For general inquiries, feel free to DM us on instagram or email at livemusicneu@gmail.com.', '897', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('db57f61c-cf27-4dce-9a36-6f577adb6e8d', 'Lutheran-Episcopal Campus Ministry', 'Lutheran-Episcopal Campus Ministry at Northeastern is a Christian ministry to students, faculty, and staff on campus. We worship and pray, talk and reflect, and reach out to our neighbors. Our group includes Lutherans, Episcopalians, and students from ...', 'Lutheran-Episcopal Campus Ministry (aka Open Table) at Northeastern is a Christian ministry to students, faculty, and staff on campus. We worship and pray, talk and reflect, and reach out to our neighbors. Our group includes Lutherans, Episcopalians, and students from many other backgrounds. All are welcome, and we are an open and affirming community! Every Thursday from fall through spring, we gather at 5:45 pm for worship and programs that help us explore questions about faith and life together. Held in Northeastern''s beautiful Spiritual Life Center (201 Ell), these events give us the chance to build relationships with one another and to hear about the many ways in which God is at work in our lives. ', '1023', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5a5829ae-6899-4ca3-b974-405cd8639675', 'Marine Science Center Graduate Student Association', 'The purpose of the MSCGSA is to encourage scientific and social networking among graduate students at the Marine Science Center and to provide support and opportunity during their graduate tenure.', 'The purpose of the MSCGSA is to encourage scientific and social networking among graduate students at the Marine Science Center and to provide support and opportunity during their graduate tenure.', '221', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0fd953c4-3658-48a5-9e65-a27279faec66', 'Math Club of Northeastern University', 'Math Club offers an environment for Northeastern undergraduate and graduate students of all years, majors, and experience levels an opportunity to meet other interested students and learn, discuss, and do math.', 'Math Club provides a setting for students interested in mathematics to meet other students sharing common interests. We regularly host guest speakers for invited talks on interesting mathematical topics. Otherwise, meetings feature problem-solving, networking, research, and industry opportunities. Food (typically pizza, including vegan and gluten-free pizza) is provided at each meeting. + +Please join our Discord! https://discord.gg/S4xkPJ3Jcd', '135', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('113b7f7a-e7e7-46b9-9f52-ec75c68492db', 'Mathematics Engagement and Mentorship Association', 'Mathematics Engagement and Mentorship Association', 'MathEMA is a student-run mentorship program at Northeastern University that aims to help incoming students feel more welcome and aware of the opportunities available in the math department. We connect experienced upperclassmen with young students to discuss topics like co-op, choosing classes and professors, and acclimating to college life. We also host events like virtual movie nights, coffee chats, and study halls.', '761', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('83985f5f-1dff-4692-90aa-50472fa4b9b1', 'Mathematics Graduate Students Association', 'The MGSA is the official voice and representative of the graduate student body in the Department of Mathematics of Northeastern University.', 'The MGSA is the official voice and representative of the graduate student body in the Department of Mathematics of Northeastern University.', '608', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a9b7483b-c163-483d-8922-1402f65b5889', 'MEDLIFE Northeastern', 'MEDLIFE NEU provides the opportunity for all students interested in global health to participate in in-person Service Learning Trips to partnering communities in South America or East Africa, where they experience extreme health disparities first-hand.', 'MEDLIFE Northeastern provides the opportunity for all students interested in global health to participate in in-person Service Learning Trips every semester to partnering communities in Peru, Ecuador, Tanzania, and Costa Rica, where they are introduced to the health disparities that impoverished communities face every day. On a Service Learning Trip, students work in mobile service clinics with local physicians to provide healthcare and work with local and MEDLIFE engineers to build sustainable development projects for the community. Throughout the semester, MEDLIFE NEU offers pre-health students at Northeastern the opportunity to volunteer both locally and internationally, while holding fundraising events for our partnered communities or informational events such as the Healthcare Professional Panel. Our intended audience is any student interested in humanitarianism and/or medicine (pre-med, pre-nursing, pre-dental, i.e. pre-health). Our club holds volunteer events, healthcare workshops, humanitarianism speaker events, and Power Hour fundraising events. Since its establishment, MEDLIFE NEU has raised over $2800 for communities in Peru and Ecuador, which fed over 1,800 people. MEDLIFE Northeastern is a chapter of the national MEDLIFE organization, which is a 501(c)(3) non-profit organization that partners with low-income communities in Latin America and Africa to improve their access to medicine, education, and community development projects.', '382', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ccd407cd-65ea-4ea5-8ac9-1930fb9c5645', 'Men''s Club Basketball Team', 'The Northeastern Men’s Club Basketball team is a competitive, student-run organization that is active throughout the year. We are a member of the NCBBA league in which we play schools from across the New England region and in national tournaments.', 'Welcome to the Northeastern Men’s Club Basketball Team, a vibrant and competitive student-run organization dedicated to the love of basketball. Throughout the year, our team shines as a proud member of the NCBBA league, engaging in spirited matches with schools across the New England region and representing our passion for the sport in national tournaments. Join us for an exciting journey filled with teamwork, sportsmanship, and unforgettable basketball moments!', '595', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('aa447f7f-549f-40fe-989a-3619945c1b65', 'Men''s Squash Team', 'We are a competitive squash team that practices 5 times a week and competes against club and varsity programs in the New England area. We travel to nationals every year to vie for the title of the #1 club team in the nation.', 'Welcome to the Men''s Squash Team! We are a close-knit group of passionate squash enthusiasts dedicated to honing our skills and competing at the highest level. Our team practices five times a week, pushing each other to improve and excel both on and off the court. We proudly represent our club in spirited matches against other clubs and varsity programs across the vibrant squash scene in New England. The pinnacle of our season is our annual journey to nationals, where we go head-to-head with the best club teams in the nation, striving to claim the coveted title of the #1 club team. Whether you''re a seasoned player or new to the game, our team fosters a welcoming environment where camaraderie and sportsmanship reign supreme. Join us on this thrilling squash journey and be part of a community passionate about achieving excellence together!', '336', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5da4c77a-febd-43d7-bbc5-270d8a3561a9', 'Mexican Student Association', 'We are a vibrant and dynamic Mexican club organization that celebrates the spirit of Mexico. Join us to experience the colorful traditions and warm camaraderie, whether you''re Mexican or simply passionate about Mexican culture. ', 'Our mission as the Mexican Student Association (MEXSA) is to provide a welcoming and familiar environment for Mexican students at Northeastern University. ', '16', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9f69b94a-18b9-470c-a6e2-1f8732f6671c', 'Minority Association of Pre-health Students', 'MAPS exists to support current and future underrepresented medical students, address the needs of underserved communities, and increase the number of clinically, culturally, and socially competent healthcare providers. All are welcome to join!', 'The Northeastern University Chapter of the Minority Association of Pre-Health Students (MAPS) exists to support current and future underrepresented pre-medical, pre-PA, pre-dental, etc. students, address the needs of under served communities, and increase the number of clinically excellent, culturally competent and socially conscious healthcare providers. MAPS is a free organization in which all students from all backgrounds are encouraged to join! + +Check out our pamphlet for additional information about MAPS: https://issuu.com/nsahli98/docs/mapspamphletissuu.docx', '886', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6be637bd-180d-44ea-be6e-3fe635af7f4a', 'Mixed Student Union', 'A cultural based student group whose purpose is to foster a sense of identity and community for Northeastern University students who identify as biracial, multiracial, multiethnic, and multicultural. ', 'A cultural-based student group whose purpose is to foster a sense of identity and community for Northeastern University students who identify as biracial, multiracial, multiethnic, and multicultural. Furthermore, our association desires to promote dialogue, advocacy, education, and awareness for the diverse and unique issues relevant to students from multiracial backgrounds on NU''s campus.', '140', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d546d680-e6a3-4f06-aa9b-e6f9e9dbd8c3', 'Multi-diverse Unified Leaders in Technology Industry', 'MULTI aims to promote diversity and inclusion in the technology field, and to uplift and empower students from all backgrounds pursuing a career in the industry.MULTI fosters an inclusive learning community by hosting a variety of events, including gro..', 'MULTI aims to promote diversity and inclusion in the technology field, and to uplift and empower students from all backgrounds pursuing a career in the industry. MULTI fosters an inclusive learning community by hosting a variety of events, including group discussions, career talks, and workshops. MULTI also provides a platform for discussing student affairs and engaging with Khoury’s diversity and inclusion initiatives.', '467', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ebd75475-11e9-4077-b4cc-9591ef458754', 'Multicultural Greek Council', 'The Multicultural Greek Council is a co-educational governing council serving its fraternity and sorority affiliated members, the University, and local communities as well as our cultural community, campus, and multicultural groups and clubs.', 'The Multicultural Greek Council is a co-educational governing council serving its fraternity and sorority affiliated members, the University, and local communities as well as our cultural community, campus, and multicultural groups and clubs. The purpose of the Multicultural Greek Council (MGC) is to increase awareness of various cultures and ethnicities to the recognized organizations and the community as well as promote a positive image of these organizations through cooperation, communication, and participation. The MGC serves as a body to unite and promote growth among our own organizations as well as to other fraternities and sororities on campus. Below are the current active organizations recognized within MGC: + +Active Member Organizations + + + +Beta Chi Theta Fraternity, Inc. + +Kappa Phi Lambda Sorority, Inc. + +Lambda Phi Epsilon Fraternity, Inc. + +Omega Phi Beta Sorority, Inc. + +Pi Delta Psi Fraternity, Inc. + +Sigma Beta Rho Fraternity, Inc. + +Sigma Psi Zeta Sorority, Inc. + + + +Associate Member Organizations + + + +Lambda Pi Chi Sorority, Inc. + + + + ', '59', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e410a6d0-4dbd-4969-9a6c-f37c122cebbc', 'Multicultural International Student Association', 'MISA is a community for international students and interested undergraduate students that unites, promotes, and explores cultural diversity and identity. We hold weekly meetings in order to provide cultural celebration and career development. + +', 'We at MISA aim to bring Northeastern students from various cultures and backgrounds together, creating a space for international students to unite, promote and explore diversity and identity. + + + +Did you know that Northeastern University is home to one of the largest international student communities in the United States, with over 20,000 international students coming from over 147 countries? MISA is a community that celebrates these students and their unique international upbringing. Despite this club catering to international students, we find that by welcoming all undergraduate students it will also give students space to understand cultural differences further and close the cultural gap. + + + +Events we plan to host include personal development and small sessions that are often not advertised broadly at Northeastern (eg. how-to sessions for co-op processes, visa status, travel records, social security numbers, etc). These events will invite various Northeastern offices and specialists as special speakers to ensure we are providing the most up-to-date and accurate resources. MISA also plans to host food fairs featuring cuisines from around the world, speaker series featuring global professionals, open forums on relevant cultural issues, and inter-club collaboration to celebrate cultural holidays.', '1015', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7f22bdd2-df9a-4c9a-82e6-ee4b2d602783', 'Music In Hospitals and Nursing Homes Using Entertainment As Therapy', 'MIHNUET brings uplifting music to patients and residents of hospitals and nursing homes, harnessing the power of music to enrich quality-of-life and connect communities.', 'MIHNUET is a NEU student-led initiative that brings student musicians together to perform uplifting music for residents and patients in nursing homes and hospitals in the local Boston community. Members perform in concerts at local nursing homes and hospitals, bringing comfort and joy to patients through music. Northeastern members of MIHNUET may choose to perform solo or in small groups. These small groups are a great opportunity to make connections with other Northeastern students. Students that are passionate about performing, playing music with others, or giving back to the community are encouraged to perform!', '410', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d6e7de62-50c2-4329-812a-af5203622951', 'Mutual Aid', 'NU Mutual Aid is a student network dedicated to the well-being of all Northeastern students, staff, and community members during the COVID-19 pandemic and beyond. We aim to work with all members of our community to share and provide necessary resources.', 'NU Mutual Aid is a student network dedicated to the well-being of all Northeastern students, staff, and community members during the COVID-19 pandemic and beyond. We aim to work with all members of our community to organize and alleviate difficulties faced during these times. Our past and current projects include weekly mobile food pantries, a community fridge, winter clothing drive, textbook reimbursement, sexual health product distribution, and menstrual hygiene distribution. We are always looking for students dedicated to working on new projects for our community and volunteers to help with existing projects. You can learn more at numutualaid.org and @numutualaid. *Please note that the positions listed on Engage do not reflect an e-board as we do not have formal leadership positions. All members of NU Mutual Aid are equal. *', '342', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('cfce96fc-118b-46db-89f1-5c4d7593a499', 'NakhRAAS', 'NakhRAAS aims to be Northeastern''s premiere competitive garba and raas team. The group''s primary goals are to educate Northeastern students about the traditional dance forms of garba and raas and compete in the national competitive raas circuit.', 'NakhRAAS aims to be Northeastern''s premiere competitive garba and raas team. The group''s primary goals are to educate Northeastern students about the traditional dance forms of garba and raas, compete in the nationally competitive raas circuit, and to just simply get together and have fun!', '586', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('cedf33a6-46bc-402b-b498-988c71fb5fd4', 'National Community Pharmacists Association', 'The National Community Pharmacists Association (NCPA) is an organization focused on the growth and prosperity of independent pharmacists across the United States. NCPA has student chapters at many schools of pharmacy. ', 'The National Community Pharmacists Association (NCPA) is an organization focused on the growth and prosperity of independent pharmacists across the United States. NCPA has student chapters at many schools of pharmacy. NCPA should pique your interest if you have worked in an independent pharmacy, aspire to work in an independent pharmacy, or perhaps are pursuing a business minor. NCPA Student Affairs offers pharmacy students a wide array of opportunities to broaden and enrich their educational experience, gain valuable real world skills, earn scholarships, and have fun in the process. Our mission is to encourage, foster, and recognize an interest in community pharmacy ownership and entrepreneurship among the future leaders of their profession. Becoming a member of the NU chapter of NCPA will allow you to participate in the Business Plan Competition and provide you access to resources to further your career in pharmacy. NCPA Student Affairs provides great resources for students to hold Prescription Disposal Programs, plan a Health Fair, and many other activities to benefit the public. NCPA membership is open to all pharmacy students (years 1-6) and for non-pharmacy students interested in participating in the Business Plan Competition.', '679', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('dc4bec06-5410-4827-9603-801ed6e5efb6', 'National Marrow Donor Program', 'NMDP is a nonprofit organization dedicated to saving through blood stem cell transplants. The organization matches blood disease patients to potential donors, and the chapter on campus strives to expand the donor registry by hosting swabbing events. + +', 'NMDP (formerly Be The Match) is a nonprofit organization dedicated to saving lives through blood stem cell transplants. The organization’s mission is to advocate for patients with blood cancers by matching them to potential donors. The chapter on campus strives to expand and diversify the donor registry by hosting swabbing events both on and off campus. In the 2022-23 school year, the chapter added 957 swabs to the registry. Our commitment to fighting for better outcomes and more lives saved continues. ', '234', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7e496706-f397-4c65-a156-c7c9edf5cb15', 'National Organization of Minority Architecture Students', 'NOMAS is dedicated to providing healing and supportive spaces for architecture students of various minority groups to express their creativity and identities. We serve as advocates for various social identity groups within the School of Architecture.', 'The Northeastern University Chapter of the National Organization of Minority Architecture Students (NOMAS) was initiated in order to create a community of students who support the advances of minority students in architecture and embrace differences of all kinds within the field. Additionally, this chapter was established to help provide these students with opportunities to get involved with the architecture community, especially with other minority architects. The organization will hold numerous activities for students and will also work towards sending students to other events both in and out of the Boston area. This organization also provides students with an opportunity to become informed and act on social justice issues, as well as to give back with community service projects.', '184', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('437f119f-49ab-4fb7-8661-318ba88e8a33', 'National Pan-Hellenic Council - Northeastern University Chapter', 'Northeastern University''s National Pan-Hellenic Council comprises of the historically African-American fraternities and sororities in the Boston area. ', 'Northeastern University''s National Pan-Hellenic Council is currently comprised of the following Divine 9 organizations: Alpha Phi Alpha Fraternity, Incorporated, Alpha Kappa Alpha Sorority, Incorporated, Kappa Alpha Psi Fraternity, Incorporated, Omega Psi Phi Fraternity, Incorporated, Delta Sigma Theta Sorority, Incorporated, Phi Beta Sigma Fraternity, Incorporated, Zeta Phi Beta Sorority, Incorporated, Sigma Gamma Rho Sorority*, Incorporated, Iota Phi Theta Fraternity, Incorporated* *Denotes inactive, unrecognized D9 organizations on campus. + +The mission statement of the National Pan-Hellenic Council is "unanimity of thought and action as far as possible in the conduct of Greek letter collegiate fraternities and sororities, and to consider problems of mutual interest to its member organizations."', '141', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e7ef4e42-b347-4244-8add-2d124d74e76d', 'National Society of Leadership and Success', 'As the largest collegiate leadership honor society in the United States, there are 700+ NSLS chapters nationwide and nearly 2 million inducted members. We build leaders, support students in achieving their goals, and improve the world in the process.', 'Welcome to the National Society of Leadership and Success, the largest collegiate leadership honor society in the United States! With over 700 NSLS chapters across the nation and nearly 2 million inducted members, we are a vibrant community dedicated to building leaders and supporting students in achieving their goals. By providing valuable resources, mentorship, and opportunities for growth, we empower our members to make a positive impact on their campus and in the world. Join us on this exciting journey of personal development and making a difference!', '630', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('11580607-285f-448f-895d-85eee2eeda17', 'Net Impact of Northeastern University', 'Net Impact is teaching students how to act now and become the leaders of the social and environmental revolutions of the 21st century.', 'From sustainable fashion and food systems to environmental justice and green policy, Net Impact is an interdisciplinary community eager to put the planet and social justice at the center of every discussion. Comprised of a variety of backgrounds and majors, our members come together at engaging weekly meetings, fun social activities, professional networking opportunities and community service events in a shared effort to put sustainability at the forefront of the community''s consciousness. + +Follow us on Instagram to stay up to date with Net Impact Northeastern: + +https://www.instagram.com/netimpactnu/ + + ', '357', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7507875b-e92f-456f-a71d-e9424ed86675', 'Network Science Institute Graduate Student Association', 'We are the Graduate Student Association for students in or affiliated with the Network Science Institute. ', 'We are the Graduate Student Association for students in or affiliated with the Network Science Institute.', '1021', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a7145bf5-5609-41af-84ef-1a88d0987326', 'NEU Chinese Language Table', 'NEU Chinese Language Table allows students studying or familiar with Mandarin to socialize through the language. Our events offer a casual learning environment and various activities to engage with Chinese culture.', 'NEU Chinese Language Table is a place for students learning or familiar with Mandarin to socialize through the language. Our events offer a casual learning environment and various activities to engage with Chinese culture. Our weekly meetings alternate between conversational table meetings and basics meetings, through which beginners can learn from and practice Chinese with native and advanced speakers. Our Mentorship program connects beginner and intermediate Mandarin speakers with advanced or Native speakers. We organize outings and on-campus events to supplement our weekly meetings and encourage everyone to use Mandarin in real-world settings. Students studying formally in classes, heritage speakers, native/fluent speakers, those self-studying the language, and anyone interested in learning more about Mandarin and Chinese culture are all invited to attend! + +Connect with us to stay updated on upcoming meetings/events here: https://linktr.ee/neuclt', '966', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('628faa74-5251-481a-8c71-6c7784525c31', 'New Renaissance Theatre Company', 'New Renaissance Theatre Company is centered on producing plays with a focus on representation, especially for students of color. Our goal is to diversify the theatre community at Northeastern in a collaborative and friendly environment.', 'New Renaissance Theatre Company is centered on producing plays with a focus on representation, especially for students of marginalized communities. Our goal is to diversify the theatre community at Northeastern in a collaborative and friendly environment. This club will help bridge different artists and their communities into theatre at Northeastern regardless of experience level. Everyone has a voice, and everyone''s voice should be heard.', '484', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('aae74af5-e58c-435c-8d85-2d32c24a7ddb', 'No Jokes', 'No Jokes is an improv comedy troupe consisting of two groups. Our auditioned troupe performs on campus and in the Boston area. Our 2nd group is our Jams community. Jams are an open no commitment no pressure space to try out improv comedy. Come try it!', 'No Jokes is an improv troupe that serves as an outlet for people wanting to do comedic improv. Our group is twofold: an auditioned performance troupe that holds monthly shows on campus as well as other shows around the city and our Jams community. Jams are a no commitment weekly opportunity to try improv and learn the artform. Jams are held every Thursday from 8:00-9:30pm ', '613', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8c5ae4c5-bd87-47a3-ba85-6fe0c4231bd6', 'No Limits Dance Crew', 'NLDC is a diverse group made up of students who share a passion for dance. Our organization welcomes all levels and styles and we pride ourselves on our "self-audition" process. We hold a recital at the end of each semester showcasing our members'' work!', 'NLDC is a diverse group made up of students who share a passion for dance. Our organization welcomes all levels and styles and we pride ourselves on our "self-audition" process. We hold a recital at the end of each semester showcasing our members'' work!', '297', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b21fcf9a-1969-498a-a47e-53e7cf06ce7d', 'Nor''easters A Cappella', 'Northeastern''s premier co-ed a cappella group', 'Northeastern''s premier co-ed a cappella group', '442', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1407cf7f-5299-4a2f-82b8-a50e5c1df406', 'Noreste Ballet Company', 'Noreste Ballet Company (NBC) is Northeastern University''s only ballet-focused organization for dancers of all levels and backgrounds. Our members participate in weekly classes and classic ballet performances such as The Nutcracker, Swan Lake, and more. ', 'Noreste Ballet Company’s motto is “A Classical Ballet Company Without Barriers.” Everyone at all experience levels is welcome to join NBC. We are a resource for anyone interested in Classical Ballet who wants a way to perfect their technique and perform. NBC makes Classical Ballet accessible to those who could not continue or have never begun. + +We hold no-cut auditions for performances at the end of each semester. These performances are derived from Ballet pieces such as The Nutcracker, Swan Lake, Aurora, Giselle, and more. + +Our dancers perform en pointe and en flat depending on previous experience. ', '787', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('63ba4f64-1bab-4d53-97a4-58cb4223678e', 'Northeastern African Student Organization', 'For many years NASO (Northeastern University African Student Org) has served as a home away from home for African Students and students interested in Africa and African issues.', 'For many years NASO (Northeastern University African Student Organization) has served as a home away from home for African Students and students interested in Africa and African issues. Through our many events, and weekly discussions we have created a haven where African students can talk about issues concerning them and learn from each other, and have fun. Africa is the second largest continent in the world consisting of over 44 countries, hundreds of languages and much more. + +NASO Meetings: Every Thursday at 6PM', '753', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f72f69e9-b9e4-4e70-abe3-d92499451323', 'Northeastern Association for Women in Math Student Chapter', 'The goal of NEU AWM is to empower women and other underrepresented gender identities by providing academic and professional resources while creating a communal environment with an awareness to the unique features of underrepresentation in STEM. ', 'The formation of the chapter was speareheaded with the goal of creating awareness to the underrepresentation of women in STEM, and more specifically, in mathematics. The chapter’s mission coincides with AWM’s community mission statement, “We hope our AWM Student chapters will become communities with an awareness of and sensitivity to the unique features – both positive and negative – of promoting gender equity in the mathematical community. Our aim is in reducing barriers for historically under-represented gender identities and gender expressions. To this end, the AWM community strongly stands by its nondiscrimination statement to create a supportive environment for all." + +The core of the NEU AWM Student Chapter’s work involves the development of events/workshops that aim to support chapter members in fulfilling their academic and professional goals. The chapter hopes to foster a communal environment within the math department that empowers women and other underrepresented gender identities in STEM to conduct research, experience co-op, study abroad, and more. Another portion of the Chapter’s duties is to offer resources to students via email and social media about potential opportunities in the mathematical sciences. Finally, the Chapter hopes to create spaces that allow students to network – whether on campus or through the AWM Student Chapter network – by facilitation of chapter gatherings. + + + +', '969', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('141c5e8c-8b23-4db6-b3fe-b3bfa86e1d1b', 'Northeastern Bhangra Team', 'The Northeastern Bhangra Team is a dance team that performs the Indian cultural folk dance of bhangra, originating from the state of Punjab. We have performed at numerous on-campus events and also compete around the country, primarily in the Northeast.', 'Northeastern Bhangra is a competitive dance team that performs the Indian cultural folk dance of Bhangra, originating from the state of Punjab. We have performed at numerous on-campus events and also compete around the country, primarily in the Northeast. Our members consist of students who are passionate about dance and cultural appreciation. We usually run tryouts in the beginning of the fall and spring semesters. Feel free to contact us through our email newenglandbhangraclub@gmail.com or our Instagram @newenglandbhangraclub for more information! + +Virtual Involvement Fair: https://youtu.be/TGevvpqhjkY ', '70', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ee3f8fc7-f7ad-41a6-968d-34a19357da47', 'Northeastern Black Student Association', 'Founded in 1976, The Northeastern Black Student Association serves as the umbrella organization for all Black Student Organizations on campus. We were originally founded in 1976 to be political organization dedicated to the advancement of Black student...', 'Originally founded as a political organization in 1976, the Northeastern Black Student Association serves as the umbrella organization for Black students on campus, acting as a medium between Black students at large and officials of higher authority at Northeastern University. NBSA seeks to establish a dominant presence both on campus and in the surrounding community as an organization focused on the political, historical, and socio-cultural well being of our fellow Black students. ', '96', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('526687f9-0c1e-4494-a15c-052bcad744a9', 'Northeastern Chapter of Kappa Kappa Psi', 'A band service fraternity that seeks to support the band programs of the university through service projects, musical leadership, and other means.', 'A co-ed band service fraternity that seeks to support the band programs of the university through service, musical projects and leadership. Members from the Concert Band, Pep Band, Symphony Orchestra, and Wind Ensemble serve the whole of NU Bands in a national effort to provide support for our college and university bands while fostering lasting bonds of brotherhood. Our chapter sponsor is Assistant Director of Bands, Allison Betsold.', '726', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('37f90c6b-c8f1-41a2-9d45-ccfca86132f4', 'Northeastern Cheerleading', 'The Northeastern University cheerleading team is a talented group of student athletes brought together by their passion for cheerleading and the University. The team takes pride in representing Northeastern on and off campus. The Cheerleading team’s mi...', 'The Northeastern University cheerleading team is a talented group of student athletes brought together by their passion for cheerleading and the University. The team takes pride in representing Northeastern on and off campus. The cheer team is a competitive squad that travels to the NCA College Nationals in Daytona, Florida in April to compete Division 1. In the history of the team, NU has competed Large Coed, All-Girl, and Small Coed and even captured the title of Grand National Champions in 2002. Most recently, the team placed 8th in All-Girl Intermediate, and will be returning this year in hopes of placing in the top 5. Along with their passion for competing, the cheerleading team’s mission is to promote school spirit throughout the year at different events around campus. The cheerleaders perform at all men’s and women’s home basketball games and have a dynamic presence at a variety of campus events including new student welcome days, Convocation, Winter Fest, Beanpot, and championship games for other varsity teams. At the end of the basketball season, the team travels to cheer at the CAA Conference Championships and the NCAA tournament if applicable. During the 9 month season, the team practices at least twice a week and is expected to go to the gym independently as well to prepare for nationals. Tryouts for all students, new or returning, is typically held in September. A spring video tryout is required for incoming freshmen and those who cannot attend tryouts on campus in order to travel to NCA summer camp. Please reach out with any questions or contact us at NortheasternCheerleading@gmail.com.', '208', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('def4fefe-bcb9-4372-b31d-9a0a4a975b8c', 'Northeastern Club Archery', 'A club sport that teaches members of all levels how to shoot and compete with recurve bows. Our practices are Wednesdays and Thursdays from 7pm to 11pm, and our range is Ace Archers in Foxborough, MA. Team vans are provided, and coaches are available.', 'A club sport that teaches members of all levels how to shoot and compete with recurve bows. Our practices are Wednesdays and Thursdays from 7 pm to 11 pm, and our range is Ace Archers in Foxborough, MA. Team vans are provided, and coaches are available to help with any and all questions. If interested, contact us through our email neuarchery@gmail.com or message us on Instagram @theofficialnortheasternarchery. + + + + ', '154', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('aed9382d-3b0f-4ab5-98d1-b9cdeccdf970', 'Northeastern Club Badminton', 'We are the competitive badminton team here at Northeastern! We compete in collegiate tournaments at both a Regional and National level, and have qualified for D1 the past two consecutive years. We host intensive practices twice a week.', 'Welcome to Northeastern Club Badminton! We are the home of the competitive badminton team here at Northeastern University. Our team is dedicated to competing in collegiate tournaments at both Regional and National levels, with a proud track record of qualifying for Division 1 for the past two consecutive years. Join us for intensive practices twice a week to hone your skills and be a part of our vibrant badminton community!', '427', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('23493bea-c053-470b-abe3-bf0b3f0336d6', 'Northeastern Club Cycling', 'The NU Cycling Club consists of riders of all abilities, from Beginner to Pro, and welcomes anyone with a love for cycling, whether it’s Road, Mountain, Cyclocross, or Track. We have a comprehensive race team that competes all across New England.', 'The Northeastern University Cycling Club consists of riders of all levels and abilities, from Beginner to Pro, and welcomes anyone with a love for cycling, whether it’s Road, Mountain, Cyclocross, or Track. We have a comprehensive race team that competes in the Eastern Collegiate Cycling Conference. We consistently have one of the most successful race teams in our conference, and we are always striving to improve on our results. Our racers have competent support from team experts and a close network of friends and affiliates. At the core of our team is a dedicated group of riders who love to be on their bikes no matter what the reason. Whether you’re looking to spin around the city, find some new trails, or race in the collegiate national championship, we have a place for you.', '330', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('97169846-8eea-485b-bd67-c01c3375cfbc', 'Northeastern Club Field Hockey', 'Competitive Co-ed Club Field Hockey Team', 'Competitive Co-ed Club Field Hockey Team + +The past 17 years we have qualified for the national tournament. We are the current National Champions after winning the tournament in 2019 and 2021. Additionally, we made it to the finals in the national tournament in Fall 2017 and Spring 2019. The team consists of about 20 players.​We hold a tryout every Fall Semester, and our season runs from September to about the third week in November. We participate in a few Spring tournaments with the team that we have from the Fall. There is not a second try out, but there may be a few open practices. Please email us if this is something you might be interested in.Fall practices are 2-3 times a week, and we travel to games on Saturdays and Sundays almost every weekend. There may be a few games at night during the week, but most games are on the weekends. Some games are day trips but we also travel to Maryland and Virginia Beach.​It is a commitment, but completely worth it!', '412', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c47eb64f-218e-4a51-aac7-c6997bf46768', 'Northeastern Club Softball', 'Northeastern Club Softball is a fun and competitive team of dedicated players. We are a part of the New England South conference, along with UConn, UMass Amherst, Stonehill, URI, and Providence. Contact nusoftball10@gmail.com for more info!', 'Established in 2010, Northeastern University Club Softball continues to grow and develop every season. In the past few years, we have been New England Regional Champions twice and competed in the NCSA in Columbus, Georgia three times. We are a member of the National Club Softball Association as part of the New England South conference, along with UConn, UMass Amherst, Stonehill, URI, and Providence. We practice two or three times a week with games on weekends in the fall and spring. Games are in triple or double-header format with both home and away games. We play official NCSA games within our conference as well as non-conference games against other clubs or community college teams. Practices are typically held on Carter field, inside Cabot Cage and at Extra Innings batting cage in Watertown. Home games are typically played on Carter field. Tryouts are held at the beginning of each semester. Please contact the e-board at nusoftball10@gmail.com to learn more about NU Club Softball!', '712', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9c29e773-7213-43a2-b49b-f08f1f7b1605', 'Northeastern Club Tennis', 'An organization united by our love for the wonderful sport of tennis. Our team is a great balance of competitive and just-for-fun players. Tryouts are twice a year, in the fall and in the spring. Contact us if you''re interested or have questions!', 'An organization united by our love for the wonderful sport of tennis. Our team is a great balance of competitive players, and players who just want to hit for fun. Tryouts are twice a year, once in the fall and once in the spring. + +Contact us if you''re interested or have any questions!', '949', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('10fd121e-679b-4dbc-9493-be7b01532cd8', 'Northeastern DIY Craft Club', 'The purpose of the Northeastern DIY Craft Club is to provide students with a creative, comfortable atmosphere to learn and create crafts that can be worn, useful, and decorative. We will cater to club members’ artistic and creative interests by gather...', 'The purpose of the Northeastern DIY Craft Club is to provide students with a creative, comfortable atmosphere to learn and create crafts that can be worn, useful, and decorative. We will cater to club members’ artistic and creative interests by gathering their feedback and requests for future crafts. The Northeastern DIY Craft Club will reach out to the Northeastern community through holding campus events where students can view, purchase, and learn about our crafts.', '507', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('58b7de10-9218-4f92-839b-8c833d12de37', 'Northeastern Entertainment System', 'Northeastern''s game club! We meet weekly and play casual multiplayer games as well as whatever games or systems our members feel like bringing. Join our Discord here: https://discord.gg/vNEShfn', 'Northeastern''s game club! We meet weekly and play casual multiplayer games as well as whatever games or systems our members feel like bringing. We plan to be in person this semester if possible. Join our Discord here: https://discord.gg/vNEShfn', '1011', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6b759b65-9244-47dd-9e48-2f8696c4df35', 'Northeastern Game Development Club', 'The Northeastern University Game Development Club offers students the chance to explore their passion for making games with fellow students and the community beyond! Events include lectures by students and professionals, tutorials, game jams, and more!', 'The Northeastern Game Development Club offers students a space to express their passion for game development in a multitude of ways. We host weekly meetings in which we lecture students on a topic in game design and participate in short design focused activities. Our club also hosts at least 2 game jams a semester, which gives students a great opportunity to explore new roles, connect with like-minded peers, create potential portfolio pieces, and have fun along the way. We welcome all students, majors, and skill levels who are passionate about game development! + + + +If you have any questions about our club feel free to email the club at NUGDC-officers@lists.ccs.neu.edu or our President Austin at szema.a@northeastern.edu! We also have other social media linked below, feel free to follow us and interact/dm any questions you might have. + +Discord: https://discord.gg/TannubHvey + +Instagram: https://www.instagram.com/nugamedevclub/ + +Twitter: https://twitter.com/neu_gdc', '966', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f4981899-fa3c-400d-ab75-bd290a585bf9', 'Northeastern Lady Maddogs', 'Northeastern University Women''s Rugby Football Club is a Division I club sport team. New recruits are always welcome! Contact Milia Chamas at NortheasternWomensRugby@gmail.com for more information. No experience necessary!', 'Northeastern University Women''s Rugby Football Club is a Division I club sport team. New recruits are always welcome! Contact Milia Chamas at NortheasternWomensRugby@gmail.com for more information. No experience necessary!', '812', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0cded157-ee2b-46a9-843c-b1871bd21ff0', 'Northeastern Men''s Club Ice Hockey', 'Northeastern Men''s Club Hockey is a member of the ACHA D2 Northeast Region and the NECHA. The team has made appearances at the ACHA National Tournament in ''18, ''19, ''20, and ''22 with a Final Four finish and one trip to the National Championship game. ', 'Northeastern Men''s Club Hockey is a member of the ACHA D2 Northeast Region and the NECHA Patriot East Division. With four trips to the ACHA D2 National Tournament in the last five years, Northeastern Men''s Club Hockey has had the most national success of any team in the Northeast over the last few seasons. Northeastern Men''s Club Hockey appeared in the Final Four in 2018 and the National Championship game in 2019. The team practices twice a week at Matthews Arena during the Fall and Spring semesters along with an off-ice team workout. The season begins in mid/late September and ends in late March. #HowlinHuskies ', '58', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('46f49b5e-b5eb-4efc-b861-4367d125fae6', 'Northeastern Men''s Club Volleyball', 'Men''s Club Volleyball is a member of the New England Collegiate Volleyball League (NECVL) and National Collegiate Volleyball Federation (NCVF). We participate in a variety of tournaments in the Fall, with our regional league being in the Spring.', 'Welcome to the Northeastern Men''s Club Volleyball! We are a proud member of the New England Collegiate Volleyball League (NECVL) and the National Collegiate Volleyball Federation (NCVF). Our club thrives on camaraderie, competition, and community. Throughout the Fall, we lock horns with teams from near and far in exhilarating tournaments. As the seasons shift, we gear up for our regional league matches in the Spring. Come join us, whether you''re a seasoned player or just starting out - we have a spot for everyone!', '569', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e3bbd599-240c-4de2-a374-efe1e2651b01', 'Northeastern Mens Lacrosse', 'Founded in 1983, the Northeastern Mens Lacrosse Team has a long history of tradition and success. As a member of the Continental Lacrosse Conference and the Men''s Collegiate Lacrosse Association, we are dedicated towards the goal of winning Nationals.', 'Founded in 1983, the Northeastern Men''s Lacrosse Team has a long history of success. We are a member of the Continental Lacrosse Conference and Men''s Collegiate Lacrosse Association, or MCLA. + +Our team offers a very competitive lacrosse experience on a national scale without the overwhelming pressures and time commitment of a DI NCAA lacrosse program. Our student-athletes are expected to maintain a full dedication to the program and team commitments but are provided the latitude to focus on academics. Players are encouraged to take part in various activities beyond lacrosse and we are proud of the diversity of experiences our players graduate from the University having participated in. + +All members of our organization are committed to winning a National Championship and we prepare, practice, and work towards that goal on a daily basis.', '690', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('50f0db32-d29b-4e91-a454-efdcab69f241', 'Northeastern Powerlifting', 'Powerlifting is a strength sport that consists of three lifts at maximal weight. Founded in 2007, Northeastern''s Club Powerlifting provides a motivating, safe, and fun environment to learn how to perform these lifts with proper technique', 'Powerlifting is a strength sport that consists of three lifts at maximal weight- squats, bench press, and deadlifts. Founded in 2007, NUPL has both men''s and women''s teams, and we strive to promote an environment where all of our teammates can grow stronger, create friendships, and compete against some of the best collegiate powerlifting teams in the country. + +We train raw in the fall semester and train equipped in the spring semester. Tryouts occur once a year in the beginning of Fall semester, and membership is a commitment for the full school year. + +We hold a competitive tryout and are looking for athletes that are eager to learn, coachable, ask good questions, and contribute positively to the team environment! You do not have to be the strongest in the room to make the team.', '1019', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5b762b9d-5adb-4394-9399-6232667536e3', 'Northeastern Recreational Climbing Club', 'The Northeastern Recreational Climbing Club (NRC) is an inclusive student organization dedicated to the growth of the climbing community on campus at the recreational level, open to all students regardless of grade, gender, skill level, or experience.', 'The Northeastern Recreational Climbing Club (NRC) is an inclusive student organization dedicated to the growth of the climbing community on campus at the recreational level. It is open to all students regardless of grade, gender, skill level, or experience. The club meets on Mondays and Wednesdays inside Ruggles at 6:20pm. We then take the T over to Rock Spot Climbing Gym by 6:30 (https://goo.gl/maps/G5Ns5DYtapo) to climb from 7-9pm. NRC also hosts meetings on campus once per month to discuss climbing, watch climbing movies, and plan outdoor climbing trips! NRC is dedicated to maintaining a great community of climbers at Northeastern. New to climbing or want to improve your technique? Want to get stronger through climbing-based workouts? Our training coordinator and e-board are committed to helping you improve your skills. Keep an eye out as we start workouts and training sessions for the year. NRC also provides many resources to the climbing community at Northeastern, including safety gear that all club members can borrow, discounts at local gyms, and discounts to select online retailers. If you’re interested in joining NRC, send us an email at nurecclimbing@gmail.com or join our Slack here: https://join.slack.com/t/nurecclimbing/shared_invite/zt-3rk41bsj-Vds9ItNlZbv_SFV~xVfE7w. You can also follow the club on Instagram @nurecclimbing for updates and community highlights. We look forward to climbing with you soon! Climb on.', '838', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('89300221-e78e-42d5-93d4-4e91add9e857', 'Northeastern Shakespeare Society', 'The Northeastern Shakespeare Society is a student-run, classical theatre group. Focusing on making Shakespeare accessible, we produce two productions a year free to the Northeastern community and general.', 'The Northeastern Shakespeare Society is a student-run, classical theatre group. Focusing on making Shakespeare accessible, we produce two productions a year free to the Northeastern community and general public.', '76', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('74eaea90-3f20-4dec-bdc6-1ac0575b3bc4', 'Northeastern Table Tennis Club', 'Founded in 2001, the Northeastern Table Tennis Club is a member of the National Collegiate Table Tennis Association. We compete in the Upper New England Division along with Dartmouth, Harvard, MIT, Boston College, UMass, and Stonehill College. Our Coed...', 'Founded in 2001, the Northeastern Table Tennis Club is a member of the National Collegiate Table Tennis Association. We compete in the Upper New England Division along with Dartmouth, Harvard, MIT, Boston College, UMass, and Stonehill College. + +Our Coed A team is currently ranked #1 in the division and continues to improve its national standing every year. Each year, our club sends its Coed A, Coed B, and Women’s teams to compete in the fall and spring divisionals. Depending on standings, the teams/individual players are invited to compete in the Northeast Regional Championships and National Championships. + +Tryouts to join these teams are usually held in the fall semester. We usually practice in the lobby of the Matthews Arena or at the Boston Table Tennis Center. While we are a competitive club, we welcome players of all levels to come play for fun. If you have any questions, please email us at northeasternttc@gmail.com, and don’t forget to follow us on Facebook for the latest announcements. Before you can participate in club activities, you must register for the club at: https://neu.dserec.com/online/clubsports_widget?fbclid=IwAR1HSljHWLbsv9LS6DWI5yrLR97WbwQHLgcbia43HuNP4VXzKC42jsvlGXs', '303', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3d03364f-32e7-45c3-aa2c-84d533ce0fdb', 'Northeastern Tabletop Roleplaying Society', 'We are Northeastern''s tabletop roleplaying gaming group! Our goals are to bring together people who are passionate about tabletop gaming, and to provide opportunities to play them. We run a variety of games at our weekly meetings. Come join us!', 'We are Northeastern''s tabletop roleplaying gaming group! Our goals are to bring together people who are passionate about tabletop gaming, and to provide opportunities to play them. We do that by maintaining an active discord server where people can talk about the hobby, hosting one-shots at our weekly meetings, and connecting DMs to players. + + + +We welcome newbies and veterans! We have many friendly, experienced players who would love to teach or discuss various systems. + + + + + +Everything happens on our Discord. We run weekly one-shot games exploring various TTRPG systems. You can check our Google calendar for details about our weekly meetings, or turn on Discord notifications for reminders. The Discord invite code is DhTjRUU. Link is https://discord.gg/9FQRkpGTjt + +', '326', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4e1fc549-f081-45c3-aaaf-089d09fb4c95', 'Northeastern Television', 'NUTV is Northeastern University''s only student-run video production club. Made up of three departments (Entertainment, Sports, and News), we strive to entertain and inform the campus community. From writing to filming to acting to editing, we do it all.', 'NUTV is your source for campus news, sports, and entertainment programming! As Northeastern''s only student-run film production club, NUTV is your opportunity to make whatever videos you want while making great friends! Whether you want to report stories for the News department, interview athletes for the Sports department, or make comedy sketches and drama short films with the Entertainment department, NUTV has the equipment and the know-how to help you create whatever you can imagine! + +https://www.youtube.com/watch?v=Xpj1Lw8IIo0 + +Sound fun? Sign up for our mailing list here, or feel free to come to any of our weekly meetings: News: Tuesday at 6pm EDT Cargill 097| Entertainment: Tuesdays at 7pm EDT 097 Cargill Hall| Sports: Mondays at 7:00pm EDT 243 Richards Hall. No experience necessary! + + + +Learn more about us on our website here! Check out our YouTube Channel to see all our videos here! ', '37', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2ae529af-1098-47d7-95e9-3bbe745bad2f', 'Northeastern University Alpine Ski Team', 'The Northeastern Huskies alpine ski racing team is a United States Collegiate Ski and Snowboard Association (USCSA) alpine skiing program that represents the Northeastern University. The Huskies are a member of the Thompson Division in the East Confere...', 'The Northeastern Huskies alpine ski racing team is a United States Collegiate Ski and Snowboard Association (USCSA) alpine skiing program that represents the Northeastern University. The Huskies are a member of the Thompson Division in the East Conference.', '325', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5d869f76-26c2-46cc-80bc-efe046961bc7', 'Northeastern University American Medical Student Association', 'NU AMSA offers students from all backgrounds a chance to join a community of pre-medical focused individuals like themselves. We provide helpful seminars and activities, invite speakers, mentorship, and collaborate with other student-run organizations.', ' + +NEU AMSA is the premier pre-medical student association at Northeastern and a chapter of the National AMSA organization, the largest and oldest independent association of physicians-in-training in the United States. We host informative meetings for all pre-med students at Northeastern, from 1st years unsure of how to navigate being at pre-med at Northeastern to 5th years needing personalized advice for their pre-med path. We also offer the AMSA Mentor program, where underclassmen pre-meds are paired with an upperclassman pre-med mentor who can offer insight into how to succeed as a pre-med at Northeastern. + + + + + + + +If you are a pre-med student at Northeastern, we highly encourage you to join! We look forward to working with you all to make this a great year! + +', '806', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0a1fdc09-8e2c-4a7e-82fc-4b7ad7d5bdc3', 'Northeastern University American Medical Women''s Association', 'The American Medical Women''s Association is an organization which functions at the local, national, and international level to advance women in medicine and improve women''s health. We achieve this by providing and developing leadership, advocacy, educa...', 'The American Medical Women''s Association is an organization which functions at the local, national, and international level to advance women in medicine and improve women''s health. We achieve this by providing and developing leadership, advocacy, education, expertise, mentoring, and strategic alliances.', '90', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6fa06ea9-3fba-4282-8533-15317d7899e2', 'Northeastern University Animation Club', 'An organization sponsored by the Chair of the Northeastern Animation/ Digital Arts department, this club is both for students enrolled in the major and also any students interested in learning more about animation. Our goal is to facilitate interest...', 'An organization sponsored by the Chair of the Northeastern Animation/ Digital Arts department, this club is both for students enrolled in the major and also any students interested in learning more about animation. Our goal is to facilitate interest in and host activities for students interested in Digital Art and Animation of all kinds including traditional, 2D and 3D, narrative, abstract, and visual effects related. It is an education and industry-geared organization, whose goal is to provide relevant lectures and technical skill-building exercises to the Northeastern University student body in the field of animation.', '380', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('dba9cbfd-0ae6-4d57-b9a1-4f207fa6e4e5', 'Northeastern University Association of Gaming Enthusiasts', 'Join Northeastern''s board game club for casual events every Friday and Saturday at 7pm in 201 Forsyth! We have plenty of games for all levels of experience and interest. Make new friends, learn new games, and find your new favorite hobby.', 'Northeastern University Association of Gaming Enthusiasts (NUAGE) is Northeastern''s official tabletop gaming club. Come and enjoy our collection of 200+ board games! We hold Casual Game Night and other events every Friday and Saturday night starting at 7PM in 201 Forsyth. We''ve got tons of board games for everyone to enjoy, so don''t hesitate to come out to meet some new people and learn some new games. Never heard of any of our games? No problem! We at NUAGE love teaching games almost as much as we love playing them!Join our community Discord to keep in touch with the club!https://discord.gg/GFWxYDS + +Or hear about our upcoming events from our Instagram! (@gamingnu) + +https://www.instagram.com/gamingnu/', '935', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('276701aa-e4c1-44a0-a835-6aea3de7204b', 'Northeastern University Association of Public Policy Students', 'NAPPS is a graduate student group founded by students in the School of Public Policy and Urban Affairs. NAPPS aims to provide a forum for students to come together, exchange ideas, and collaborate on professional development and myriad projects in a ra...', 'NAPPS is a graduate student group founded by students in the School of Public Policy and Urban Affairs. NAPPS aims to provide a forum for students to come together, exchange ideas, and collaborate on professional development and myriad projects in a range of policy fields. One of NAPPS’ strengths is its interdisciplinary nature, promoting shared interests and ambitions. NAPPS is heavily involved with career and networking development and helps students apply the skills acquired at Northeastern University to reach their goals.', '961', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('43b3e89e-4734-4574-bfeb-e2c54d035061', 'Northeastern University Chapter of the New England Water Environment Association', 'NEWEA is an organization dedicated to connecting students and professionals involved in the water environment profession. ', 'NEWEA is an organization dedicated to connecting students and professionals involved in the water and environment professions. Join us every other Thursday at 6:30pm for an enriching lecture on local projects and technologies!', '314', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('921c6376-814b-483f-874a-8de35ad1d7de', 'Northeastern University Chess Club', 'The Chess Club at Northeastern University serves as an avenue for all students to learn the ancient game of chess. We hold regularly scheduled meetings for the purpose of playing chess both formally and informally, on competitive and friendly levels.', 'Our meetings are held weekly on Wednesday in Curry 344 (7:00PM - 9:00 PM EST). Communications take place on our discord channel so please join this channel if interested in joining the chess club: https://discord.gg/sR3DRrQBP9 + +The Chess Club at Northeastern University serves as an avenue for all students to learn the ancient game of chess. We hold regularly scheduled meetings for the purpose of playing chess both formally and informally, on competitive and friendly levels. We also hold workshops introducing chess at the most basic levels to anyone interested. Don''t get checkmated on the way to play! ', '638', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('057a319b-0df3-4bca-8386-065995857228', 'Northeastern University Choral Society', 'The NU Choral Society welcomes all Northeastern students, faculty, and staff who love to sing! Check out our website (nuchorus.org) for information about our choirs, auditions, performances, and more. ', 'The NU Choral Society welcomes all Northeastern students, faculty, and staff who love to sing! Check out our website (nuchorus.org) for information about our choirs, auditions, performances, and more.', '399', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b298a4c7-4df0-4dbf-8d76-403109646e8d', 'Northeastern University Club Fencing Team ', 'The Northeastern University Club Fencing Team (NUCF) is a competitive club sports team and an active member of the New England Intercollegiate Fencing Conference. Although most of us are experienced fencers, we welcome new fencers to join practices.', 'The Northeastern University Club Fencing Team (NUCF) is a competitive club sports team and an active member of the New England Intercollegiate Fencing Conference, the United States Association of Collegiate Fencing Clubs, and the Northeast Fencing Conference.', '97', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('78eb0545-ed7d-4454-b84b-f31109f2e667', 'Northeastern University Club Gymnastics Team', 'NU Club Gymnastics is a club sports team at Northeastern. We are a member of NAIGC and compete against other universities in the area and at Nationals in April. Our practices are held at Winthrop Gymnastics Academy in Winthrop, MA under head coach Pete.', 'NU Club Gymnastics is a club sports team at Northeastern. We are a member of NAIGC and compete against other universities in the area and at Nationals in April. Our practices are held at Winthrop Gymnastics Academy in Winthrop, MA under head coach Peter Gobiel. NU Club Gymnastics consists of dedicated and passionate gymnasts who truly love the sport and are ready to show off all their hard work this year! + + + +If you are interested in learning more about the team, reach out to our email, nuclubgymnastics@gmail.com, and look for us at Fall Fest!', '741', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d74001dc-be13-42d5-9eff-2e0777ac10d7', 'Northeastern University Club Roller Hockey', 'Club Roller Hockey offers students the opportunity to continue their competitive hockey careers. We competes against schools from across the country as part of the NCRHA & ECRHA. Practices are twice a week on campus and travel to NY, NJ and PA for games.', 'Welcome to the Northeastern University Club Roller Hockey! We are a group that provides students with the platform to pursue their love for competitive hockey. As part of the NCRHA & ECRHA, we face off against teams from various schools nationwide. Our team practices twice a week on campus, perfecting our skills and building camaraderie. We also embark on exciting trips to New York, New Jersey, and Pennsylvania for thrilling matches. Join us for an exhilarating experience on the rink!', '392', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('daa84817-5534-44e4-8234-77b7cbfeffc4', 'Northeastern University Club Running', 'NU Club Running welcomes runners of many levels and experience, whether you want to compete or just have a place to run with others. As a member of NIRCA and USATF, we compete in cross country & track invitationals against fellow collegiate teams.', '** We don''t currently manage our roster through this page. If you want more info, feel free to reach out to us at nuclubrunning@gmail.com. You can also fill out our interest form to be on the list to receive info about our info session at the start of the spring semester: https://forms.gle/Z7SgXN5PZ9TEQXt69 + +.... + +The NU Club Running team welcomes runners of many levels and experience. As a member of NIRCA (National Intercollegiate Running Club Association) and USATF (USA Track & Field), we compete in cross country and track invitationals against fellow college athletes across the Northeast. We also participate in local, community-sponsored road races. Generally, the races we compete in the fall span from 5K all the way up to 8K and 10K. In the spring, we compete in intercollegiate track meets in numerous sprinting, mid/long-distance, and relay events. If you are a former cross-country and/or track athlete and are looking to experience the sense of team unity, the club team is right for you. It is an excellent opportunity to stay in shape, compete and test your progress, and meet a friendly group of people! + +https://clubrunning.sites.northeastern.edu/ + + + + ', '483', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7acdea33-4023-451d-8b57-4fa3a44f1276', 'Northeastern University Club Spikeball', 'Club Spikeball is a student run organization founded in 2017 that is interested in promoting the sport of Roundnet. The club provides a place for students of all levels of experience to improve their skills and compete on a collegiate level.', 'Welcome to Northeastern University Club Spikeball! We are a student-run organization that was founded in 2017 with a passion for promoting the exciting sport of Roundnet. Our club offers a supportive and inclusive environment for students of all skill levels to enhance their abilities and partake in collegiate competitions. Whether you''re a beginner looking to learn the game or a seasoned player seeking friendly competition, Club Spikeball is the perfect place for you to connect with like-minded individuals and have a blast on the court!', '676', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('23b94894-12fd-4c60-8c22-8b57c28c027b', 'Northeastern University Club Taekwondo', 'Northeastern Club Taekwondo practices under the organization World Taekwondo, focusing primarily on Sparring and Poomsae elements of the martial art. We foster community among our experienced and inexperienced athletes alike. We are a family. ', 'We are a LEGION, we are a FAMILY, we are Northeastern University Taekwondo. + +As our motto states, the NEU Club Taekwondo team is proud to support and strengthen our members in and out of competition. We strive to provide opportunities for our members to grow as athletes, students, and friends. NU TKD is currently the Division I champion of the Eastern Collegiate Taekwondo Conference, and we hope to continue to achieve and expand our family.', '595', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fbf36867-482a-40a1-a7d8-1b31f2087895', 'Northeastern University Club Weightlifting Team', 'Olympic Weightlifting is a sport which tests strength, power and technique. Athletes lift barbells loaded with weights through two movements: (a) the snatch and (b) the clean and jerk. NUWL is a Club Sport which competes at a national level.', 'Olympic Weightlifting is a sport where athletes lift barbells loaded with weights. Weightlifting tests the strength, power and technique of athletes. There are two competitive movements - the snatch and the clean and jerk. Founded in 2021, NUWL has a men''s and women''s team which compete at a national level. We create a very welcoming and friendly environment. NUWL’s mission is to create an environment to teach weightlifting to anyone who is willing to dedicate themselves to the sport and competition.', '299', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6b555915-75f5-400a-91b0-d2b4187b5b2a', 'Northeastern University College Democrats', 'The Northeastern University College Democrats promotes civic engagement through discussing our favorite political issues, promoting progressive policy, and working to elect choice Democrats on local, state, and national levels. ', 'The Northeastern University College Democrats promotes civic engagement through discussing our favorite political issues, promoting progressive policy, and working to elect choice Democrats on local, state, and national levels. + +We stand for healthcare access, a just transition to a zero-carbon economy, high-quality public education, and equity on all levels. + +Join us in our fight to pass meaningful, life-changing policies on the federal, state, local, and campus levels this spring! + + ', '777', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('79de7c55-4843-49c8-8bcb-cec8be9b9427', 'Northeastern University College Republicans', 'The Best Party On Campus at Northeastern University! We are a place where you can openly discuss politics from a conservative perspective.', '"The Best Party On Campus" The Northeastern University College Republicans meets every week to discuss the latest news, stories, and political issues from a conservative perspective, while having a few laughs along the way! Outside of weekly meetings, we also participate in other political events, including debates, watch parties, hosting speakers, campaigning, voter registration drives, and community service activities. In the past, we have hosted a trip to the Conservative Political Action Conference in Washington DC. + +If you want to openly discuss free market ideas and conservative values, join the Northeastern University College Republicans!', '248', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('29abd3d1-49b7-407c-bea4-bfcf39f044ac', 'Northeastern University Community Liaisons for Education Using STEM', 'We are a group of graduate students from a broad range of disciplines who share a passion for science communication and educational engagement. Our goal is to bring enriching educational experiences to K-12 students in the Boston area. + +', 'NUCLEUS connects Northeastern’s STEM graduate students with K-12 students in the Boston area, bringing unique topics to the classroom through accessible presentations. Our program aims to create a platform for graduate students to share their research and discuss their personal journeys in STEM with the overarching goal of promoting diversity in STEM fields. Our Thesis Pieces presentations are bite-sized versions of graduate student thesis projects targeted towards junior and senior high school students. Journeys in STEM presentations highlight our personal paths to where we are today, including challenges and triumphs we''ve faced along the way. We hope to bring these two sides of the research experience to K-12 students to provide accessible, supportive resources and encourage pursuit of STEM careers.', '768', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('99775359-37b6-45fa-b55a-ecc4da6990d9', 'Northeastern University Cricket Club', 'Northeastern University Cricket Club is the fastest rising cricket club in New England! At NUCC we strive to promote, encourage, foster and develop interest in the game of cricket at Northeastern University.', 'We are Northeastern University Cricket Club - the fastest rising cricket club in New England! At NUCC we strive to promote, encourage, foster and develop interest in the game of cricket at Northeastern University. Members of our club span from undergraduate to graduate students. Proud member of National College Cricket Association (NCCA).', '129', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4c2e42dc-3d55-425e-b719-cc791335a0eb', 'Northeastern University Cultural and Language Learning Society', 'NUCALLS is a student-run organization that provides student-ambassador language sessions to the Northeastern community. Our sessions are community-oriented, relaxed, and fun! Additionally, we host cultural events and activities throughout the semester.', 'NUCALLS is a student-run organization that provides student-ambassador language sessions to the Northeastern community. If you''re looking to pick up a new language this semester, this is the club for you! Our sessions are community-oriented, relaxed, and fun! Additionally, we host cultural events and activities throughout the semester. Check out our instagram @nucalls and our LinkTree to learn more.', '926', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2aad44f7-6baf-4eef-b7a9-6b342362a3b4', 'Northeastern University Dance Company', 'Founded in 2002, the Northeastern University Dance Company (NUDANCO) provides an artistic outlet and performance opportunities for NU students with a passion and commitment to dance. ', 'Founded in 2002, the Northeastern University Dance Company (NUDANCO) provides an artistic outlet and performance opportunities for NU students with a passion and commitment to dance. Our biannual showcases feature talented dancers and choreographers, who collaborate for months to produce artistic works that will entertain the NU community, dance enthusiasts, and our supportive fans. Company members contribute choreography in the genres of modern, jazz, ballet, lyrical, tap, Irish step, and other interpretive and classical dance styles. + + + + + + ', '900', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('25cd5652-e169-4c72-b84c-43427caa536a', 'Northeastern University Dance Team', 'The Northeastern University Dance Team was founded in 2003 by a group of Northeastern students passionate about dance and interested in supporting their school at a higher level. Since then, we have grown to be a spirit team staple in the athletic depa...', 'The Northeastern University Dance Team was founded in 2003 by a group of Northeastern students passionate about dance and interested in supporting their school at a higher level. Since then, we have grown to be a spirit team staple in the athletic department. Our styles typically include hip-hop, jazz, and pom, with a strong underpinning of technique in all routines. The mission of the team is to provide an avenue of performance for experienced dancers at various sporting events, as well as regional and nationally recognized competitions. We are dedicated to representing Northeastern University Athletics in a positive and energetic manner. Typically, performances consist of Men and Women''s home basketball games, as well as their respective CAA tournaments in the spring. We have also made appearances at Boston Celtics games and city-wide events. In the spring, we compete in either the Northeast Regional UDA Competition at Westfield, Massachusetts or the NDA Collegiate National Championship at Daytona Beach, Florida. NUDT is an official club sport, however, we practice, compete, and operate similarly to a collegiate varsity team. We practice 3 days a week, and work hard toward our prospective goals. We are a team of 15-20 dancers from all majors, class years, and dance backgrounds. As members, we are committed to dance and the mission of the team.', '604', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('499727df-68a8-4179-875c-b5fea3dcdf9c', 'Northeastern University Economics Society', 'The Economics Society is an academically based organization closely incorporated with the Department of Economics which serves to discuss relevant economic issues, both in the world and in the department, and develop our members professionally.', 'The Economics Society is an academically based organization closely incorporated with the Department of Economics which serves to discuss relevant economic issues, both in the world and in the department, and shall focus on promoting both social and professional economic information and networking for economics majors and any student interested in the field of economics. This will be achieved through various speakers, diffusion of information pertaining to employment and further education, and any other means which benefit the members of the society. + + + +Anyone who submits a membership request online will be added to the NUES email list to receive meeting newsletters and annoucements.', '858', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1860790d-35fe-436d-af6b-728926f46234', 'Northeastern University Emergency Medical Services', 'NUEMS is a campus-based Emergency Medical Service organization that exists to contribute to the safety of Northeastern University as well as to provide a supportive community for students full of leadership, experiential, and educational opportunities.', 'NUEMS is a campus-based Emergency Medical Service organization that exists to contribute to the safety of Northeastern University as well as to provide a supportive community for students full of leadership, experiential, and educational opportunities. TO JOIN: Please visit www.nuems.org and fill out the membership application after requesting to join on Engage. You will not be accepted into Engage without an application. TO RECEIVE EMAILS: https://nuems.us9.list-manage.com/subscribe?u=3059fc86231fd5308b02c975e&id=cef475bb61 The group is currently discussing ways to expand our current clinical opportunities with the Northeastern University Police Department and University Health and Counseling Services (UHCS) to provide emergency services in cooperation with NUPD Officers at University Sanctioned events, similar to MIT EMS, Boston University EMS, Boston College Eagle EMS, and many other universities throughout the country. NUEMS has potential to provide an outstanding standard of care and quality medical services to the Northeastern University Community.', '307', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('743e6dc0-58fc-4c3e-a23c-a313fce44173', 'Northeastern University Energy Systems Society', 'The mission of ESS is to bridge the gap between industry and academia, as well as development and sustainability. Associated with the Energy Systems Graduate Program, the group aims to align with the interdisciplinary pillars of sustainability: Enginee..', 'The mission of ESS is to bridge the gap between industry and academia and encourage dialogue on sustainable development. Associated with the Energy Systems Graduate Program, the group aims to align with the interdisciplinary pillars of sustainability: Engineering, Business, and Policy. This is done by organizing seminars, educational visits to R&D, commercial and industrial facilities, workshops, the annual Energy Conference, and other activities that allow students an opportunity to extend their knowledge and out-of-classroom experience. These activities allow members to remain connected with one another, gain knowledge of the latest energy and sustainability trends and promote continued education within the energy community. + + ', '522', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c412fdfb-95bf-4a02-b2c7-ee99cd38fdac', 'Northeastern University Equestrian Team', 'The Northeastern University Equestrian Team (NUEQ) is a competitive club sport competing in Zone 1, Region 2 of the Intercollegiate Horse Show Association (IHSA). The team competes in Hunt Seat Equitation classes on the flat and over fences.', 'The Northeastern University Equestrian Team (NUEQ) is a competitive club sport competing in Zone 1, Region 2 of the Intercollegiate Horse Show Association (IHSA). The club competes in Hunt Seat Equitation classes on the flat and over fences coached by Kate Roncarati at Cranberry Acres Farm in Marshfield, Massachusetts. NUEQ is open to undergraduate students of all years, experience levels, and academic backgrounds – the club encourages all riders to try out. If you are a current or prospective Northeastern University student who is interested in joining the team, please browse our website and do not hesitate to contact us at nueqteam@gmail.com.', '429', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6f68a592-9bae-48d9-898f-b0f166ce8e86', 'Northeastern University Figure Skating Club', 'We are the Northeastern Figure Skating Team, and we are comprised of skaters of many levels who love to skate, improve their skills, meet new friends, and compete on behalf of Northeastern at intercollegiate competitions!', 'Welcome to our Engage page! Our team is comprised of primarily individual skaters and solo dancers who come from a wide variety of skating backgrounds. Some of our skaters have been competitive for many years and others are just returning to the ice after having skated when they were younger. NUFSC brings together a diverse group of students through their shared love of skating. With the help and support of two wonderful coaches, the NUFSC team has given our members a way to grow as skaters while also managing their academic responsibilities. In addition to competing at the US Figure Skating Northeast Intercollegiate competitions with the goal of qualifying for the Intercollegiate National Final and performing for peers at our annual Holiday Show, we enjoy spending time together on the ice and off; team bonding and volunteering are very important to us. For even more information, you can check out our FAQs on our website. You can also browse pictures from past seasons on this page or on our website, and feel free to reach out via email, our website ''Contact Us,'' or Instagram DM. If you are interested in joining, reach out anytime! We hold application processes at the beginning of the fall and spring semesters.', '122', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('625e9786-84b5-425b-abe7-19e63e0facf1', 'Northeastern University Graduate Asian Baptist Student Koinonia', 'Christian fellowship group for Graduate Asian Baptist students.', 'Christian fellowship group for Graduate Asian Baptist students.', '447', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1f6af80b-7d15-422b-ae3b-5c5e2271ddf9', 'Northeastern University Graduate Structural Engineering Association', 'The Northeastern University Graduate Structural Engineering Association (NGSEA) is founded to provide many opportunities for the enrichment of all graduate structural engineering students in addition to any students who are interested in topics related...', 'The Northeastern University Graduate Structural Engineering Association (NGSEA) is founded to provide many opportunities for the enrichment of all graduate structural engineering students in addition to any students who are interested in topics related to structural engineering. Students will find the chance of learning about current structural engineering projects and research from invited speakers. They will also have the opportunity to present their own research in addition to more general structural engineering topics of interest. This groups aims to provide a unique opportunity for the exchange of ideas among students and faculty. The opportunities for interaction both within and outside the university allow for the students to be further prepared for professional life. This group will be in contact with professional organizations such as such as American Society of Civil Engineers, Structural Engineers Association of Massachusetts, and Boston Society of Civil Engineers Section.', '971', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('256e5f58-5001-4295-a650-eebc3e1f8ee8', 'Northeastern University Graduate Women Coders', 'NU Grad Women Coders aims to create a conducive environment for women in tech to help each other further their ambitions and take on leadership roles in the tech world. We host weekly tech sessions presented by members of the community or inspiring ex...', 'NU Grad Women Coders aims to create a conducive environment for women in tech to help each other further their ambitions and take on leadership roles in the tech world. We host weekly tech sessions presented by members of the community or inspiring external guests. One of our primary motives is to encourage members to step outside the curricular boundaries and take up projects with social impact. We also encourage participation in Hackathons and tech meet ups happening around town. The group is open to all women in tech and supporters of women in tech.', '180', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('82e16fab-095d-4a2b-8cc1-a5847226ad46', 'Northeastern University History Association', 'The Northeastern University History Association is an organization dedicated to enriching the study of history through trips to local historic sites, museums, and more. We are open to ALL majors, just looking for those with an interest in history.', 'The Northeastern University History Association (NUHA) is the main student organization of our History Department, though we are open to ALL majors and many of our members come from other departments! We meet every week to listen to play fun history-themed games, watch student and faculty presentations, and more! We also go on monthly trips to historical sites in the Boston area, including Gloucester, Salem, and Plymouth (and they''re the best!) If you''re interested in joining or just learning more, click sign-up right here on Engage and join our distribution list here: https://lp.constantcontactpages.com/su/3yooixL/join.', '200', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('57116326-0a8c-4880-8629-6fde4217477b', 'Northeastern University Huskiers and Outing Club', 'We are the outdoors club for Northeastern University. Please visit our website (nuhoc.com) and join our slack (https://bit.ly/nuhocslack) to learn more about the club. + + + +Let''s get outside!', 'We are the Outdoors Club for Northeastern University. Please visit our website and join our Slack to learn more about our club!', '61', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b0e9906c-2a32-4da9-8d24-971e32e04842', 'Northeastern University Italian Club', 'NUIC''s goal is to create a solid, collaborative and worldwide network between past, present and future Northeastern Alumni.', 'NUIC''s goal is to create a supportive, united and worldwide network between past, present and future Northeastern students interested in the Italian lifestyle. Our community aims to involve people from all backgrounds, from International and domestic students who would like to bridge their experiences to Italian culture, to Italy''s natives who necessitate a home away from home. + + + +In our meetings, we often brainstorm ideas for future activities while eating snacks from Eataly (it''s tradition). Our club''s structure has adapted to the current Covid situation, however, we hope that, in the coming semester, our members can resume the in-person events we love so much, including discovering Boston''s best Italian restaurants, participating in the infamous Pasta Night, and organizing fun and informative discussions with other clubs, guest speakers, and faculty to foster effective communication between Northeastern''s diverse community and ensure that everyone, whether Italian or not, receives the warm and welcoming NUIC experience.', '599', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6e500d95-8144-4b7a-93fc-55570db3990e', 'Northeastern University Knits', 'NU Knits has two main goals. First, to provide a place where people can learn to knit and where people who already knit can gather and learn more about the craft. Second, to give back to our community by providing knitted items (hats, baby items, etc.).', 'NU Knits has two main goals. First, to provide a place where people can learn to knit and where people who already knit can gather and learn more about the craft. Second, to give back to our community by providing knitted objects (such as hats, baby booties, and scarves) to various charities around Boston. If you have any questions about our club or would like to be added to our mailing list, please send an email to nuknits@gmail.com! + +We meet on Thursdays from 8:00-9:00pm in Curry room #346!', '76', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('865b39d3-10af-41ad-85b1-9136c5e89cd6', 'Northeastern University League of Legends', 'The Northeastern University League of Legends (NEU LoL) is a group dedicated to students who play League of Legends (LoL), the most played video game in the world. With over 12 million players everyday, we strive to expand the connections between North...', 'The Northeastern University League of Legends (NEU LoL) is a group dedicated to students who play League of Legends (LoL) and Team Fight Tacticts, the most played video game in the world. With over 12 million players everyday, we strive to expand the connections between Northeastern students in order to create a tight-knit community of players and an opportunity for fellow players to socialize at our meetings and events. We hold events weekly which range from casual to competitive and every skill level is welcome!', '587', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('94f18e08-d7c2-4940-b6f4-ec5200c8ab57', 'Northeastern University Maddog Rugby', 'Our aim is to build our team to become the division’s premier rugby club.No experience is necessary; all of us learned the game from scratch at some point, so we are very understanding of brand new players.Our coaching staff and team is committed to te...', 'Our aim is to build our team to become the division’s premier rugby club. No experience is necessary; all of us learned the game from scratch at some point, so we are very understanding of brand new players. Our coaching staff and team is committed to teaching the basic skills necessary for learning the game, and will introduce new players to live action in a safe and appropriate manner.', '363', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6b51a14a-09ff-4799-8e0c-859d3b48ed1c', 'Northeastern University Madrigal Singers', 'The NU Madrigal Singers are a group of student musicians who rehearse and perform a capella choral music. Check us out on Facebook (NU Madrigal Singers), and Instagram (@numadrigalsingers) for more info!', 'The NU Madrigal Singers are a group of student musicians who rehearse and perform a cappella choral music. Founded in 2014 by Music Director Elijah Botkin, the group performs music from a variety of time periods and composers, including Eric Whitacre, Jake Runestad, Thomas LaVoy, and more. In rehearsing challenging music, NUMadS hopes to foster an environment that supports both musical excellence and lifelong friendship. Check us out on Facebook (NU Madrigal Singers) and Instagram (@numadrigalsingers), for information about auditions, performances, and more!', '378', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('19c83f75-e5a6-425f-a9a0-36fe4ff4d850', 'Northeastern University Marine Biology Club', 'The Marine Biology Club strives to foster and engage students with interests in marine biology, environmental science, ecology, evolution, and behavior by providing educational, recreational, and professional opportunities in correlation with the MSC.', 'The Northeastern University Marine Biology Club strives to foster and engage students with interests relating to the Marine and Environmental Science Department by providing educational, recreational, and professional opportunities in conjunction with the Marine Science Center. + +We have meetings every other Thursday from 7-8pm EST. You can find our socials and info on our linktree at linktr.ee/numarinebio.', '351', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('63a596cc-a17b-470a-a321-5995343283c2', 'Northeastern University Marketing Association', 'NUMA is Northeastern’s premier marketing club. We foster a community of driven students (of various majors and backgrounds) to explore and grow in the field of marketing.', 'Welcome! + +NUMA is Northeastern’s premier marketing club. We foster a community of driven students (of various majors and backgrounds) to explore and grow in the field of marketing. + +We provide students with opportunities to connect with employers, learn from industry experts, explore the world of marketing, and grow professionally. + +Note: Any student in any majors and years are welcome to join! (Ie. You don''t need to be a marketing major to join). + +How to get information about our events: We always post events on our social media accounts (please see the links under the social media header). + +Please reach out to us at contactnuma@gmail.com if you have any questions! ', '472', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c7a84a30-f032-4cb8-bb7d-0adb2e900cc9', 'Northeastern University Men''s Club Soccer', 'Northeastern University Men’s Club Soccer is a student-led, year-round soccer program that offers undergraduate and graduate students the opportunity to compete at a collegiate level.', 'Northeastern University Men’s Club Soccer is a student-led, year-round soccer program that offers undergraduate and graduate students the opportunity to compete nationally. While team members study a wide range of subjects, all express the same desire and commitment to continue playing soccer competitively at the collegiate level.', '78', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5723b66f-014d-4f37-a5da-66fcd036bb8d', 'Northeastern University Men''s Club Water Polo', 'We are a team that encourages new and experienced water polo players to join and learn how to play or improve on their skills. We compete in regular tournaments throughout New England and hold regular practices.', 'We are a team that encourages new and experienced water polo players to join and learn how to play or improve on their skills. We compete in regular tournaments throughout New England and hold regular practices.', '547', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9b568029-5b03-4e45-860e-854f382cdcc3', 'Northeastern University Mock Trial', 'Northeastern Mock Trial is a competition-based club that participates year round in simulated trials. We have three teams that develop legal cases and compete and present against different schools. Our club is open to all majors!', 'At the beginning of the school year, teams get a case involving a legal issue and have the whole year to develop arguments and compete against other schools. Members perform as both attorneys and witnesses and go through all the steps of a real trial: opening and closing arguments, witness examinations, and objections. + +Trials are a chance to gain hands-on legal experience while gaining skills in public speaking, acting, and debate.', '354', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bc07acdd-a9da-4d14-9a53-910df7364b9f', 'Northeastern University Pharmacy Alliance', 'The mission of the Northeastern Pharmacy Alliance is to encourage all student pharmacists to become more knowledgable about the pharmacy profession and provide professional and social opportunities for advancement of student leadership.', 'NUPSA is affiliated with the Northeastern University School of Pharmacy, the American Society of Health-System Pharmacists (APhA-ASP), the national American Pharmacist’s Association - Academy of Pharmacists (ASHP), and the National Community Oncology Dispensing Association (NCODA).', '541', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('28cad9f5-b82b-4c6e-b5b5-136ef8a31b3e', 'Northeastern University Photography Club', 'NUPiC offers students an opportunity to explore the art of photography via tutorials, workshops, and outings among other photographers. All undergraduates are welcome to take photos with us and no experience is required! ', 'NUPiC offers students an opportunity to explore the art of photography for both novices and experienced hobbyists. From tutorial sessions, demonstrations, and guest speakers on the technicalities of photography, in addition to group outings and creative projects, the student-led club aims to promote a culture of collaboration and to cultivate a space for students to harness and develop their creativity. No prior knowledge or experience in photography is required. + +All important and current links can be found in our linktree below! + +https://linktr.ee/nupicofficial ', '679', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('59e489cb-20a3-4f23-9116-ba31e4a2a06a', 'Northeastern University Planeswalkers', 'NUMTG is the premier space for the Magic: The Gathering at Northeastern. We provide a space to play all MTG formats, including EDH, Modern, Cube, Draft, Pauper, and more. We welcome new players and will assist anyone in learning how to play! ', 'NUMTG is the premier space for the Magic: The Gathering at Northeastern. We provide a space to play all MTG formats, including EDH, Modern, Cube, Draft, Pauper, and more. We welcome new players and will assist anyone in learning how to play! + +If you are looking to find people to organize trips to Pandemonium Books & Games (Boston''s premier MTG game store) or to set up games outside of club meeting times, we also facilitate that as well. The club also boasts a proxied vintage power cube. + +For more info about meeting times, drafts, other events, and MTG discussion, be sure to join the Discord server below! All meetings are announced in the Discord. + +Discord Link: https://discord.gg/c2uXHCK + +We have weekly meetings on Tuesdays and Thursdays at 6:15pm where you can attend as much or as little as you wish! Check the Discord server for weekly meeting locations. + + ', '1001', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b46e8c2d-de26-4e7c-befd-32994f55bb4a', 'Northeastern University Political Review', 'The Northeastern University Political Review seeks to be a non-affiliated platform for students to publish essays and articles of the highest possible caliber on contemporary domestic and international politics, and is a weekly-meeting club. Email us!', 'The Northeastern University Political Review seeks to be a non-affiliated platform for students to publish essays and articles of the highest possible caliber on contemporary domestic and international politics, as well as critical reviews of political books, film, and events. The Political Review aspires to foster a culture of intelligent political discourse among interested individuals while promoting awareness of political issues in the campus community. The organization envisions itself as a place where students with a common interest in politics and world affairs may come together to discuss and develop their views and refine their opinions. The Political Review hopes to reflect the diversity of thought and spirit at Northeastern, including the dual ethic of academic and experiential education our school embodies. + +If you would like to sign up for our email list, please do so here. + +If you would like to view our Interest Meeting and learn more about our club, you can do so here!', '888', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5717372d-86b6-4a5d-984e-abc5f48042f8', 'Northeastern University Pre-Dental Association', 'Welcome to the NEU Pre-Dental Association!The Pre-Dental Association is a student organization at Northeastern University comprised of students aspiring to pursue a career in the dental profession. We meet monthly to discuss the application process, e...', 'Welcome to the NEU Pre-Dental Association! The Pre-Dental Association is a student organization at Northeastern University comprised of students aspiring to pursue a career in the dental profession. We meet once a month to discuss the application process, examine strategies for facing the Dental Admissions Test and engage in activities that broaden our understanding of dentistry. Reach out to us here or at neupredental@gmail.com! + + ', '907', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('654f5433-ac08-4907-b9ac-e95743cb9b9e', 'Northeastern University Pre-Veterinary Club', 'Northeastern University Pre-Veterinary Club is a group for students who are considering applying to veterinary school, and students with an interest in any field of veterinary medicine. Please email us at NUASPVC@gmail.com if you have any questions.', 'Northeastern University Pre-Veterinary Club (NUPVC) is a group for students who are considering applying to veterinary school, and students with an interest in any field of veterinary medicine. Please email us at NUASPVC@gmail.com if you have any questions!', '370', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e97273b1-209d-4828-957f-f32ad0dfc2ea', 'Northeastern University Project Management Student Organization', 'Northeastern University Project Management Student Organization is a student-run organization founded in 2017 to advance the discipline of project management and provide students with an unmatched opportunity to gain real-life experience in the field.', 'Northeastern University Project Management (NUPM) Organization is a student-run organization founded in 2018 to advance the discipline of project management and provide students with an unmatched opportunity to gain real-life insights & professional experience. + +NUPM is the largest College of Professional Studies club, with 800+ members, including alums. + +✔️NUPM aims to cultivate a vibrant community and propel the professional development of our diverse, multinational student body by actively championing our peers'' academic and career advancement. + +✔️NUPM encourages and facilitates sharing knowledge and personal experiences, fostering a collaborative and transformative environment. We inspire and invigorate our community members by hosting dynamic, impactful programming and events. + +✔️NUPM provides robust peer support and mentorship opportunities that empower individuals to excel professionally. Through these proactive measures, we fortify our community and propel the remarkable professional growth of our diverse student body.', '649', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('012d2687-1c46-4826-81ed-067d497da60c', 'Northeastern University Real Estate Club', 'The Northeastern University Real Estate Club (NURE) is a community of students, professionals, faculty, and alumni who have a shared interest in Real Estate and want to learn about different aspects of the industry as well as ways to enter the field.', ' + + + +The Northeastern University Real Estate Club (NURE) is a community of Northeastern students, faculty, alumni, and professionals who are engaged in real estate, including but not limited to brokerage, development, investments, policy, and more (data science, law, etc.). The club regularly hosts educational events (such as a speaker series and panels), development site tours, and professional networking opportunities with industry employer professionals and students from other universities within Boston who share a passion for the Real Estate Field. Since 2010, NURE has created interactive extracurricular programs sponsored by top corporate partners, where community members can create and share professional experiences. We will continue to advocate for and host top-tier real estate programs regarding subject-matter interest demonstrated by NURE members, faculty and student alumnus. The topics NURE covers reflect the all-inclusive nature of the field and the wide-ranging disciplines of our members. + + + +', '635', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fd4f9e2f-3278-41f2-968f-90ae4d26982a', 'Northeastern University Researchers of Neuroscience', 'Northeastern University Researchers of Neuroscience (NEURONS) is a student group for those interested in neuroscience, be it as a career or a hobby. We have speakers, panels, and group discussions about co-op, career, research, and academics.', 'Northeastern University Researchers of Neuroscience (NEURONS) is a student group for anyone interested in neuroscience. Members from all different majors are encouraged to join! + +Join the 2023-24 email list + +We meet every other Thursday from 7-8pm in IV 019 + +Our meetings from last year (2022-2023): + +1. Speaker Riley Catenacci, a neuroscience PhD student at Johns Hopkins University and a Northeastern & NEURONS alumna, spoke to us about her path to research and grad school + +2. a PhD panel (access the recording here) consisting of: + + + + + +Kieran McVeigh (he/him): 3rd-year Psych PhD Candidate from Dr. Ajay Satpute''s lab, looking at brain states of emotions using fMRI and physiological data. Lab site + +Julia Mitchell (she/her): Final-year Psych PhD Candidate from Dr. Becca Shansky''s lab, looking at DREADDs manipulation of neural circuits. Lab site + +William Li (he/him): MS4 MD-PhD Candidate from Dr. Ziv Williams'' lab, using DREADDs to identify neural circuits controlling social behavior, including compassion and competition, in mice. Lab site + + + +3. a Halloween-themed social event for those in our mentorship program, the Neuron Network! + +4. Northeastern professor Dr. Jon Matthis, who studies the neural control of movement in natural environments, gave a demo of his open-source, free motion capture software FreeMoCap. Here is a recording of the meeting; here is a short video of the software in action; and here is a folder of the data collected during the demo. + +5. An eboard panel for members to ask the eboard about classes, professors, co-op, study abroad, etc. + +6. A destress event with neuroanatomy coloring pages, cookies & milk, and tunes! + +7. Speaker Dr. Tim Morris, a computational neuroscientist, professor in Bouve, and researcher at the Center for Cognitive & Brain Health. Recording here. + +8. A Valentine''s Day-themed collab with the Psychedelic Club about "Love, Drugs, and the Brain." + +9. A "Journey into Research" panel in which eboard members and club members shared their experiences & advice getting volunteer research assistant positions in labs and applying for the PEAK research award. + +10. Brain Awareness Week! This year''s theme: The Art of Neuroimaging. On Monday, 3/14, we had guest speaker Dr. Craig Ferris, professor of psychology and pharmaceutical sciences at NEU and head of the Center for Translational Neuroimaging. On Wednesday, 3/16, we had guest speaker Dr. Bruce Rosen, MD, PhD, Director of the Athinoula A. Martinos Center for Biomedical Imaging at MGH, who oversaw development of functional magnetic resonance imaging (fMRI). Recording here. That night, we also had a neuroimaging-themed scavenger hunt based on information presented in the incredible (and accessible/prior knowledge not necessary) book Portraits of the Mind by Carl Schoonover. Highly recommend! + +11. Medical Career Panel (recording here): + + + +Fae Kayarian, 2nd year medical student at Rush University in Chicago and NEURONS alumna + +Dr. Walid Yassin, D.M.Sc, a staff scientist in the Department of Psychiatry at Beth Israel Deaconess Medical Center, Research Associate at McLean Hospital, and Instructor at Harvard Medical School + +Dr. Justin Jordan, MD, MPH, Clinical Director of the MGHH Pappas Center for Neuro-Oncology and the Director of the Family Center for Neurofibromatosis at Massachusetts General Hospital. + + + + + + + +Join our Slack (a direct messaging/group chat app) with your Northeastern email to get reminders about meetings, interact directly with other club members, and enjoy prime neuroscience memes. + +We meet every other Thursday at 7pm in International Village room 019. If you would like us to set up a zoom to accommodate your needs, please reach out. + +If you have any questions, email us at northeasternneurons@gmail.com or message one of the eboard members or post in the #general channel on Slack, or whichever channel best fits your question. Also feel free to let us know your recommendations for the club!', '58', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('906fc230-b0f9-46b5-a2ad-e0faf9832843', 'Northeastern University Songwriting Club', 'The Northeastern University Songwriting Club is a group for songwriters and musicians of all styles and experience levels to share their music and meet peers to collaborate with! We aim for a very casual atmosphere, so anyone is welcome to join any time!', 'The Northeastern University Songwriting Club is a group for songwriters and musicians of all styles and experience levels to share their music and meet peers to collaborate with! It doesn''t matter if you''ve never written a song in your life or you write every day. We welcome all who are interested, even if you just want to hang out and listen. Our goal is to make each other better musicians. We try to host open mics, jam sessions, and other performance opportunities throughout the year, and provide our club members with ways to get involved in music both on and off-campus. NUSC is a family, and all are welcome to join!', '255', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1ca9f4b8-7f80-4c55-9af6-fd2f99060f8f', 'Northeastern University Speech Language and Hearing Association', 'The Northeastern University Student Speech-Language-Hearing Association is a chapter of the National Student Speech-Language-Hearing Association (NSSLHA) which is recognized by American Speech-Language-Hearing Association (ASHA). This is an organizatio...', 'The Northeastern University Student Speech-Language-Hearing Association is a chapter of the National Student Speech-Language-Hearing Association (NSSLHA) which is recognized by American Speech-Language-Hearing Association (ASHA). This is an organization for graduate students studying both Speech-Language Pathology and Audiology.', '951', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5321ee09-3ce6-4bad-b913-3f6276dc4653', 'Northeastern University Student Nurses Association', 'An organization and resource for all nursing students at Northeastern. + + + +', 'We aim to provide opportunities for student nurses to become more involved with the Northeastern community, the medical community in Boston, and nursing students all over the country. Our mission is to transition nursing students into the professional role of nursing through mentoring programs, contributing to nursing education, and promoting participation in healthcare focused causes as well as interdisciplinary activities. + +We love to have fun by doing activities related to our nursing interests and getting to know each other! NUSNA welcomes undergrad/BSN students, ABSN students, and grad students -- we plan to encourage participation from nursing students at all campuses through additional online events. + +Please email us at nustudentnurses@gmail.com for more info or request membership on Engage and we ill add you to our email list :) Follow us on instagram @nustudentnurses for updates!', '415', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b4bc9693-e91e-4c0d-bb62-0a124062903f', 'Northeastern University Supply Chain Management Club', 'Established with the mission to foster learning, networking, and professional development, NUSCM brings together students who share a common interest in supply chain management.', 'Established with the mission to foster learning, networking, and professional development, NUSCM brings together students who share a common interest in supply chain management. + + + +Sign up for our mailing list to stay up to date on our latest events!', '826', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1a942a05-fc2e-4d57-8d58-4ffe1fdd3e2e', 'Northeastern University Sustainable Building Organization', 'NUSBO seeks to engage and connect members interested in the field of sustainable building. Through meetings, events, and the SBSY Speaker Series, NUSBO fosters multi-disciplinary relationships between students on campus and professionals in the industry.', 'NUSBO (Northeastern University Sustainable Building Organization) seeks to engage and connect members interested in the fields of sustainable building design, building science, building energy performance and simulation, sustainable architecture, and building life-cycle assessment. Through meetings, on-campus and off-campus events, and the SBSY Speaker Series, NUSBO fosters multi-disciplinary relationships between students on campus and professionals in the industry. NUSBO is open to graduate and undergraduate students from any field. + +Please check out our website to learn more about our organization and what we have to offer you this year. ', '698', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('35bcadfc-f7a9-4869-921e-c87ed1a6b9c6', 'Northeastern University Swim Club', 'NUSC is a Northeastern University club sport that competes on both regional and national levels while providing members with fun and rewarding experiences.', 'NUSC is a Northeastern University club sport that competes on both regional and national levels while providing members with fun and rewarding experiences. + +In 2023, we competed at the College Club Swimming Nationals Meet at The Ohio State University. We competed against over 50 teams from around the U.S. and our Women''s team placed 11th, and we placed 19th overall.', '115', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('52e940ca-c459-4727-9b99-4148b49045d6', 'Northeastern University Symphony Orchestra', 'The Northeastern University Orchestra is a full symphonicensemble open to students, staff, and faculty from allbackgrounds and majors. It performs music from thebaroque to the present day. Its past repertoire includes full symphonies, film scores, rom...', 'The Northeastern University Orchestra is a full symphonic ensemble open to students, staff, and faculty from all backgrounds and majors. It performs music from the baroque to the present day. Its past repertoire includes full symphonies, film scores, romantic and contemporary music, and premieres of new works. Concerts are at the end of the fall and spring semesters. NUSO is open to all currently enrolled students, staff, and faculty. Rehearsals are Wednesdays from 6:15 to 8:45pm at the Fenway Center. Auditions are held for seating only, though cuts may be made at the discretion of the conductor. Auditions begin BEFORE and after the first rehearsal of the fall and spring semesters, with additional times announced at the beginning of each semester. Orchestra is an extracurricular activity, but Membership in NUSO requires enrollment in a free, one-credit elective by registering for MUSC 1906. This course may be repeated for credit. For more information, please contact us at the email nuso.secretary@gmail.com.', '974', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('95aee52a-b817-4ca2-bb5b-50c13fa7f96b', 'Northeastern University Taiwanese Student Association', 'The purpose of NTSA is to create a warm & welcoming place for whoever is interested in Taiwanese culture! + + + +**For inquiries & E-board recruitment info, contact us through: + +Instagram: @northeastern.tsa + +Email: northeastern.tsa@gmail.com', 'The purpose of NTSA is to create a warm & welcoming place for all Taiwanese students and whoever is interested in Taiwanese culture! We seek to promote a friendly atmosphere for all of our event attendees. We hope to accomplish this through fun and entertaining programs; engaging all participants in activities; efficiently and effectively resolving conflicts; and maintaining a safe environment for our events. + +**For inquiries & E-board recruitment info, contact us through:Instagram: @northeastern.tsaEmail: northeastern.tsa@gmail.com', '578', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8762e19b-70bc-41d2-87e6-a3eebeaeb4f4', 'Northeastern University Teaching English Language and Literacy Skills', 'Northeastern University Teaching English Language and Literacy Skills (NUtells) is a student group that conducts one-on-one English as a Second Language (ESL) classes for campus employees and connects students with other external ESL opportunities.', 'We are NUtells, Northeastern University Teaching English Language and Literacy Skills. We are a fully virtual student group that provides English as a Second Language (ESL) tutoring to campus employees and the Boston community. Our goal is not only to serve learners in need of language assistance but also to build a stronger sense of community between Northeastern students and the Boston community. NUtells requires a time commitment of about an hour and a half per class, and we host many classes throughout the week, both daytime and nighttime. Tutors generally work one-on-one or with small groups of students. You don''t need any tutoring experience to join--just a friendly attitude and a desire to make a difference in our community. + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +If you would like to sign up or get on our email list, please email us at nutells@gmail.com. You''re welcome to join at any time during the semester. + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +For more information, see the gallery page of this site to watch a video of our first meeting for Fall 2020!', '644', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d871be0d-8b6a-4a49-a115-95bef7a5c1e4', 'Northeastern University Toastmasters', 'Toastmasters International is a world leader in communication and leadership development. Our membership is 270,000 strong. These members improve their speaking and leadership skills by attending one of the 13,000 clubs that make up our global network.', 'Do you want to develop, improve, and practice public speaking, communication, and leadership skills? Toastmasters International is a world leader in communication and leadership development. Our club strives to provide a mutually supportive and positive learning environment in which every individual member has the opportunity to develop oral communication and leadership skills, which in turn foster self-confidence and personal growth. To stay up to date on club meetings, events, and news, join our Slack here. Sign up for our mailing list here! Learn more about our club here! ', '517', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8941ddb8-5151-49e7-b8de-c85320ae677c', 'Northeastern University Trap and Skeet Club Team', 'Nationally competitive clay target shooting team focusing on Trap, Skeet and Sporting Clays.', 'The Northeastern Trap and Skeet team competes and practices the shotgun sport disciplines of Trap, Skeet and Sporting Clays. We hold local practices once a week at Minuteman Sportsman''s Club in Burlington MA and travel to competitions held in the surrounding states.', '414', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3c6c4b2c-5d8e-4128-8e98-2eb0d5645e47', 'Northeastern University Triathlon Team', 'As a member of the Northeast Collegiate Triathlon Conference (NECTC) and a sanctioned collegiate triathlon team by USA Triathlon, we have exposure to all of the other established collegiate triathlon teams in the northeast and across the nation', 'As a member of the Northeast Collegiate Triathlon Conference (NECTC) and a sanctioned collegiate triathlon team by USA Triathlon, we compete with collegiate triathlon teams in the northeast and across the nation. + +No experience required to join! We practice throughout the entire school year in swimming, biking, and running. The main season is August/September and USAT Nationals in April. + +**Please note that the e-board does not currently use OrgSync for announcements or notifications of ANY TYPE. If you would like to receive information about the team please email us at NUTriathlonTeam@gmail.com + + ', '687', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fdcf66f9-3a65-47a6-b892-cd4b26cb3f80', 'Northeastern University Undergraduate Speech and Hearing Club', 'The NU Speech and Hearing Club is made up of undergraduate students who have an interest in speech-language pathology, audiology, and/or communication disorders. We strive to create a community that is committed to learning and helping others. ', 'The Northeastern University Speech and Hearing Club is made up of undergraduate students who have an interest in speech-language pathology, audiology, and/or communication disorders. We strive to create a community that is committed to learning together, community service, and changing the lives of others.', '913', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c661d98e-cedc-4aab-81e3-57fd54002bf3', 'Northeastern University Unisons A Cappella', 'We are a TTBB contemporary a cappella group that performs today''s top songs, classic hits, holiday music, and more!', 'We are a tenor, bari-bass contemporary a cappella group that performs today''s top songs, classic hits, holiday music, and more! In recent years, the Unisons have competed in several events (including the ICCA and Boston Sings), as well as released several tracks on streaming platforms! You''ll find us performing at a variety of venues, from Boston''s Symphony Hall to our own campus'' dorm lobbies.', '301', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2e2b7dad-e064-441c-b4bf-a2cb5da8fb79', 'Northeastern University West Coast Swing Club', 'A club focused on learning, teaching, and enjoying the west coast swing style of dance. The club wishes to provide beginner and intermediate level dance lessons, while connecting students to the larger Boston swing dance community.', 'A club focused on learning, teaching, and enjoying the west coast swing style of dance. The club provides beginner and intermediate level dance lessons, while connecting students to the larger Boston swing dance community. + +Lessons will be held weekly on Tuesday''s in CSC 348, with the first lesson of the semester starting on 9/12/2023. The beginner lesson is at 8:30pm, and it''s 100% beginner friendly with no partner necessary. Intermediate lessons are at 7:30pm. Hope to see you there! + +Join our Discord! This is often where our announcements get posted first!', '387', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('41a7249f-6aad-46a1-ba88-88156b9b4236', 'Northeastern University Wind Ensemble', 'The Wind Ensemble is a select group that approaches advanced repertoire and often participates in multi-media concerts. NUWE members of all majors study and perform music at a high level, coming together socially as part of the broader NUBands community.', 'The Wind Ensemble is a select group that approaches advanced repertoire and often participates in multi-media concerts. The ensemble has accompanied silent movies in original scores by student composers, accompanied live dance performance, and collaborated with guest soloists and actors, in addition to playing the great works in wind repertoire. The ensemble rehearses and performs during the fall and spring semesters, usually performing two to four concerts each term. Each year the group participates in a festival with the wind ensembles of Harvard University, Boston College, and Boston University. At the end of each term the ensemble usually shares a concert program with the Concert Band. Auditions are held at the beginning of the term, usually during the first few rehearsals and by appointment. Wind Ensemble is an extracurricular activity for many, but can also be taken as a free one-credit elective by registering for MUSC 1907. The course may be repeated for credit. The members of the Wind Ensemble come from all backgrounds and majors, and any interested member of the NU community is eligible to join. + +To inquire about auditions for the Spring 2023 semester, please email the ensemble director Allen Feinstein at a.feinstein@northeastern.edu!', '594', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ab1eba93-397e-4bcc-b992-80d97cd38407', 'Northeastern University Women in Technology', 'A special interest group that supports women who study or are interested in Computer and Information Science at Northeastern University', 'NUWIT is a special interest group supporting women studying or interested in Computer and Information Science at Northeastern University! We host tech talks and workshops with tech companies, social events, mentorship events, student panels, and more. + +Check out our website to learn more about NUWIT and what we have to offer you this year! + +Join the NUWIT Slack: https://bit.ly/nuwit-join-slack + +Join our mailing list for email updates: http://eepurl.com/cqlrZz', '974', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7843ccac-dcaf-4394-ab24-a5039f2212d5', 'Northeastern University Women''s Squash Team', 'Interested in playing or learning squash? Wanna de-stress? Come play squash!Our home courts are in the Badger and Rosen SquashBusters Center right on campus, down the street from Ruggles. We practice four times a week from 7-9pm. The regular season run...', 'Interested in playing or learning squash? Wanna de-stress? Come play squash! Our home courts are in the Badger and Rosen SquashBusters Center right on campus, down the street from Ruggles. We practice four times a week from 7-9 pm. The regular season runs from October until Nationals in late February. The courts remain open year-round. Tryouts begin once classes resume in the fall! NO EXPERIENCE IS NECESSARY, just a positive attitude and willingness to learn!! (Hand-eye coordination is a bonus, of course). Background: The Northeastern squash program is a club team founded by students in the fall of 2004. The Huskies have competed in the College Squash Association against other club and varsity programs throughout the nation in the annual quest for the National Championship. Head Coach: Sabrina Gribbel Audience: Undergraduate Facebook Page: facebook.com/northeasternsquash Email: neuwomensquash@gmail.com Instagram: gonusquash', '609', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('af8f71cd-c443-4713-8488-bd357bcb7eb9', 'Northeastern University Wrestling Club', 'The Northeastern University Wrestling Club is dedicated to sharpening the technique of wrestlers, whether new or experienced, and honing their physical fitness. We are dedicated to fostering an atmosphere of camaraderie and pushing each other to improve.', 'Northeastern University Club Wrestling is comprised of wrestlers of all experience levels. We compete in tournaments and dual meets around the northeast with a chance to wrestle at the NCWA national championships. If you have never wrestled before, we have other members who are new to the sport for you to train with, and our more experienced members are happy to coach you through the sport. Please register with us on DoSportsEasy if you plan on attending at Register (U) (northeastern.edu). + +Practice Schedule: + +Monday 6-8pm + +Wednesday 6-8pm + +Friday 6-8pm + +Sunday 11am-1pm + +Practice takes place in Marino (second floor sports court). We also volunteer regularly with Beat The Streets New England.', '209', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('47f135f3-c491-4ce5-a258-00a111c95d30', 'Northeastern University''s Film Enthusiast''s Club', 'Northeastern University Film Enthusiast Club (NUFEC) meets weekly to discuss films chosen democratically by our members, mixing in film based lectures and other special events. We also run a website dedicated to reviewing newly-released films.', 'Northeastern University''s Film Enthusiast''s Club (NUFEC) meets weekly to discuss films chosen democratically by our members, mixing in film-based lectures and other special events. We also organize weekend outings to support local theaters in our community, and run a website dedicated to reviewing newly-released films.', '1019', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8dd78998-09ef-418a-a5d3-b0d47567b80f', 'Northeastern Women''s Club Soccer', 'NUWCS is a competitive club soccer team competing in the South Boston / Rhode Island division of the NIRSA Region I Club Soccer League.', 'The Northeastern Women’s Club Soccer team competes in the South Boston/Rhode Island division of the NIRSA Region I Club Soccer League during the regular season (September-November). Our primary competition is comprised of local teams, though our schedule often includes matches against teams from neighboring states in the New England area. Each season we aspire not only for status as the premier team in our division, but also as one of the more elite programs across the entire region. Our ultimate goal is to win the Region I Tournament that marks the culmination of each season, and subsequently secure the privilege of competing in the Championship Division of the annual National Soccer Championships. In October 2017, we achieved a regional title for the first time in NUWCS history. In 2018 and 2021, we competed in the National Soccer Championships. + + + +IMPORTANT UPDATE: The Fall 2020 season has been canceled. For latest updates on the return of women''s club soccer, email us at @nuwomensclubsoccer@gmail.com to be added to our prospective player email list.', '451', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e1a2268c-490a-4675-91fb-29fc912ade7c', 'Northeastern Women''s Club Volleyball', 'The Northeastern Women’s Club Volleyball team is a member of the Northeast Women’s Volleyball Club League (NWVCL) and National Collegiate Volleyball Federation (NCVF). Our season runs in the Fall and Spring Semesters.', 'The Northeastern Women’s Club Volleyball team is a member of the Northeast Women’s Volleyball Club League (NWVCL) and National Collegiate Volleyball Federation (NCVF). Our season runs in the Fall and Spring Semesters. Please email neuwomensclubvball@gmail.com to be added to our email list', '214', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a68cb588-e03a-4450-b3d7-966b05512513', 'Northeastern''s All-Female Semi Professional A Cappella Group, Pitch, Please!', 'Pitch, Please! is a premier women-centered treble a cappella group at Northeastern University. They are a passionate and dynamic group that aims to push boundaries and challenges the standards of traditional collegiate a cappella.', 'Pitch, Please! is a Northeastern University women-centered treble a cappella group. Since they were founded in 2012, they have continued to push the boundaries and challenge the standards of traditional collegiate a cappella. As a competitive group, they have placed 3rd overall at ICCA Finals in 2023, performed at ICCA Finals in 2019, ICCA Semifinals in 2020 and 2021, and earned first place in the collegiate championship on the PBS show Sing that Thing! in 2019. Additionally, Pitch, Please! placed first at Haunted Harmonies in 2019, won the 22nd Annual Faneuil Hall Competition, performed on The Today Show in New York City for International Women’s Day in 2020, and sang the national anthem at the Red Sox''s inaugural Women''s Celebration game this past April. Their full-length album, Obsidian, won the 2020 Contemporary A Cappella Recording Award for Best Female Collegiate Album, and their most recent EP, Indigo, won the same award in 2023-- one of five CARAs that the group received this year. Today, you can find them performing at various venues at Northeastern University and across New England! Pitch, Please! encourages their followers to continue streaming their recent EP, Indigo, as well as their most recent single, Titivating, and to watch their most recent music video series on their YouTube channel. Keep an eye on their social media @NUpitchplease for more content!', '618', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('04fc2b20-f493-4caf-9bed-27596a67ad2f', 'NU & Improv''d', 'NU & Improv''d is Northeastern''s premier improvisational comedy troupe. + + + +We are an audition based group that performs once a month in afterHours. We host both an improv jam and auditions at the beginning of each semester. ', 'NU & Improv''d is Northeastern''s premier improvisational comedy troupe. We focus on the spontaneity of theater, creating environments, characters, and scenes on the spot based on audience participation. We are an audition based group that performs once a month in After Hours, along with performing in improv competitions around New England. + +We host a big improv jam and auditions at the beginning of each semester. + +If you enjoy laughing, relaxing, and fun, NU & Improv''d is the student group for you.', '1015', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7d9a5c53-1c05-4684-b451-6279f5f4b1ba', 'NU American Society of Engineering Management', 'The purpose of NU ASEM is to provide education and mentorship in the area of Engineering Management to the Northeastern University community. The organization seeks to advance Engineering Management in theory and in practice and promote the development...', 'The purpose of NU ASEM is to provide education and mentorship in the area of Engineering Management to the Northeastern University community. The organization seeks to advance Engineering Management in theory and in practice and promote the development of the profession of Engineering Management for our members. We will accomplish these goals through professional development and networking opportunities with industry professionals, faculty, and fellow students during meetings on campus, through site visits, and by participating in regional opportunities related to our field. Student members will gain a broader perspective of Engineering Management and applicable fields through discussion, study, and research. Lastly, we aim to foster and maintain a high professional standard amongst our members.', '721', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('62974649-7e90-47ca-b81c-73c2eee948be', 'NU Ballroom Dance Club', 'NU Ballroom Dance Club provides free lessons in ballroom dancing at all levels. We compete at collegiate dance competitions across the Boston area, and we host fun, free socials for the Northeastern community.', 'NU Ballroom Dance Club provides free lessons in ballroom dancing at all levels. We compete at collegiate dance competitions across the Boston area, and we host fun, free socials for the Northeastern community. We pride ourselves in our accessible newcomer program that leverages our friendly community to coach new dancers and introduce them to competing at the collegiate level with our team. In addition, we bring in professional coaches to teach advanced technique classes, at no cost to attendees. We hope to provide an experience that continues to be accessible to all members of the Northeastern Community, worthwhile and fulfilling to new club members, and helpful and engaging to current members.', '428', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('609ba5af-2fa9-453f-9831-57b2144a43e8', 'NU Breakers', 'NU Breakers is a student dance group on campus aimed at practicing, preserving, and promoting Hip Hop culture. Founded in April 2011, NU Breakers is the first official student group of its kind on Northeastern’s campus.', 'NU Breakers is a student dance group on campus aimed at practicing, preserving, and promoting Hip Hop culture. Founded in April 2011, NU Breakers is the first official student group of its kind on Northeastern’s campus and has acted as a bridge between Northeastern and the larger breaking community for over a decade. Please follow us on Instagram (@nubreakers) and join our Facebook Group: NU Breakers (https://www.facebook.com/groups/NUBreakers/) for more information about practice time/beginner''s class. ', '400', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('47b58b16-9691-46a6-b575-fda8a6a7961f', 'NU Buddhist Group', 'The NU Buddhist Group meets weekly for meditation and discussion based on Buddhist teachings. We foster emotional, spiritual and mental well-being through both personal practice and our vibrant, curious community.', 'The NU Buddhist Group meets weekly for meditation and discussion based on Buddhist teachings. We foster emotional, spiritual and mental well-being through both personal practice and our vibrant, curious community. We are Buddhists of different traditions as well as non-Buddhists exploring together. Please join us as we cultivate mindfulness and love!', '788', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('92c26bd0-7e97-44e1-b594-56fd35701afb', 'NU Club Golf', 'We are current members of the National Collegiate Club Golf Association (NCCGA). We compete in approximately 5 to 10 tournaments in both the fall and the spring semesters. Any student at Northeastern is allowed (and encouraged!) to try out regardless o...', 'We are current members of the National Collegiate Club Golf Association (NCCGA). We compete in approximately 5 to 10 tournaments in both the fall and the spring semesters. Any student at Northeastern is allowed (and encouraged!) to try out regardless of skill level. We normally hold try-outs during the first weekend of the fall following a quick informational meeting for all interested golfers. You can find up-to-date information regarding the team at our Facebook page at www.facebook.com/neugolf', '18', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2029bdb5-8d5c-4788-86aa-a6db6404cb57', 'NU COE CommLab (Campus Resource)', 'NU COE CommLab', 'The Northeastern Communication LabA Resource for Graduate Engineering Students + +The CommLab offers in-person, peer-to-peer coaching and workshopsfor graduate-level writing and communication tasks.We bring a discipline-specific perspective to assisting you with the taskat hand—whether you’re working on a manuscript, poster, presentation,or other project!', '284', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0e5e7153-6255-4601-830c-5932d9895c0c', 'NU Concert Band', 'The Northeastern University Concert Band offers a welcoming environment in which to rehearse and perform music, and promotes musical learning and expression for Northeastern students of all abilities.', 'The Northeastern University Concert Band offers a welcoming environment in which to rehearse and perform music, and promotes musical learning and expression for Northeastern students of all abilities. Please email nucbvicepresident@gmail.com if you are interested in joining or have questions about if your instrument is typically in the concert band. Auditions are held at the beginning of each semester.', '569', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4611c238-b84d-40d1-8c0e-d1490d40ba8c', 'NU Hacks', 'NU Hacks is a social club for hackers and makers. We meet up weekly to discuss technology, social culture in software engineering, or just anything really (even non-tech!), as well as let members demo projects they have made. ', 'NU Hacks is a social club for hackers and makers. We meet up weekly to discuss technology, social culture in software engineering, and let members demo projects they have made.', '564', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8d9945f0-0e75-439b-87bd-06683204aebe', 'NU Mural Club', 'Northeastern Mural Club aims to merge community service with art. We provide service to the Boston and greater Boston community through the organization, planning, and development of mural projects, canvas painting donations, paint nights, and more! ', ' + +Northeastern Mural Club aims to merge community service with art. We provide service to the Boston and greater Boston community through the organization, planning, and development of mural projects, canvas painting donations, paint nights, and more! Founded in 2010, Mural Club is a growing nonprofit organization consisting of undergraduate students united in a love for art and creating art for the community within and beyond Northeastern. Over the years, the club has participated in numerous collaborations with other on campus clubs and off campus organizations to contribute to larger conversations through art. + +Sign up for emails and check out our projects on our new website! + +', '219', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('82aee5c7-f719-466d-91c7-8b1e6e46b087', 'NU Pep Band', 'The Northeastern University Pep Band plays at men''s and women''s hockey, basketball, and volleyball home games along with other special events on campus and in the surrounding community.', 'The Northeastern University Pep Band plays at women''s and men''s hockey, basketball, and volleyball home games, along with other special events on campus and in the surrounding community.', '639', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6d191bc6-1559-4cab-a06e-e17cfa503b6f', 'NU Pride', 'NU Pride is a community and safe space for Lesbians, Gays, Bisexuals, Transgenders, Queers, Asexuals, and others (LGBTQ+) on and off campus. Events are geared towards education and connection between members of the dual spectrums of sexuality and gender.', 'NU Pride is a community and safe space for Lesbians, Gays, Bisexuals, Transgenders, Queers, Asexuals, and others (LGBTQ+) on and off the Northeastern Campus. Events are geared towards education and connection between members of the dual spectrums of sexuality and gender orientation. This alliance empowers all members of the LGBTQ+ community and their allies to thrive as individuals and to meet other students within the community.', '345', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('58433bd0-2368-4f35-9819-fd9d0e7ee9ce', 'Nu Rho Psi National Honor Society in Neuroscience', 'National Honor Society open to Behavioral Neuroscience majors and minors.The purpose of Nu Rho Psi is to:(1) encourage professional interest and excellence in scholarship, particularly in neuroscience;(2) award recognition to students who have achieved...', 'National Honor Society open to Behavioral Neuroscience majors and minors. The purpose of Nu Rho Psi is to: (1) encourage professional interest and excellence in scholarship, particularly in neuroscience; (2) award recognition to students who have achieved such excellence in scholarship; (3) advance the discipline of neuroscience; encourage intellectual and social interaction between students, faculty, and professionals in neuroscience and related fields; (4) promote career development in neuroscience and related fields; (5) increase public awareness of neuroscience and its benefits for the individual and society; (6) encourage service to the community. Who may join? Membership is by invitation and is open to graduate and undergraduate men and women who are making the study of Neuroscience one of their major interests and who meet the other academic qualifications. Nu Rho Psi is also open to qualifying Neuroscience faculty and alumni of Neuroscience programs. Requirements for membership include: (a) Major or minor in Neuroscience (b) Completion of at least 3 semesters of the College course (c) Completion of at least 9 semester hours of Neuroscience-related courses (d) Undergraduate cumulative GPA of 3.5 and a minimum GPA of 3.5 in Neuroscience courses', '681', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d9f0a97b-695c-4302-916b-c34bf4537936', 'NU Science Magazine', 'NUSci is Northeastern''s student-run, student-written science magazine. We publish with the goal of informing our audience of the wonders of human discovery and progress in the world around us in an accessible, easily understood way.', 'NUSci is Northeastern''s student-run, student-written science magazine. We publish with the goal of informing our audience of the wonders of human discovery and progress in the world around us. Our magazine seeks to disseminate the latest information about science news, whether at the microscopic level or in the deepest reaches of space, in a simple and universally accessible format, bringing to our readers clear, high-quality, and well-researched journalism with an open mind and a sense of humor. We believe that when removed from a bland textbook format, science can be not only a field to discuss, but also something by which to be continually astounded and inspired.', '83', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1a2004c9-b3fa-46ed-982d-ea5c060025d3', 'NU Sexual Health Advocacy, Resources and Education', 'Meetings are Mondays at 7pm in the CIE in Curry Student Center. Join us to learn more about reproductive justice and sexual health!', 'Meetings are Mondays at 7pm in the Center for Intercultural Engagement in the Curry Student Center. Join us to learn more about reproductive justice and sexual health! + +We are a Planned Parenthood Generation Action Group.', '746', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('649e5d2a-6a8b-463f-a26e-089375a21011', 'NU Stage Musical Theater Company', 'NU Stage Musical Theater Company is Northeastern University''s student-run musical theatre group. The organization provides any and all Northeastern students with the opportunity to be involved in musical theater productions regardless of their major. ', 'NU Stage Musical Theater Company is Northeastern University''s premiere student run musical theater group. The organization provides any and all Northeastern students with the opportunity to be involved in musical theater productions, without regard to major or concentration. NU Stage’s standards are twofold: producing high-quality productions that both group members and patrons alike can be proud of, while maintaining a high level of interest and involvement from members of the student body. Lastly, NU Stage aims to be an active part of the community through volunteer efforts and monetary donations. Visit our website for more details!', '408', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b33820a5-24af-42c4-b0ed-7b723d0bdc77', 'NUImpact', 'Founded in 2016, NUImpact is Northeastern University’s student-led impact investing initiative and investment fund. ', 'NUImpact serves as a unique resource and thought-exchange for the Northeastern community to understand purposeful capital, develop technical skills, and gain exposure to professional opportunities available in the field of impact investing. NUImpact fosters insightful discussion on campus through two complementary pillars: Educational Programming and the NUImpact Fund. Over the course of each semester, the educational wing of NUImpact hosts industry leaders and professional alumni for speaker events and workshops, leading to a robust professional network and the development of new co-op opportunities for engaged students interested in impact investing. The NUImpact Fund provides hands-on finance and social impact education through a rigorous semester-long four-step investment process undertaken by teams of student analysts. Students build technical skills through sourcing & diligence workshops and real-world assignments, developed with the council of faculty and alumni advisors alongside investment industry partners. The NUImpact Fund program culminates in final investment recommendations and capital deployment making it the premier way for Northeastern students to gain experience in impact investment and meaningful capital.', '180', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('83567200-73ee-47a6-9c0c-f448d68ba6be', 'NUSound: The Northeastern University Chapter of the Acoustical Society of America', 'NUSound aims to build a cross-disciplinary community for students who are interested in acoustics and audio to provide an environment that enables first hand experience and sharing of ideas. ', 'NUSound is a club for those fascinated by acoustics and audio, enthusiasts of the physics and sciences of sound and how it interacts with us, and students looking for social and professional networking opportunities in these fields. On a week to week basis, we host workshops that give you hands on experience with audio technology, presentations that serve to deepen your understanding of sound and acoustics, and events that will allow you to interact and make connections with fellow audiophiles.', '413', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('027f52b0-d37a-4418-a1b0-35f9227cf20d', 'Oasis', 'Oasis is a project development accelerator club serving Northeastern underclassmen with the primary goal + +to break down the barriers of entry into the computer science industry by pairing club members with experienced mentors. ', 'In the simplest terms, Oasis is a full-fledged project accelerator where every semester, a new cohort of students build a software project with the support of upperclassmen mentors. They are introduced to and taken through the key stages of the software development life cycle. While many software-oriented clubs are looking to recruit students who already know how to program and build complex systems, Oasis is a beginner-focused club where any student can contribute to a project regardless of their experience. Through weekly workshops and assisted group work times called “Hack Sessions,” the ultimate goal of Oasis is that anyone with a vision for a project they have no idea how to create can bring it to life. The mission of Oasis is to create a space for all Northeastern students, whether they have a lot of programming experience or a little programming experience, and take them through the process of building their own projects. Our intended audience ranges from first- and second-year students who want to build projects to show off to potential co-op employers on their resumes, and also caters to third and fourth year who want to take their mentorship skills to the next level and help mold the next generation of Northeastern students.', '332', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d84e774a-27f5-4df4-b0c4-b1d94bb0c846', 'Off Campus Student Services (Campus Resource)', 'Mission: Off Campus Engagement and Support at Northeastern provides support and education to students moving off campus. We provide expert knowledge and advice, student connection to Northeastern and their local community. ', 'Off Campus Engagement and Support at Northeastern provides support and education related to off-campus housing, relocation services, renter’s rights knowledge, and community connection. We offer many resources, special programs and events to help you find off-campus housing in Boston, stay connected to campus, and serve as a link to your peers and community. We also help you understand your rights and responsibilities as a renter and how to navigate landlord issues. Peer Community Ambassadors plan programs and events for you, are here to answer all of your questions, and help you meet your neighbors. Call us, email us or stop in to see us today!', '74', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3ba73960-9584-41e6-949b-c498078249bf', 'Office of Alumni Relations (Campus Resource)', 'The Office of Alumni Relations is your catalyst to stay in touch with your lifelong Northeastern community, keep learning, access career strategies, engage with thought leaders and idea-generators, and find the resources you need to achieve what’s next.', 'Students Today. Alumni Forever. You are Northeastern.The alumni experience began when you enrolled at Northeastern. It''s never too early to learn about how Alumni Relations can help you build a robust, lifelong network, that helps you achieve what''s next now, and beyond your time at Northeastern. Stay connected with us to enrich your student experience, participate in events, and nd opportunities for leadership, career development, and networking. We''re here to help you shape your Northeastern experience.Interested in becoming an integral part of the student-alumni experience? Join one of our student organizations. + +Student Alumni Ambassadors (SAA) + + + +The Student Alumni Ambassadors (SAA) is committed to creating and maintaining the unique bond between the students and alumni of Northeastern University; striving to offer educational, social, and character enriching activities and events for all past, present, and future Huskies. + +SAA is comprised of undergraduate students representing all class years, majors, programs, and experiences. Members exemplify Northeastern pride, commitment to the university community, and an eagerness to connect current students to alumni. + +As ambassadors of the Office of Alumni Relations, SAA members are the conduit to connect students with alumni, bring awareness about opportunities students can access now and after graduation, and more importantly, make sure the Northeastern spirit lives on! Learn more about the Northeastern Student Alumni Ambassadors. Senior Year Experience Board (SYEB)The Senior Year Experience Board (SYEB) is a group of undergraduate senior volunteers charged with advising OAR the on programming, educating peers on philanthropy, and executing meetings and programming throughout the year. The SYEB works with theSenior Year Experience advisor on all aspects of the SYE to ensure that content and programming is relevant to the students and enhances their experience as seniors.', '833', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('01214497-ce5b-4e96-a962-e0f1d54afca4', 'Office of Prevention & Education at Northeastern (Campus Resource)', 'OPEN provides education, programming, assessment and referral services for Northeastern students surrounding substance use. OPEN provides supportive, confidential, and non-judgmental services; we encourage students to make informed decisions about alco...', 'The Office of Prevention and Education at Northeastern provides prevention and education services on the topics of alcohol and other drugs, sexual violence, and sexual health. We seek to provide supportive, accessible and non-judgmental services to students as well as to engage our community on wellness-related topics.', '911', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ef8c701a-6c33-4967-b619-38d0f08fcd49', 'Office of Sustainability (Campus Resource)', 'Northeastern University''s Office of Sustainability is tasked with many aspects of carbon reduction, campus awareness/engagement, and advancing a systematic approach to sustainability in all curriculum, operations, research and engagement. ', 'Welcome to the Office of Sustainability (Campus Resource) at Northeastern University! Our dedicated team is committed to leading the charge in carbon reduction, fostering campus awareness and engagement, and championing a holistic approach to sustainability. We integrate sustainability into all facets of university life, from shaping curriculum and daily operations to driving cutting-edge research and fostering community engagement. Join us in creating a greener, more sustainable future for our campus and beyond!', '95', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('84e858a0-7a48-486d-9e9b-e410c6fb82fd', 'Omega Chi Epsilon (Chemical Engineering Honor Society)', 'Xi Chapter of the National Chemical Engineering Honor Society', 'The Northeastern chapter of the Omega Chi Epsilon Chemical Engineering Honor Society consists of highly motivated chemical engineering upperclassmen who have excelled in academics. The goal of the club is to foster academic and career success for underclassmen in the challenging major. OXE''s flexible mentoring program allows underclassmen to access advice - whenever they require it - from accomplished upperclassmen chemical engineering students who may have encountered many of the same problems and big decisions in their own undergraduate careers. + + ', '792', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fe1ccff6-b318-4033-bc38-46a55c971eac', 'Omega Phi Beta', 'Omega Phi Beta Sorority, Incorporated was founded on March 15, 1989 at the University at Albany, State University of New York. The historical marginalization of women, particularly women of color, has had a significant impact on the process by which mu...', 'Omega Phi Beta Sorority, Incorporated was founded on March 15, 1989 at the University at Albany, State University of New York. The historical marginalization of women, particularly women of color, has had a significant impact on the process by which multi-cultural, multi-ethnic and multi-racial women ascertain educational, economic, social and political capital in American society. In response to this reality, seventeen women from various racial, ethnic, and cultural backgrounds synthesized their passion, commitment and motivation. They envisioned an organization that would unify women of color who were dedicated to correcting the injustices that have and continue to affect our communities.', '266', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5367bdbf-8797-4cf1-ab1e-08b6949fa97d', 'One for the World Northeastern', 'One for the World (OFTW) is a nationwide organization dedicated to ending extreme poverty. Using the principles of effective altruism, we help students pledge 1% of their post-graduation income to the most effective charities in the world.', 'One for the World (OFTW) is a nationwide organization that aims to revolutionize charitable giving to end extreme poverty. Our goal at OFTW Northeastern is to educate the Northeastern community about effective altruism and help students pledge 1% of their post-graduation income to the most effective charities. Our portfolio, developed in partnership with GiveWell, includes 16 efficacious charities to ensure every dollar donated has the most impact. Just a small percentage of our income can dramatically change people''s lives across the world. ', '166', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9a66803d-d4e0-4928-8040-19e81e31f089', 'Operation Smile', 'Every three minutes a child is born with a cleft. A child with a cleft has twice the odds of dying before their first birthday. Operation Smile is an international children''s charity that performs safe effective cleft lip and cleft palate in resource p...', 'Every three minutes a child is born with a cleft. A child with a cleft has twice the odds of dying before their first birthday. Operation Smile is an international children''s charity that performs safe effective cleft lip and cleft palate in resource poor countries. We are a mobilized force of international medical professionals and caring heart. Since 1982, Operation smile- through the help of dedicated medical volunteers- has provided free surgical procedures for children and young adults. With our presence in over 60 countries we are able to heal children''s smiles and bring hope for a better future. For more information about the organization please visit www.operationsmile.org At Northeastern we work to rasie money and awareness to provide surgeries for children with cleft lip and/or palate in third world countries. We also support other community service efforts in Boston. + +Please contact operationsmileneu@gmail.com for any inquires relating to our on-campus organization. ', '64', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c0a50d22-76b4-46d7-b045-0fc1cf98f2ca', 'Order of Omega', 'Honoring Greek leaders since 1959', 'Welcome to the Order of Omega! Established in 1959, our club is dedicated to honoring the exceptional leadership of Greek members within our community. Through a rich tradition of recognizing outstanding students, we strive to foster a spirit of unity, service, and excellence. As a member, you''ll have the opportunity to connect with like-minded individuals, participate in rewarding service projects, and uphold the values that define our organization. Join us in celebrating the legacy of Greek leadership and making a positive impact on campus and beyond!', '404', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6443dce2-85bc-4f24-b36c-65cb57ab22d4', 'Origin', 'Origin is a student-run organization that works to increase the quantity and quality of ventures in Northeastern’s ecosystem that solve scientific & technological problems through outreach and speaker events that focus on STEM and business.', 'Origin is a student-run organization that aims to increase the quantity and quality of ventures in Northeastern’s ecosystem that solve scientific & technological problems. As a student-oriented program focused on community, Origin presents the opportunity for you to learn by communicating with a diverse set of ambitious individuals in a tight-knit environment where work ethic and curiosity are most valued. If you’re ready to work hard in the space of discoveries, eager to learn from others, and excited to collaborate with equally enthusiastic students, you’ve found the right place.', '314', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('17efbb66-dc5b-46e4-be11-215534fb635e', 'Out in Business', 'Out in Business is a organization whose purpose is to create and maintain an inviting space for LGBTQ+ students of Northeastern University interested in the business field to organize, socialize, and form connections with one another.', 'Out in Business is a organization whose purpose is to create and maintain an inviting space for LGBTQ+ students of Northeastern University interested in the business field to organize, socialize, and form connections with one another, all the while cultivating and promoting the personal and professional growth of its members through the study of business and its applications in the world. ', '918', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7849a398-638c-4b4c-bf34-3f1576d5327b', 'Out in STEM at Northeastern University', 'Out in Science, Technology, Engineering, and Mathematics (oSTEM) is a national society dedicated to LGBTQIA education, advancement, and leadership in the STEM fields.', 'Out in Science, Technology, Engineering, and Mathematics (oSTEM) is a national society dedicated to LGBTQIA education, advancement, and leadership in the STEM fields.', '1012', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('453d8638-9ee5-4536-bb8c-e4c97bb78576', 'Pakistani Student Association', 'Pakistani Student Association', 'The Pakistani Students Association at Northeastern University (PakSA at NU) aims to embrace the unity, culture, and heritage of Pakistani students. Through this student organization, we seek to provide a space where Pakistani students at Northeastern can feel connected to their culture and language in the midst of their studies. We strive to cultivate an authentic understanding and celebration of Pakistani culture on campus. ', '654', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f5f267dd-2546-44d2-a050-2df29019a3c8', 'Pan Asian American Council (Campus Resource)', 'The Pan Asian American Council aims to provide support, training and resources for Asian American students, particularly those serving in leadership positions in their respective organizations.', 'The Pan Asian American Council aims to provide support, training and resources for Asian American students, particularly those serving in leadership positions in their respective organizations.', '356', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('65315542-f7a8-44f9-a2b7-e2130758f5be', 'Panhellenic Council', 'Panhellenic Council is responsible for overseeing 11 Panhellenic chapters: Alpha Epsilon Phi, Alpha Chi Omega,Chi Omega, Delta Phi Epsilon, Delta Zeta, Kappa Delta, Kappa Kappa Gamma, Sigma Delta Tau, Sigma Kappa, Sigma Sigma Sigma, and Phi Sigma Rho*.', 'The Northeastern University Panhellenic Council promotes shared values of friendship, leadership, scholarship, and philanthropy among women. The Panhellenic Council also strives to advance crucial relations with communities throughout Fraternity and Sorority Life, Northeastern University, and Boston. + +Panhellenic Council is responsible for overseeing the 11 chapters: Alpha Epsilon Phi, Alpha Chi Omega,Chi Omega, Delta Phi Epsilon, Delta Zeta, Kappa Delta, Kappa Kappa Gamma, Sigma Delta Tau, Sigma Kappa, Sigma Sigma Sigma, and Phi Sigma Rho*. + + + +*Phi Sigma Rho is an affiliated chapter of the Northeastern Panhellenic Council, but is not affiliated with NPC. For more information on this chapter please see their organization page on Engage. ', '63', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('91b1a3d5-1412-4a05-90c5-365ff25edd08', 'Peace Through Play', 'Peace Through Play is a student-run organization founded and based at Northeastern University. We create opportunities for the mutual empowerment of college students and Boston youth through educational games, crafts, and other learning mediums.', 'Peace Through Play is a student-run organization founded and based at Northeastern University. We create opportunities for the mutual empowerment of college students and Boston youth through educational games, crafts, and other learning mediums. + +Since 2018, Peace Through Play has been partnered with the Northeastern University Human Services Program and our faculty advisor Dr. Emily Mann, a senior research associate and teaching professor with the program. Dr. Mann''s "Science of Play" honors seminar students collaborate with our executive board each year to develop supplemental materials for our curriculum that promote the power of play with respect to child development. + +As most people may guess, play is a critical part of child development. It allows children to problem solve; cultivate their imaginations; discover their interests and improve their language, motor, and executive function skills. Peace Through Play also works to emphasize the five core social emotional learning competencies as defined by the Collaborative for Academic, Social, and Emotional Learning (CASEL). These competencies lay the foundation for each child''s success academically, socially, and otherwise. For a variety of reasons, ranging from public school budget cuts to an increasing emphasis on academic scores, play is one of the first aspects of the school day to be minimized or eliminated. Peace Through Play provides Boston youth with opportunities to reincorporate that play into their lives and development. + +Please feel free to visit our website or social media to learn more, and don''t hesitate to reach out with any questions! To hear from some of our volunteers, watch the video below. + + + +https://www.youtube.com/watch?v=Vx5eJHDoRJU + + + +We have also been featured on Northeastern''s Follow Friday series, which you can view below. + + + +https://www.youtube.com/watch?v=4xTnI7B9D-Q', '376', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('91e5b613-e46b-4703-ae64-3f0f2cff2bd5', 'Phi Alpha Delta: International Legal Fraternity of Northeastern University Frank Palmer Speare Chapter', 'With over 650 law, pre-law, and alumni chapters, Phi Alpha Delta (PAD) is the largest co-ed legal fraternity in the United States. Focused on promoting a deeper understanding of the law and the legal profession, PAD is open to students of all majors.', 'With over 650 law, pre-law, and alumni chapters, Phi Alpha Delta (PAD) is the largest co-ed legal fraternity in the United States. Focused on promoting a deeper understanding of the law and the legal profession, PAD supports is open to supporting students in all majors in their academic and professional pursuits related to law. PAD offers several resources to members, including LSAT seminars, guest speakers from the legal field, college and career fairs, discounts on prep materials, and law-related volunteer opportunities. In addition to being a professional fraternity, PAD also coordinates social events for members – both within the fraternity and with other student groups on campus. All Northeastern students are welcome to join, regardless of major or professional goals.', '826', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('017ca9fe-4ba7-4b21-8ebd-e7fe827ac99e', 'Phi Beta Sigma Fraternity Inc.', 'Phi Beta Sigma Fraternity was founded at Howard University in Washington, D.C., January 9, 1914, by three young African-American male students. The Founders, Honorable A. Langston Taylor, Honorable Leonard F. Morse, and Honorable Charles I. Brown, want...', 'Phi Beta Sigma Fraternity was founded at Howard University in Washington, D.C., January 9, 1914, by three young African-American male students. The Founders, Honorable A. Langston Taylor, Honorable Leonard F. Morse, and Honorable Charles I. Brown, wanted to organize a Greek letter fraternity that would truly exemplify the ideals of brotherhood, scholarship, and service. The Founders deeply wished to create an organization that viewed itself as “a part of” the general community rather than “apart from” the general community. They believed that each potential member should be judged by his own merits, rather than his family background or affluence…without regard to race, nationality, skin tone or texture of hair. They desired for their fraternity to exist as part of an even greater brotherhood which would be devoted to the “inclusive we” rather than the “exclusive we”. From its inception, the Founders also conceived Phi Beta Sigma as a mechanism to deliver services to the general community. Rather than gaining skills to be utilized exclusively for themselves and their immediate families, they held a deep conviction that they should return their newly acquired skills to the communities from which they had come. This deep conviction was mirrored in the Fraternity’s motto, “Culture For Service and Service For Humanity”. Today, Phi Beta Sigma has blossomed into an international organization of leaders. No longer a single entity, members of the Fraternity have been instrumental in the establishment of the Phi Beta Sigma National Foundation, the Phi Beta Sigma Federal Credit Union and The Sigma Beta Club Foundation. Zeta Phi Beta Sorority, founded in 1920 with the assistance of Phi Beta Sigma, is the sister organization of the Fraternity.', '309', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5eeb4cb4-2699-4978-96c5-898f3f7cd4d1', 'Phi Delta Chi', 'Phi Delta Chi is a professional pharmacy fraternity whose objective is to advance the science of pharmacy and its allied interests, and to foster and promote a fraternal spirit among its brothers. We pride ourselves on being a fraternity that mixes a p...', 'Phi Delta Chi is a co-ed professional pharmacy fraternity whose objective is to advance the science of pharmacy and its allied interests, and to foster and promote a fraternal spirit among its brothers. The Beta Chi Chapter at Northeastern University currently consists of 42 active Brothers and 138 alumni. Our chapter is nationally recognized for excelling in leadership, professionalism, service, scholarship, and brotherhood. In 2021, we ranked 2nd among 108 chapters of Phi Delta Chi in professionalism and service, 5th in our publication and 5th overall in the nation! + + + +Each year, we put on professional events including Bouve Health Fair, the Pharmacy Co-op and APPE Expos, fundraise for our official charity St. Jude, and attend national and regional conferences. The Beta Chi chapter focuses on leadership growth and professional development while encouraging brotherhood and academic excellence within the fraternity. We look forward to sharing our journey with you and watching your growth in the years to come. Learn more about us by visiting our website! www.phideltachibx.org + + + +If you’re interested in joining our e-mail list for Fall 2024 Recruitment or have any questions, feel free to fill out this interest form or email Jason Ssentongo (ssentongo.j@northeastern.edu) or Ehrun Omuemu (omuemu.o@northeastern.edu).', '755', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('dd3608aa-532d-474e-9f50-2a50853c7c1e', 'Phi Delta Epsilon Medical Fraternity', 'Phi Delta Epsilon includes medical and premedical chapters worldwide, in which students are invited into an expansive network of physicians and students which embraces diversity and pushes its members towards achieving the highest standards in medicine.', 'Phi Delta Epsilon was founded in 1904 at Cornell University Medical College and since then has amassed more than 150 medical and premedical chapters around the world. Students at Northeastern University could be potentially invited into an expansive network of physicians and students which embraces diversity and pushes its members towards achieving the highest standards in the medical community.', '818', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5ce1bc2e-48f1-44a7-8a58-98528cef6ecb', 'Phi Delta Theta', 'Phi Delta Theta is a recognized Northeastern fraternity composed of outstanding individuals. The fraternity operates under three guiding principles: friendship, sound learning, and moral rectitude.', 'Phi Delta Theta was organized with three principle objectives: The cultivation of friendship among its members, the acquirement individually of a high degree of mental culture, and the attainment personally of a high standard of morality. These objectives, referred to as the "Cardinal Principles," have guided over 235,000 men since 1848 when the Fraternity was founded at Miami University in Oxford, Ohio.', '808', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2106db0a-707e-4956-bf7c-0bb1a47a5be0', 'Phi Gamma Delta', 'Phi Gamma Delta unites men in enduring friendships, stimulates the pursuit of knowledge, and builds courageous leaders who serve the world with the best that is in them.', 'Phi Gamma Delta unites men in enduring friendships, stimulates the pursuit of knowledge, and builds courageous leaders who serve the world with the best that is in them.', '690', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5f3a0b44-1a77-4385-8b14-4859bdf20dd2', 'Phi Lambda Sigma', 'Phi Lambda Sigma is the National Pharmacy Leadership Society. Northeastern''s chapter is called the Gamma Kappa chapter. We strive to foster, encourage, recognize, and promote leadership among pharmacy students.', 'The purpose of Phi Lambda Sigma, also known as the national Pharmacy Leadership Society, is to promote the development of leadership qualities, especially among pharmacy students. By peer recognition, the Society encourages participation in all pharmacy activities. Since membership crosses fraternal and organizational lines, the Society does not compete with other pharmacy organizations. + +Phi Lambda Sigma honors leadership. Members are selected by peer recognition. No greater honor can be bestowed upon an individual than to be recognized as a leader by one’s peers. Such recognition instills and enhances self-confidence, encourages the less active student to a more active role and promotes greater effort toward the advancement of pharmacy. + +The Gamma Kappa chapter at Northeastern University hosts numerous annual events for the greater School of Pharmacy community throughout the year, including the PLS Leadership Retreat, the PLS Leadership Series, and the School of Pharmacy 5K.', '48', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('94ae40df-f0b3-44f5-b25a-6e675ead69ba', 'Phi Sigma Rho', 'Phi Sigma Rho is a national social sorority for women and non-binary individuals in STEM. Our members develop the highest standard of personal integrity, strive for academic excellence, and build friendships that will last a lifetime.', 'Phi Sigma Rho is a national social sorority for women and non-binary people in engineering technologies and technical/STEM studies. Our members develop the highest standard of personal integrity, strive for academic excellence, and build friendships that will last a lifetime. Together we build the future. + +If you are interested in joining Phi Sigma Rho, we hold both Spring and Fall Recruitment. Please follow @phirhonu on Instagram to find out more and see announcements about our recruitment! + +If you would like to receive more information about Fall 2023 Recruitment, please fill out our interest form!', '259', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a40bd8bb-0771-474b-9cbd-128081e83b04', 'Pi Delta Psi Fraternity, Inc.', 'Pi Delta Psi is an Asian interest fraternity founded on four pillars: Academic Achievement, Cultural Awareness, Righteousness, and Friendship/Loyalty. Our main mission is to spread Asian American culture and empower the Asian community.', 'Pi Delta Psi was founded on February 20, 1994 in Binghamton University, State University of New York. The eleven men were responsible for architecting the guiding principles, which have now developed into one of the nation''s largest Asian Cultural Interest Fraternities. Over the next three years (1994-1996), Pi Delta Psi had expanded into the University at Buffalo and Hofstra University. Every expansion resulted in positively impacting the school and surrounding community. By 2000, Pi Delta Psi had expanded to 11 prestigious campuses spanning four states, setting a record for the fastest growing organization of its kind since inception. With a fierce growth in the brotherhood and a strengthened alumni base, the fraternity rebuilt its National Council in 1999, standardizing Pi Delta Psi throughout all its chapters. Today, the Fraternity continues to grow in size and prestige. What began as a dream for the eleven founders, has become the work and dedication of thousands across the country and across seas.', '841', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('51146862-0dc0-4c63-8405-1ab992e8a151', 'Pi Kappa Phi', 'Since our inception we have forged a brotherhood of over 100 leaders unlike any other and raised awareness for our national organization''s very own philanthropy, The Ability Experience.', 'Since our inception, we have forged a brotherhood of over 100 leaders unlike any other and raised awareness for our national organization''s very own philanthropy, The Ability Experience.', '917', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4d66ab2e-c555-4dfa-9aae-8d7211664aa9', 'PIH Engage', 'Partners In Health Engage Northeastern (PIH Engage NEU) is building the right to health movement through advocacy, community building and fundraising. ', 'Partners In Health Engage (PIHE) is building the right to health movement by recruiting and empowering teams of dedicated volunteer community organizers. These teams drive campaigns focused on building and directing power towards generating new resources, fostering public discourse, and advocating for effective policies. + +We organize by building strong teams and by fostering alliances with like-minded groups to ensure that the right to health is highlighted in the democratic process. + +We educate by hosting discussion groups and public lectures about the right to health. + +We generate resources to fund high quality healthcare for people living in poverty. + +We advocate for global and domestic policies that further the right to health. + +Together, we demand the right to health be protected for all people, everywhere.', '837', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e86e3800-2400-4c18-ae5f-b0f24f8a9f84', 'Pinky Swear Pack', 'We are dedicated to lightening the burden that pediatric cancer places on both children and their families. We hold a variety of events to educate, support, and create impact in the lives of children battling cancer.', 'If you would like to join our volunteer group, please email us! + + + +We are a community of like-minded individuals who educate, support, and create an impact in the fight against pediatric cancer. We hold a wide variety of events, ranging in involvement levels from hospital visits to card making. We have previously met bi-weekly on Wednesday''s and hold events regularly. ', '489', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('964843b7-e7da-4568-933b-59c9ca60a56d', 'Pre-Physician Assistant Society', 'The purpose of the Pre-PA Society is to educate students about the PA profession and guide those interested in pursing this career. The Society will help students decipher required coursework and promote academic achievement, as well as aid in the prep...', 'The purpose of the Pre-PA Society is to educate students about the PA profession and guide those interested in pursing this career. The Society will help students decipher required coursework and promote academic achievement, as well as aid in the preparation for the graduate school admission process. Furthermore, interactions with health care professionals and graduate students will give undergraduates insight to this rapidly growing and competitive field. Society meetings will also help to facilitate communication among pre-PA students.', '965', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a6e93234-d3ef-4e31-b1bd-53c5a288a66e', 'Prehistoric Life Club', 'The PLC is a club dedicated to the cultivating of knowledge and passion for all things related to prehistory. Fans of paleontology, paleobotany, and those with just some interest in learning are all welcome at all of our meetings.', 'The Prehistoric Life Club is primarily dedicated to the reignition of passion in learning about prehistory as well as providing a space for the education of prehistory on campus. Many of us once enjoyed learning about prehistory, but the education system and social pressures caused us to push it down, and lose our love for dinosaurs and other fascinating lifeforms. The PLC wants to draw that love out of those who have pushed it down and be a space for those who never lost it to gather too. We hold many kinds of events, ranging from trivia nights to educational presentations.', '455', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d72103a8-b8a0-4a6d-a698-bebe3ac5c395', 'Private Equity & Venture Capital Club', 'We strive to allow students to create connections with their peers, faculty, and professionals within the private equity and venture capital industries through club activities and initiatives throughout the semester. ', 'Welcome to the Private Equity & Venture Capital Club! Our club is dedicated to providing students with opportunities to connect with their peers, faculty members, and industry professionals within the private equity and venture capital sectors. Through engaging club activities and initiatives held throughout the semester, members can gain valuable insights, build networks, and enhance their understanding of these dynamic fields. Whether you are curious about investing or aspiring to pursue a career in finance, our club offers a vibrant community where you can learn, grow, and thrive together. Join us on this exciting journey to explore the world of private equity and venture capital!', '613', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d089f7c9-bb2e-4d00-9dc2-ba5eb11dae10', 'Progressive Student Alliance', 'United Students Against Sweatshops Local 115', 'Hello! We are Northeastern''s Progressive Student Alliance (PSA), a local affiliate of United Students Against Sweatshops that organizes for student and worker power on our campus and beyond. + +Currently, PSA is organizing an anti-militarism campaign, focused on Northeastern''s relationship with the war industry (weapons manufacturers and other companies fueling violent conflict). + +We''ve formed the Huskies Organizing with Labor (HOWL) in support of dining workers. In 2017, the dining workers'' contract was up for renewal and their union was pushing for a minimum salary of $35,000 and comprehensive health benefits. HOWL was able to organize enough student support to pressure Northeastern to agree to demands a day before workers were planning to strike. In 2022, the dining workers'' contract was up for renewal again, and we supported HOWL and the workers in their organizing. In the end, improved wages, healthcare benefits, and other conditions were won, just before a strike was likely to happen. + +We have also organized with Full-Time Non-Tenure Track (FTNTT) Faculty. Northeastern administration has now twice denied their right to a free and fair election to unionize. Since the second occurrence in 2019, PSA has been gathering student support for their campaign with SEIU Local 509. + +PSA also stands in solidarity with international campaigns. In 2017, we were successful in pressuring Northeastern to cut ties with Nike. + +Collective Liberation is at the core of everything we do. We believe that no one can be truly free unless everyone is free. + +If you''re interested in learning more, you can sign up for our mailing list and check us out on Instagram (@neu.psa)! You can find important links at linktr.ee/neu.psa and contact us at neu.psa@gmail.com.', '233', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a3bb4ecd-66c8-46fd-9e6f-81ae8477467e', 'Project Sunshine', 'Project Sunshine seeks to have college volunteers positioned to serve as role models to children facing medical challenges. Trained volunteers engage in facilitating creative arts and crafts with patients and their families.', 'Project Sunshine has active college chapters on over 60 campuses nationwide. College volunteers deliver two types of programs. The first program called TelePlay, is when small groups of patients and trained volunteers meet by video conference to engage in play and activities. The second program occurs in the medical facilities where volunteers facilitate creative arts and crafts with patients and their families. Given our close proximity in age and approachability, college volunteers are uniquely positioned to serve as role models to children facing medical challenges. + +Through volunteering, college students develop leadership skills, engage in service opportunities, and raise awareness about Project Sunshine across the country. Chapters participate in both types of volunteer program activities, organize Sending Sunshine events, and fundraise on campus to support Project Sunshine’s mission.', '127', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('52738ae4-4edf-41c1-b4ad-03fc118f3f90', 'Psychedelic Club of Northeastern', 'Our mission is to be a forum for the Northeastern community to discuss psychedelics and consciousness research through a myriad of perspectives such as psychology, culture, criminal justice, religion, and art.', 'Our mission is to be a forum for the Northeastern community to discuss psychedelics and consciousness research through a myriad of perspectives such as psychology, culture, criminal justice, religion, and art. We hope to target current Northeastern students who may be interested in learning how psychedelics can positively help out the world. A typical meeting includes discussion around current psychedelic news, forums around specific types of psychedelics, and harm reduction and help for those struggling from a psychedelic trip.', '679', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('43f659ef-e17d-49b9-abc8-da64251394e2', 'Puerto Rican Student Association', 'Our purpose is to serve as a space where Puerto Rican students can share their culture and socialize. ', '', '673', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('21e5dc15-e416-46f7-806d-cd9c6755b92c', 'Rangila', 'Rangila is an empowering and vibrant all-girls dance team that fuses the best elements of traditional Indian and modern Western styles. Rangila means ''color'', and like the word, we aspire to be as visually striking as possible.', 'Rangila is Northeastern’s premier Bollywood fusion dance team that combines the bestelements of traditional Eastern and modern Western styles of dance. We compete acrossthe country in styles such as Bollywood, Hip Hop, Contemporary, Bhangra, and more, unitedby our love for dance. We strive to build an appreciation for dance and culture. + + + +NU Rangila Promo Video 2022-2023', '308', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('032f8cf8-e928-48b6-9f68-1e629c7110a2', 'Resident Student Association', 'The Resident Student Association is a student government body dedicated to representing students living on campus. Our three pillars are programming, leadership, and advocacy to make residence halls more serviceable and livable.', 'The purpose of the RSA is to serve as the official liaison between the students living in Northeastern University (herein “University” or “NU”) residence halls and the staff and administration of the Department of Housing and Residential Life; to act as a programming organization to the students living in NU residence halls; to act as an advocacy body on behalf of the resident student population; to provide leadership development opportunities to resident students; to oversee residence hall councils; to strive to make NU residence halls a continually more serviceable and livable community; to aim for a membership that equally represents each of the residence halls on campus; to act in an advisory capacity to the resident students and the staff and administration of University offices in matters pertaining to NU residence halls; to be a means by which the Resident Activity Fee (herein “RAF”) is distributed; and to be the means by which the residence population affiliates itself with the NACURH Association of College and University Residence Halls, Inc. (herein “NACURH”).', '975', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7cbbd91a-1034-41ec-90b3-e26bad836bd8', 'Rethink Your Drink', 'Rethink Your Drink is an organization committed to promoting healthier beverage options and sustainability both within campus and in the greater Boston community through various outreach events.', 'Rethink Your Drink is an organization committed to promoting healthier beverage options and sustainability both within campus and in the greater Boston community through various outreach events. We organize various events, panels, and tabling sessions to raise awareness regarding this mission. + +Rethink Your Drink began as a collaboration with the Boston Public Health Commission to implement a component of the Commission’s ‘Let’s Get Healthy, Boston!’, a 3-year grant from the Centers for Disease Control (CDC) to reduce obesity in Boston. As the campus-based component of this project, Rethink Your Drink encouraged members of the NU community to “rethink” their consumption of sugary beverages to reduce caloric intake and ultimately obesity. In collaboration with Northeastern''s Office of Sustainability and Energy, we have also promoted the addition of 190 filtered water stations on campus and lobbied for the inclusion of their locations on the NUGo app. Past events have included displays at Earth Day, Water Day, Sustainability Day, and the Bouve Health Fair to collect filtered water dispensers location suggestions. Our annual "Hydration Station" provides the opportunity for students and staff to try fruit-infused water recipes and distributed infuser water bottles. + + + +Meetings: every other Monday 630-7pm on Zoom + +Spring 2021 dates: 1/25, 2/8, 2/22, 3/8, 3/22, 4/5, 4/19 + + ', '605', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e710a596-0331-4b3d-9376-f17d61c5213b', 'Revolve Dance Crew', 'Founded in 2009, Revolve Dance Crew is a hip-hop dance team at Northeastern University, consisting of dancers from a variety of backgrounds. Our dancers work to develop their own personal style and get involved in the Boston dance scene. ', 'Founded in 2009, Revolve Dance Crew is a hip-hop dance team at Northeastern University, consisting of dancers from a variety of backgrounds. Revolve strives to provide an environment for dancers to develop their own personal dance style, express their artistic and creative vision through movement, and get involved in the local Boston dance scene. Revolve aims to support different charities and nonprofits in need, selecting a cause each semester to donate their proceeds to. Overall, Revolve works to have a positive impact on not only the dancers involved but also the world around them. + +Revolve''s YouTube!', '707', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b0463c60-0912-4851-8012-6ae55742002d', 'Rho Chi Beta Tau Chapter', 'Rho Chi is the official Pharmacy honor society and is recognized nationally.', 'Rho Chi is the official Pharmacy honor society and is recognized nationally.', '695', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('29560832-55a2-4110-8fbc-733ba606582e', 'Roxbury Robotics of Northeastern University', 'Roxbury Robotics is a community outreach program for students driven to provide local Roxbury students with STEM education through service-learning.', 'Roxbury Robotics is a community outreach program for students to connect with the community around the university. Students visit a local school or community center once a week for the length of the semester to teach middle school-aged children about engineering and how to build a LEGO Robot. The semester culminates in a showcase held at Northeastern University, where kids show off their hard work in front of parents, students, and partner organizations.', '174', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('026f4d61-a301-4bd1-97a6-b934da4798af', 'Rural Health Initiatives', 'The purpose of the Rural Health Initiatives is to promote the health and well-being of rural citizens by counteracting the effects of social isolation and loneliness, improving rural health literacy, and raising donations for essential items.', 'The purpose of the Rural Health Initiatives is to promote the health and well-being of rural citizens by counteracting the effects of social isolation and loneliness, improving rural health literacy, and raising donations for essential items. Our main initiative is the Tele-Friend program. + +TELEFRIEND - Pen-pal to older adults program: This program focuses on combating issues of loneliness and social isolation in rural older adult populations. By partnering college students with a “pen-pal” older adult partner, students can engage in virtual discussions and activities to help provide companionship to those who need it most. ', '127', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e3b07550-8ad8-41c6-b136-18d8f07926fd', 'Russian-Speaking Club', 'The primary purpose of this club is to create a network of students and faculty at Northeastern University who share an interest in the language, history and cultures of Russia and other countries of Eastern Europe and Central Asia. Our goal is to make...', 'The primary purpose of this club is to create a network of students and faculty at Northeastern University who share an interest in the language, history and cultures of Russia and other countries of Eastern Europe and Central Asia. Our goal is to make a positive impact on the Northeastern community by engaging Club members in events, actions, and debates both on campus and outside. The Club will create opportunities for intellectual discourse and meaningful action through our network of professors and external speakers, participation in community-related events organized by the Club, and through interaction with other Northeastern clubs and organizations. It will aim to elevate student cultural awareness through cultural exchange and sharing of international perspectives, student-faculty led educational seminars on real-world topics, and active support and involvement with other Russian organizations in the Boston area. In addition to the networking and leadership opportunities, the Russian-Speaking club will also host a variety of social gatherings to promote socialization and share elements of the culture and society of Russia and surrounding regions with the university community.', '328', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a6a5543e-1e39-4a13-a333-0778cdcfb6c1', 'Sandbox', 'Sandbox is Northeastern''s student-led software consultancy. We build software products for the Northeastern student body, nonprofits, and academic researchers.', 'Sandbox is Northeastern''s student-led software consultancy. Sandbox members work in teams on projects that typically last two semesters or longer. We''ve done work for clients within the academic research disciplines at Northeastern, building software products to aid researchers in various experiments on healthcare, language learning, artificial intelligence, and more. Sandbox also houses a few projects that benefit the Northeastern community (such as searchneu.com and Khoury Office Hours), providing them with development resources to keep them up, running, and improving. + + + +Check out our Introduction video: https://www.youtube.com/watch?v=6h-77kEnbtI + +Visit our linktr.ee to join our Community Slack for event updates, sign up for our mailing list, see some of our past work, and more! https://linktr.ee/sandboxnu + +We recruit new members and take new projects every fall and spring semester. Check out our website https://sandboxnu.com to learn more.', '3', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('49e5474a-ad99-4b6f-9849-9ad595a7313f', 'Sanskriti', 'Indian Students'' Association at Northeastern University.', 'We are the Indian Students'' Association at Northeastern University, Boston. We aim to keep the traditions radiant and flourishing, bridge gaps between students of diverse backgrounds, cater them to meet fellow students and provide a common platform them to showcase their talents in various art forms. + +NU Sanskriti is one of the biggest Indian Students'' Associations in the United States catering to over 7900 active Indian students at Northeastern University.', '516', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1b37f6a1-e7b5-4691-a71b-23a23c91ad01', 'Scandinavian Student Association', 'The Scandinavian Student Association aims to build a community of support for Scandinavian students. Through the provision of bonding and cultural activities, as well as community events we strive to create a home away from home. ', 'The Scandinavian Student Association aims to build a community of support for Scandinavian students. Through the provision of bonding and cultural activities, as well as community events we strive to create a home away from home.', '764', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('670fa5f9-984e-41a8-bd7a-baa40a5814dc', 'Science Book Club', 'NEU Science Book Club''s purpose is to spark conversation amongst students of all backgrounds by discussing and analyzing fun scientific novels. SBC aims to hold volunteering events and movie/activity nights to further connect our community!', 'Science Book Club''s purpose is to spark conversation amongst students by discussing and analyzing fun scientific novels. We will primarily read non-fiction books that have to do with the sciences. We will also have volunteering events and movie/ activity nights apart from reading discussions. Hope to see you there! + +Visit our LinkTree for the meeting calendar and other important links!', '947', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c65d8ed5-cdaa-43e2-a9d8-02872027b61a', 'Science Club for Girls Mentor Chapter at Northeastern', 'Science Club for Girls (SCFG) is an organization in the Boston area serving underrepresented girls and gender expansive youth grades K-12. At Northeastern, our club would provide students with mentorship opportunities in partnership with SCFG.', 'Welcome to the Science Club for Girls Mentor Chapter at Northeastern! Our club is an inclusive organization in the heart of Boston, dedicated to empowering underrepresented girls and gender expansive youth in grades K-12. At our chapter, we provide a safe and inspiring space for students to explore the wonders of science and technology. Join us for exciting mentorship opportunities where young minds can thrive and grow, supported by the guidance of dedicated mentors and the vibrant community of SCFG. Together, let''s ignite the spark of curiosity and passion for STEM among the future leaders of tomorrow!', '787', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5d020637-878e-4270-acbc-14c138c4f799', 'Secular Humanist Society', 'We are a group of mostly Atheist and Agnostic students, but we welcome an encourage engagement from all students! As a group we identify with humanism, and we take an interest in finding purpose and meaningful dialogue.', 'We are a group of mostly Atheist and Agnostic students, but we welcome an encourage engagement from all students! As a group we identify with humanism, and we take an interest in finding purpose and meaningful dialogue. We examine and compare the scientific and spiritual, the rational and the openly strange sides of the universe. While we are founded as a safe and welcoming community for atheists, agnostics, humanists, and skeptics, we welcome all beliefs, peoples, and creeds and are proudly non-discriminatory. + +Join our Mailchimp list! http://eepurl.com/gCj1yL', '156', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4cbcad6d-1691-4f9c-bdf1-ab6c82958fb0', 'Security Club', 'We provide students with academic enrichment in security, through hosting workshops, talks, company events, and panels geared towards educating members about the industry and providing a supportive environment for learning and practicing security skills.', 'Security Club is a student-led group that provides students with academic enrichment, a close-knit support system, and a supportive community environment for learning about cybersecurity. We host interactive labs, workshops, tech talks, company events, and panels to educate members about the industry and provide a supportive environment for learning and practicing security skills. + + + +Our goal is to introduce students to cybersecurity in a holistic manner, enabling students to discover what specifically interests them in security early on, as well as giving them the chance to learn about the many different facets within the general field of security. + +Please join our mailing list here and the NU Cybersecurity Discord Group here.', '413', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('16be7f8a-b94e-4f25-8ab1-c9aac42f917c', 'Senior Legacy Committee (Campus Resource)', 'The Senior Legacy mission is to create a set of diverse opportunities for students to connect with one another in a meaningful way. The committee is committed to participating in a variety of events during the year to strengthen the bond between fello...', 'The Senior Legacy mission is to create a set of diverse opportunities for students to connect with one another in a meaningful way. The committee is committed to participating in a variety of events during the year to strengthen the bond between fellow seniors and encourage their peers to give back to the area of Northeastern that means the most to them. Most of all this group of seniors love Northeastern and have a lot of Husky Pride!', '142', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bc1fc335-eddf-453c-a07a-99eaed639db4', 'Sewing Club', 'NUSews is Northeastern’s all inclusive sewing club, dedicated to creating a welcoming environment for sewers of all levels! ', 'NUSews is Northeastern’s all inclusive sewing club, dedicated to creating a welcoming environment for sewers of all levels! We aim to create a common space for sewers of all different abilities and skillsets. Throughout the year, we have several different meetings planned out, so you can learn to do things like basic embroidery, clothing alterations, making your own clothes, and more! + +Join our Discord: https://discord.gg/dngrvhMt8f + +Follow us on Instagram: https://www.instagram.com/northeasternsews/', '1022', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('25eedef6-abb2-4894-894d-035678041417', 'Sexual and Gender Based Harassment and Title IX Hearing Board', 'TBD', 'TBD', '841', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('75a74f43-9bbf-41ae-b5ad-97134dfb1b47', 'Sexual Assault Response Coalition', ' A student group dedicated to bringing better, survivor-centered resources to campus to ensure the complete safety and health of all Northeastern students. SARC seeks to make Northeastern University a safer space for survivors of sexual assault and in...', 'A student group dedicated to bringing better, survivor-centered resources to campus to ensure the complete safety and health of all Northeastern students. SARC seeks to make Northeastern University a safer space for survivors of sexual assault and intimate partner violence by defending and advocating for their rights. Also the parent organization to the NEUspeakout Instagram page. It provides a safe and supportive space for survivors to share their stories and raise awareness around the pervasiveness of sexual violence at Northeastern. All stories remain anonymous and confidential', '942', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7aa72071-dd77-4f18-b765-00788e36186f', 'SGA Student Involvement', 'The SGA Student Involvement division represents the consensus of the Northeastern student organization community, and serves as the Student Government Association’s official liaison to student organizations. ', 'The SGA Student Involvement division represents the consensus of the Northeastern student organization community, and serves as the Student Government Association’s official liaison to student organizations. This includes advising the Center for Student Involvement and other senior Northeastern administration in all matters pertaining to student organizations. SGA Student Involvement includes the Student Involvement Board. + +The Student Involvement Board works in consultation with the Center for Student Involvement to approve changes in student organization constitutions and grant final recognition to new student organizations. + +SGA Student Involvement works to foster communication and collaboration among student organizations, resolve disputes within and between student organizations, serve as a student-to-student organizational resource, ensure student organizations are in compliance with SGA policies, and build support services to support student organization leaders in smooth and successful operations of their organizations. + +Please apply here: https://forms.gle/BjshAfbtNRWVVRkz8', '401', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3384e776-ec3f-42ab-a8dd-dfa7f6ee352c', 'SHRM Student Chapter', 'NU SHRM Student Chapter is a student-run organization based in Boston and virtually for undergraduates, graduates, and alumni. We will have guest speakers presenting on HR topics such as Resume Building, Digital HR, Global HR, etc. ', 'NU SHRM Student Chapter is a student-run organization for undergraduates, graduates, and alumni. We are the FIRST-ever Northeastern organization to include undergraduates, graduates, and alumni!! Additionally, we are the FIRST organization to incorporate a hybrid model of in-person and virtual events at Northeastern University. + + + +We encourage all students with any major or minor to join NU SHRM. Specifically if you are interested in learning more about HR-related topics. Our meetings will be held monthly via Zoom, providing students with essential workshops on specific HR Topics such as Resume Building, Employee Relations, Compensation Benefits, Digital HR, etc. Our leadership team and NU SHRM Committees will schedule guest speakers for panel discussions related to certain HR-related topics. We want every member to feel welcome and become knowledgeable about HR''s benefits in the workplace. + + + + + + + + + +Students can join the global SHRM Association for a yearly membership of $49 and receive: + + + + + + + + + +Digital HR Magazine subscription (student members do not receive the printed magazine with their membership) + +SHRM Student Focus Magazine (quarterly supplement to HR Magazine) + +Access to SHRM Online (all resources except access to the Knowledge Center) + +Membership Directory Online search capability + +Discounted rate for the first year of professional membership upon graduation + +Discounted rate to attend SHRM Annual Student Conference and Regional Student Conference + +Eligibility to apply for SHRM Foundation Scholarships + +Discounts for HRM/business management publication and SHRM logo products at online SHRMStore + + + + + + + +If you are interested in joining our NU SHRM Student Chapter, send us an email at shrm@northeastern.edu', '519', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4e6b3901-f133-41d9-b2df-9d7f9b6ad5de', 'Sigma Beta Rho Fraternity Inc.', 'Through their leadership, our brothers serve as role models and mentors in their communities and break down barriers between different ethnic groups, thus contributing their time and effort to attaining a better and brighter future for all. ', 'Sigma Beta Rho is the premier national multicultural fraternity in the United States. Founded in 1996 on the principles of duty to society, dedication to brotherhood, and the remembrance of cultural awareness, Sigma Beta Rho has since grown to share its goals with over 2,500 men on over 45 college campuses. + +The Northeastern University Chapter was founded on April 14th, 2007 by 13 young gentlemen. These individuals were strangers to one another, coming from different cultures, backgrounds, and lifestyles. Through the principles of Sigma Beta Rho, these 13 men grew to understand and respect one another, and celebrate the differences which make them unique. Unified through diversity, these gentlemen became known as the Alpha Class of Northeastern University. + +In the year that followed, the Alpha Class passed on the teachings of brotherhood beyond all barriers to ten additional gentlemen who were inducted as the Beta and Gamma classes of Sigma Beta Rho at Northeastern University. With the assistance of other multicultural Greeks, these 23 gentlemen pioneered the establishment of the Multicultural Greek Council at Northeastern University in the fall of 2008 and became an officially recognized multicultural Greek organization at Northeastern University. Their enthusiasm has fueled their success in the years following, and they continue to maintain an active presence in both the Northeastern and surrounding Boston communities.', '755', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bacc180d-97c5-48ae-a2b5-fa965b9fca30', 'Sigma Delta Pi', 'National Hispanic Honor Society', 'Sigma Delta Pi is the National Collegiate Hispanic Honors Society (more information here:https://sigmadeltapi.org/about/our-history-and-mission/). + + + +Established in 1919 at the University of California in Berkeley, Sigma Delta Pi was founded as a way to further and advance the teaching of Spanish language and culture in a collegiate environment. Over the past 100 years, the initial Sigma Delta Pi chapter has expanded to over 610 chapters in 49 states. + +Our chapter, Alpha Beta Gamma, was recently established in April 2019. Under the guidance of our faculty advisors, the Alpha Beta Gamma chapter of Sigma Delta Pi seeks to enrich and further a student''s understanding of Spanish language and culture through a variety of immersive events and opportunities. + + + +Application information is emailed each semester to Spanish majors and minors. For questions about eligibility please contact the advisor, Professor Agostinelli at c.agostinelli-fucile@northeastern.edu. + + + +Cultural events hosted by our chapter are open to all Spanish students and the Northeastern community. To stay up to date on our events, please bookmark our website https://sigmadeltapiatneu.weebly.com/eventos.html and/or follow us on social media @nusigmadeltapi! ', '597', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e8618f39-20af-49b0-964d-bf87010a17d8', 'Sigma Delta Tau, Gamma Mu', 'The mission of Sigma Delta Tau is to enrich the lifetime experience of women of similar ideals, to build lasting friendships, and to foster personal growth.', 'The mission of Sigma Delta Tau is to enrich the lifetime experience of women of similar ideals, to build lasting friendships, and to foster personal growth. Sigma Delta Tau shall encourage each member to reach her fullest potential by providing intellectual, philanthropic, leadership, and social opportunities within a framework of mutual respect and high ethical standards. We are the proud recipients of Northeastern''s Chapter of the Year 2014 and Sigma Delta Tau''s Outstanding Diamond Chapter 2015, 2016, and 2021.', '799', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9618d07b-cd85-48d9-a7d7-8448247e045d', 'Sigma Kappa', 'Sigma Kappa sorority is comprised of a diverse collection of driven, involved, and outgoing women, bound by the values of the Sigma Kappa founders. Academically, socially, and culturally, the Kappa Omega chapter works to continuously improve the commu..', 'Sigma Kappa sorority is comprised of a diverse collection of driven, involved, and outgoing women, bound by the values of the Sigma Kappa founders. Academically, socially, and culturally, the Kappa Omega chapter works to continuously improve the community and each other, fostering a one-of-a-kind sisterhood in their collegiate years and beyond. From their philanthropic endeavors to study hours to sisterhood events, the Kappa Omega sisters of Sigma Kappa sorority are looking forward to beginning their journey of growth with each other, their university, their community, and their sisters all over the world.', '907', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('40f68f35-fbb9-4e9f-85b8-af8be32a8088', 'Sigma Phi Epsilon', 'Sigma Phi Epsilon is one of the nation''s largest fraternities with over 15,000 current members and more than 300,000 total members. SigEp was founded in 1901 at University of Richmond, and has since become a leading fraternal organization at Northeastern', 'Sigma Phi Epsilon is one of the nation''s largest fraternities with over 15,000 undergraduate members and more than 300,000 total members. SigEp was founded in 1901 at the University of Richmond, and has since become the leading fraternal organization in the country. At Northeastern, SigEp practices the Balanced Man Program, a no-hazing no-pledging approach to constantly bettering its members. We hold our core values of Virtue, Diligence, and Brotherly Love to heart in an effort to lead balanced and meaningful lives.', '942', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('522c4361-6eb9-4552-9ba4-70b73f67393d', 'Sigma Psi Zeta Sorority, Inc.', 'We are the Alpha Upsilon Charter of Sigma Psi Zeta Sorority, Inc. at Northeastern University. We chartered on March 21st, 2021, becoming the 40th official membership of Sigma Psi Zeta.', ' + + + + + + + + + + + + + + + + + + + + + +Sigma Psi Zeta is a progressive, Asian-interest, multicultural sorority. Established on March 23, 1994 at the University at Albany, our SYZters have worked together with the goal of empowering women of color and combating violence against women in its varied forms. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +We are the Alpha Upsilon Charter of Sigma Psi Zeta Sorority, Inc. at Northeastern University. We chartered on March 21st, 2021, becoming the 40th official membership of Sigma Psi Zeta. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +', '934', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e38a5ca0-ce64-4c01-b93a-ac09a72a434a', 'Sigma Sigma Sigma', 'Sigma Sigma Sigma is a National Panhellenic Conference organization that seeks to establish sisterhood, a perpetual bond of friendship, to develop strong womanly character, and to promote high standards of conduct among its members.', 'Sigma Sigma Sigma is a National Panhellenic Conference organization that seeks to establish sisterhood, to create perpetual bonds of friendship, to develop strong womanly character, and to promote high standards of conduct among its members. Tri Sigma believes in outreach within our community. Many efforts revolve around our commitment to the Tri Sigma Foundation, including a partnership with the March of Dimes which supports premature babies and their families. Our philanthropic motto is “Sigma Serves Children,” which includes partnerships with local hospitals including Boston''s Franciscan Children''s Hospital. The sisters of Tri Sigma are focused on advancement and success and take part in valuable leadership and personal development experiences at Northeastern and post-graduation, seeking to empower each other and women around the world. We will be participating in Panhellenic COB recruitment this spring and are looking forward to meeting all of you!', '319', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('8ed1fbdc-c5cd-4778-8549-a18046584579', 'Sigma Xi', 'Sigma Xi is dedicated to the advancement of knowledge through research, service, and teaching. Our goal is to foster integrity in science and engineering and promote the public''s understanding of science for the purpose of improving the human condition.', 'The Northeastern University Chapter of Sigma Xi has two primary audiences: upperclass students with substantial independent research, and incoming students who want to become more involved in research but who have not yet done independent research. Students with substantial research may apply to become Affiliate or Associate Members Sigma Xi at the end of each Spring semester. Activities for Affiliate and Associate Members include: attending monthly chapter meetings, meetings to improve public speaking and slide creation, meetings about research awards, grants, and post-grad fellowships, executive board member-led gatherings, and meetings with research faculty and alumni to gain advice and insight. + +Students with minimal research experience seeking mentorship are well suited to becoming part of the Research Immerse Program (please note that you do NOT need to be a member of the honor society to participate in the Research Immerse Program - welcome to all Northeastern Undergraduates). The Research Immerse Program is a year-long commitment that runs from each Fall to Spring semester. Activities for Immerse Program members include: attending bi-weekly workshops that learn them how to conduct a scientific literature review by mentorship of Sigma Xi Affiliate or Associate Members, completing monthly assignments on their proposed research topic, and presenting their research at a research symposium at the end of the Spring semester. + +We also support the Think Like A Scientist program that is open to all Northeastern Undergraduates where students may mentor K-12 science experiments and projects in local Boston Public Schools. Activities for Think Like A Scientist mentors include: participating in weekly outreach programs, helping to develop curricula and lesson plans, and facilitating outreach within the Northeastern and Greater Boston communities. ', '202', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6c607886-d407-4095-b596-7028eac08a81', 'Signing Huskies at Northeastern University', 'Signing Huskies at NU (SHNU) is a space for students interested in ASL, interpretation, and Deaf culture/community to come together and learn. The club''s goal is to cultivate a deep interest and appreciation for the Deaf community, culture, and ASL. ', 'Signing Huskies at Northeastern University (SHNU) seeks to create a space for those interested in ASL, the Deaf community, Deaf culture, and interpretation to come together and learn about the Deaf community and Deaf culture as a whole. The club offers students a safe, encouraging, space to practice their ASL and interpreting skills, as well as offering workshops and presentations from guest lecturers within the Deaf and interpreting communities. Ultimately, Signing Huskies at Northeastern University aims to bring students together and cultivate a deep interest and appreciation for the Deaf community, Deaf culture, and ASL. ', '968', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('08543747-14c4-4298-a4ce-24841eb9d886', 'Silver Masque', 'Silver Masque is a student run theatre company that is committed to fostering a safe, supportive, and creative environment where students can collaborate in workshopping and producing original student work. ', 'Silver Masque is a student-run theatre company at Northeastern University, committed to fostering a safe, supportive, and creative environment in which students may collaborate in workshopping and producing original student work. + +Silver Masque offers opportunities in the following: acting, playwriting, directing, theatrical design, stage management, run crew, and more depending on programming. + +Core Values: + + + +Foster artistic innovation + +Share new stories and voices + +Cultivate meaningful relationships between emerging artists + +Ensure a safe and respectful production environment + +Build a welcoming creative community + +', '812', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('53702ae5-7311-44f8-8296-43da5fc952e0', 'Sisters in Solidarity', 'Sisters in Solidarity is an affinity group for Black cisgender and transgender women. Through unity among Black students, SiS is a haven where dynamic stories and unique experiences are shared so that we can cultivate a meaningful bond between us.', 'Sisters in Solidarity is an affinity group for Black cisgender and transgender women. Through unity among Black students, SiS is a haven where dynamic stories and unique experiences are shared so that we can cultivate a meaningful bond between us.', '426', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0b3ecd1c-22e2-420f-b9bd-66e567b96d8a', 'Skateboarding Club', 'We are the official club on campus for all skateboarding enthusiasts!', ' + +We are Northeastern''s official organization for all skateboarding enthusiasts! + + + + + + + +Our organization is open to skaters of all skill levels and backgrounds! Whether you are a pro or have never stepped on a board before, we are happy to have you join us. We aim to create a community on campus to teach and foster the activity, art, and culture of skateboarding. + + + + + + + +Some things that we do are weekly skate sessions, impromptu skate meetups, lessons, and design sessions for creating club videos, pictures, merchandise, and even skate equipment. We also have a Slack channel for all sorts of skating discussions! + +', '440', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('488f2279-566f-4fca-b342-2d55848f31a1', 'Slow Food NU', 'We are Northeastern''s food sustainability club! Our casual weekly meetings and occasional outings focus on the intersection of food, the environment, and human health. ', 'Slow Food Northeastern University (Slow Food NU) is a part of the international Slow Food Movement: "Slow Food believes food is tied to many other aspects of life, including culture, politics, agriculture and the environment. Through our food choices we can collectively influence how food is cultivated, produced and distributed, and change the world as a result." + +Slow Food NU promotes an increased awareness of the interconnectedness of food, the environment, and human health. Slow Food NU works to increase consciousness about the food system and its relation to social justice through deliberate and meaningful service projects, educational events, and transformative dialogue. These efforts establish and sustain lasting relationships with like-minded student groups, organizations, and initiatives throughout Northeastern’s campus and surrounding Boston neighborhoods. We value the belief that all people deserve food that is good for them, good for the people who grow it, and good for the planet. We are socially conscious learners, advocates, and eaters.We welcome people of all diets.', '102', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0e2ac07f-42a9-4f2c-a9d9-27aa28f38712', 'Society of Asian Scientists and Engineers', 'SASE is dedicated to the advancement of Asian heritage scientists and engineers in education and employment so that they can achieve their full career potential.', 'Are you looking for a community where you can make new friends, develop your professional skills, or embrace your interest in STEM? SASE may be the place for you! We offer an open environment for students to grow, learn, and have fun through themed general meetings, mentorship pairings, technical workshops, and conferences - we have something for everyone! + + + +SASE is dedicated to the advancement of Asian heritage scientists and engineers in education and employment so that they can achieve their full career potential. In addition to professional development, SASE also encourages members to contribute to the enhancement of the communities in which they live through community service. + + + +SASE’s mission is to: + +- Prepare Asian heritage scientists and engineers for success in the global business world + +- Celebrate diversity on campuses and in the workplace + +- Provide opportunities for members to make contributions to their local communities + + + +SASE membership is open to members of all genders, ethnic backgrounds, and majors. Please LIKE us on Facebook, follow us on Instagram, subscribe to our newsletter for the most up-to-date events! We''re also on Discord! Join here to hang out and play games with us!', '42', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('41d5cb73-0a49-47aa-a46f-fdec1e7c165d', 'Society of Hispanic Professional Engineers', 'SHPE promotes the development and retention of Hispanic students in engineering, science, and other technical professions to achieve educational excellence, provide service to the community, and preserve and enhance our cultural identity.', 'SHPE promotes the development and retention of Hispanic students in engineering, science, and other technical professions to achieve educational excellence, provide service to the community, and preserve and enhance our cultural identity. SHPE is dedicated to improving the overall academic, professional, and cultural experience of our Familia. Our Familia is open to anyone who believes in our mission. All of our seminars and workshops have always been open to anyone to attend. This way, we can emphasize how we strive to be beneficial to both the university and the community. It is our dream to continue the exponential growth of the organization and to graduate knowing we’ve made a difference for generations to come.', '279', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c4679eed-a890-4b2f-a4fb-f714641f7d26', 'Society of Physics Students', 'The Society of Physics Students (SPS) is a professional association open to all undergraduate students interested in physics. Weekly meetings consist of co-op talks, professor talks, and more physics-related hijinks!', 'The Society of Physics Students (SPS) is a professional association open to all undergraduate students interested in physics. Weekly meetings consist of co-op talks, professor talks, and more physics-related hijinks! + + + +In the past, we''ve hosted workshops ranging from LaTeX to the physics GRE, and bonded over pumpkin carvings and bowling nights. We also run a mentorship program that connects new and seasoned physics students within the Northeastern Physics community. + + + +Our members are not uniquely physics majors: all who are interested in physics are welcome! Some members have majored in fields such as chemistry, computer science, engineering, geology, and mathematics. + + + +Join us on Wednesdays @ 12 PM in 206 Egan! + + + +Sign up for our email list here !', '858', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a413055d-725d-4a1f-a799-f13d1b7615dd', 'Society of Women Engineers', 'SWE is an organization that serves to empower all women pursuing a degree in engineering with professional and academic support. SWE''s core values are integrity, inclusive environment, mutual support, professional excellence, and trust.', 'Meetings are weekly on Wednesdays from 8 to 9pm. ', '229', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ece0b104-b27e-4567-b436-ba81ead4ee9f', 'Sojourn Christian Collegiate Ministry NEU', 'Sojourn NEU is a Christian organization on-campus. Our welcoming community meets weekly to discuss life issues and its intersection with Christian faith. Questions are always encouraged! Our core values are community, justice & faith. Join us!', 'Sojourn NEU is a Christian organization on-campus. Our community meets as a small-group for college students to meet weekly to explore the Bible and Christian faith, as well as discuss current life issues. Questions are always welcomed and encouraged! Our leadership is also available for casual meetings throughout the week and spontaneous gatherings. Sojourn NEU operates as a faith-in-practice organization, encouraging and organizing activities in which students engage in our core values of community, justice, and faith. + + + +If you''re a student who''s struggling with big questions surrounding faith and life, you are not alone and you are invited to join us. We can''t promise to have all the answers, but we are committed to providing a welcoming space in which you are welcome to share your questions and sit alongside others who may have similar questions or doubts. + + + +Join us for the adventure; it''s going to be a great year!', '704', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f089c406-46ee-46a2-a224-b858b2d494df', 'Solar Decathlon', 'The Solar Decathlon is an annual competition held by the DoE which promotes innovative and efficient building design. Open to graduate & undergraduates, NUSD aims to give students hands-on experience working between majors on a large-scale project.', 'Since 2002, the U.S. Department of Energy has hosted an annual collegiate competition that promotes sustainability, efficiency, and innovation in building design. The Solar Decathlon consists of two challenges: the Design Challenge, where students work to develop construction documentation which clearly depicts their novel ideas, and the Build Challenge, which allows students to see their designs come to fruition as they construct their project locally. Challenge submissions are evaluated based on their performance in ten distinct contests which can vary from year to year. + + + +The Solar Decathlon competition is being introduced again to Northeastern University because of the breadth of the ten contests; since submission performance is dependent on a multitude of variables which can vary from architectural design and energy efficiency to financial viability and innovation, this club offers students the opportunity to gain experience working between disciplines to design an optimized project. + +Open to both undergraduate and graduate students, the final goal of this club is to participate in the Solar Decathlon Competition Event that is hosted annually in Golden, Colorado. A group of students will get the opportunity to present the final design to a panel of industry leaders. The competition provides students the chance to showcase a holistic design as well as network with professionals in the industry. + +', '875', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f9b68f87-356b-46bc-80b9-e61ebbe03358', 'Spark', 'Spark is a student-run contemporary art collective. Our mission is to connect people in Boston with creativity in all of its forms and encourage both artists and art appreciators to get involved! ', 'spark is a unique organization that is dedicated to sharing art with the greater community. We seek to expose students to the artistic world of Boston by hosting exhibitions featuring student-made artwork, museum tours, artist talks, and other events. Our club is composed of people who are passionate about art and are seeking real-world experience in marketing, budgeting, exhibition management, design, and other fields of art appreciation. We welcome students from all majors and skill levels! + +Spark is made up of an eboard containing roles that fall under: Exhibitions, Events, Finance, and Media. We typically assign roles based on quick applications and interviews that consider members'' preferences and skills. All are welcome at our meetings, and please reach out by email or socials with any questions. ', '684', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('779ab354-664d-4eeb-95a3-04e3d0f3a009', 'Spectrum Literary Arts Magazine', 'Spectrum Magazine is Northeastern University''s longest lasting literary arts magazine, amplifying the creative community since 1957. Our publications showcase the exceptional poetry, prose, photography, and artwork created by the Northeastern community.', 'Spectrum Magazine is Northeastern University''s longest lasting literary arts magazine, established in 1957. Publishing issues triannually and accepting submissions year-round. Our publications showcase the exceptional poetry, prose, photography, and artwork created by Northeastern students, staff, and alumni. As an organization, we help members develop their ability to effectively critique writing and design. Our primary goal is to amplify the creative voices of the community.', '45', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7917b9dc-f46c-42a1-af2c-9205b9d6f712', 'Splash at Northeastern', 'The main purpose of this group is to implement a program that brings high school students onto campus to take free classes devised and taught by Northeastern students. The event is held once a semester.', 'The main purpose of this group is to implement a program that brings high school students onto campus to take free classes devised and taught by Northeastern students. Northeastern students have the freedom to create and teach classes on whatever subject area or hobby they would like. Local high schoolers then have the opportunity to select which classes they''d like to take. This program is also an opportunity for mentorship and for high schoolers to learn about college life and the application process. + +A few of the responsibilities of this group include: organizing potential teachers, reviewing classes, running event day-of, and gathering feedback from high schoolers on the classes.', '529', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('50bb2af0-205c-45d9-b845-7a1f513438f7', 'Spoon University - Northeastern', 'Spoon University is the everyday food resource for our generation, on a mission to make food make sense. On our site, you can find the simplest recipes, the most obvious hacks you can’t believe you didn’t know, and the best restaurants around campus.', 'Spoon University is the everyday food resource for our generation, on a mission to make food make sense. On our site, you can find the simplest recipes, the most obvious hacks you can’t believe you didn’t know, and the best restaurants around campus that you haven’t found yet. For many of us, this is the first time we’re navigating our campuses or our kitchens on our own, and Spoon University is here to simplify and celebrate that. Behind the scenes, we’re helping teach the next generation of journalists, marketers and event planners the best practices in digital media. We empower a network of over 3,000 contributors at 100+ college campuses to write, photograph, create videos and throw events. Our program (called “Secret Sauce”) offers skills and training on how to be a leader, create incredible events and have your photos, videos and articles seen by millions. Our contributors get personalized analytics on what’s working and what’s not working, so they can learn and grow and launch into the real world ahead of the curve. + +If you want to get involved, we accept members at the beginning of each semester! While we do not check Engage often, you can get in touch with us through our e-board''s contact information listed on the site & through messaging our Instagram at @spoon_northeastern!', '4', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9a92a868-53c3-4d4c-a373-482ba666cd30', 'Sports Business & Innovation Network', 'Northeastern University''s premier organization lying at the intersection of sports, business, and technology.', 'Sports Business & Innovation Network strives to: + +- Educate the future leaders of our community + +- Connect with the industry professionals + +- Innovate towards the future of sports + +- Empower our peers to pursue opportunities + +Join our mailing list to learn about opportunities within the club! https://tr.ee/MzsoaurA0k', '692', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a54d633a-a48e-4a27-bd50-51fcb27b0bcb', 'STEMout', 'STEMout is a club for students who want to design or volunteer for outreach efforts in the Boston community. STEMout is a recognized Northeastern University student organization formed in 2016 with the help of the Center for STEM Education.', 'STEMout is a club for students who want to design or volunteer for outreach efforts in the Boston community. STEMout is a recognized Northeastern University student organization formed in 2016 with the help of the Center for STEM Education. STEMout’s mission is multifaceted: (1) to unite students who want to design or volunteer for outreach efforts in the Boston community with partner organizations; (2) to serve as a resource for student organizations and faculty members hoping to participate in or develop their own STEM outreach efforts and (3) to assist these individuals in obtaining funds for their STEM education efforts with the help of the Center for STEM Education.', '590', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('66c9f5db-5049-41bd-938c-76c398d00682', 'Stepping On Another Level', 'Stepping On Another Level (S.O.A.L.) is Northeastern University''s only performing arts step team. Step is a percussive form of dance with a long rich history rooted in African tradition. All are welcome and no experience is needed to tryout for the team!', 'Established in 2013, Stepping On Another Level (S.O.A.L.) is Northeastern University''s only performing arts step team. Step is a form of dance that has a long, rich history rooted in African dance tradition; the origins of step trace back to African tribal cultures, but more notably gumboot dancing. It is a percussive form of dance in which one’s body is used as an instrument to make sound. S.O.A.L. performs at various events both on and off campus, as well as participates in competitions throughout the northeast. We also give back to the community through teaching step workshops to K-12 students in Massachusetts. No experience required! Be sure to try out for the team at the beginning of Fall or Spring semester and keep up with us on Instagram and TikTok @soalstepteam !', '630', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6f95c8cc-4dd0-4c5a-ba5a-6e9be5edc631', 'Strong Women, Strong Girls', 'Strong Women Strong Girls at Northeastern University is a group of college women committed to supporting positive social change by working to create cycles of mutual empowerment for girls and women.Through mentoring relationships and after-school progr...', 'Strong Women Strong Girls at Northeastern University is a group of college mentors committed to supporting positive social change through our mentoring sessions with mentees in 3rd-5th grade in the Boston Public School System. Our mission is to empower the mentees to imagine a broader future through a curriculum grounded on strong role models delivered by college mentors. Together, we aim to foster a welcoming environment that promotes growth and a cycle of mutual empowerment. SWSG also strives to support the professional and personal growth of our college mentors. Our chapter is overflowing with leadership opportunities, amazing events, and great friendships.', '214', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('dbd36963-bece-4dfa-aa80-e39aa0959492', 'Student Activities Business Office (Campus Resource)', 'SABO is the financial institution for all student organizations. We are here to help with anything pertaining to a student organization''s finances. Office Hours: Monday to Friday 8:30am to 4:30pm.', 'The office is the financial institution for all student organizations. The staff is there to help with anything pertaining to a student organization''s finances. All student organizations are required to use the Student Activities Business Office for all money transactions. Office Hours: Monday to Friday 8:30am to 4:30pm.', '732', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('20be53d8-0d69-4311-9871-86c362315850', 'Student Affiliates of School Psychology', 'SASP is a graduate student organization open to all students enrolled in the school psychology program. SASP is affiliated with the national organization through Division 16 of the American Psychological Association. ', 'SASP is a graduate student organization open to all students enrolled in the school psychology program. SASP is affiliated with the national organization through Division 16 of the American Psychological Association. SASP is mainly focused on 1) building a student community, 2) advocating for strong training, 3) committing to social justice, 4) fostering collaboration with students and faculty.', '606', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6904b0a6-8b97-4982-a650-854f29b1d4bf', 'Student Affiliates of the American Chemical Society', 'The Northeastern University Student Affiliates of the American Chemical Society is open to all students who show an interest in chemistry and the related fields. Our Chapter meets weekly and frequently hosts speakers from various areas of chemistry. ', 'The Northeastern University Student Affiliates of the American Chemical Society is open to all students who show an interest in chemistry and the related fields. Our Chapter meets weekly and frequently hosts speakers from various areas of chemistry.', '1006', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6394b2cc-d9f1-4962-92d9-de4ec03019bf', 'Student Alliance for Prison Reform', 'SAPR at Northeastern serves as a platform for people to educate themselves and others about the injustices of the current incarceration system. We host speaker events, demonstrations, movie nights, and more. New members are always welcome to attend!', 'SAPR at Northeastern serves as a platform for people to educate themselves and others about the injustices of the current systems of incarceration. We work to educate each other on various prison related topics such as mass incarceration, school-to-prison pipelines, reproductive health in prisons, and other related topics. + + + +Our general body meetings are discussion and presentation based. Throughout the semester we work to provide engaging content and get others involved. We host a 7x9 Solitary Confinement demonstration every fall semester and Feminine Wellness Drive in the spring. Through weekly educational meetings, movie nights, speakers, and other special events, we work to keep college students informed about issues within the prison system. + + + +As a group, we are always welcome to suggestions and new ideas. We love to grow and look forward to expanding our presence on campus and the greater Boston community. Please reach out to us with any thoughts, comments, or suggestions at any time!', '788', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ac0c0f04-560f-4952-8c9f-aec9437f3cca', 'Student Bar Association', 'The SBA represents the interests of the entire NUSL student body through effective and dedicated student representation. ', 'The SBA endeavors to advocate on behalf of the students at NUSL to the administration, work with NUSL administration to respond to student concerns and grievances, foster a more unified community through student-centered programming, serve as a resource for student organizations, and work with NUSL administration to facilitate the equitable distribution of available resources to recognized student organizations in the Law School. ', '639', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c32a2f53-3ea0-4999-a40e-5ea4cd33f275', 'Student Conduct Board (Campus Resource)', 'The Student Conduct Board hears cases involving undergraduate, graduate, Law, and Professional students who have allegedly violated the Code of Student Conduct.', 'The Student Conduct Board hears cases involving undergraduate, graduate, Law, and Professional students who have allegedly violated the Code of Student Conduct. Hearings typically take place Monday through Thursday during the evenings and occasionally during business hours. A hearing administrator serves as a procedural advisor to the board while the student members hear the case, deliberate on alleged violations, and render sanctions, if applicable. Students who are interested in participating on the Student Conduct Board do not need prior experience. All majors, all levels (graduate, undergraduate, Law and Professional students), and both domestic and international students are welcome!', '631', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('44f64434-e4b9-498c-9d83-df00b8f9ca1a', 'Student Garden Club', 'Pending', '', '698', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f8b4b862-4838-4b1b-a56d-46b2ddfe6b6b', 'Student Government Association', 'The Student Government Association serves as the voice of the undergraduate student body and exists to enhance your Northeastern Experience.', 'The Student Government Association serves as the voice of the undergraduate student body and exists to enhance your Northeastern Experience. We strive to promote student interests within the University and its surrounding communities in order to enrich education, student life, and the overall Northeastern experience. The Student Government Association is comprised of the Student Senate, many committees covering the diverse student experience, the Finance Board, and the Student Involvement Board. + +Follow us on Instagram at @northeasternsga, @sgacampuslife, and @sgastudentlife', '355', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1bf9572d-5135-48fc-bf03-c63ade9a08c9', 'Student National Pharmaceutical Association', 'SNPhA is an educational service association of pharmacy students who are concerned about the profession of pharmacy, healthcare issues, and the poor minority representation in these areas. We aim to share knowledge and skills to serve the underserved.', 'SNPhA is an educational service association of pharmacy students who are concerned about the profession of pharmacy, healthcare issues, and the poor minority representation in these areas. The purpose of SNPhA is to plan, organize, coordinate, and execute programs geared toward the improvement of the health, educational, and social environment of minority communities, thereby serving the underserved. + +The best way to stay updated is to check out our Instagram @nuspha.', '414', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f36f7749-6407-4c01-9c20-139da076e3ef', 'Student Nurse Anesthetist Association', 'The mission of the Student Nurse Anesthetist Association (SNAA) is to promote wellness and provide support, networking opportunities, and resources to all cohorts of Student Registered Nurse Anesthetists (SRNAs) at Northeastern. This organization aims ...', 'The mission of the Student Nurse Anesthetist Association (SNAA) is to promote wellness and provide support, networking opportunities, and resources to all cohorts of Student Registered Nurse Anesthetists (SRNAs) at Northeastern. This organization aims to utilize student activities to promote communication through the various cohorts.', '721', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('de2198c0-6c17-4cbf-90b1-7db066ad7a50', 'Student Organ Donation Advocates at Northeastern', 'Soda Northeastern aims to help save lives by educating others on the critical need for organ and tissue donation and increasing donor registration within the Northeastern community. ', 'Soda Northeastern aims to help save lives by educating others on the critical need for organ and tissue donation and increasing donor registration within the Northeastern community. ', '834', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('14608934-47da-4ae0-a8cd-f7f06b17bb06', 'Student Value Fund', 'The Student Value Fund is Northeastern University’s premier investments-focused organization. We strive to embody Northeastern’s values of experiential learning through the application of theory into practice. ', 'The Student Value Fund is Northeastern University’s premier investments-focused organization. We strive to embody Northeastern’s values of experiential learning through the application of theory into practice. + +As a value-oriented fund, SVF strives to identify long-only investment opportunities that we perceive to be undervalued relative to our analysis of intrinsic value, with the objective of investing in equities that allow the fund to generate higher absolute returns than the S&P 500 (SPY). Additionally, as a student-run organization managing a portion of the university’s endowment, the fund aims to embody Northeastern’s values of experiential learning by helping students apply value investing theory to real-world investing.', '310', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3af16bab-c64c-42db-bc15-3df7cdb01d48', 'Student Veterans Organization', 'Our mission is to develop and foster a community for veterans, dependents, military, and supporters to ensure their academic, personal, and professional success. Check out our webpage and social media for more of the latest news: northeastern.edu/svo', 'Our mission is to serve as advocates for the student veterans and service member students that attend Northeastern University by providing essential information and guidance that aid in student success, personal growth, and enduring bonds that will last a lifetime. + +Check out our website at northeastern.edu/SVO and like us on Facebook @ https://www.facebook.com/NUStudentVets/ for the latest news, events, and initiatives!', '703', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6c849c81-c198-4412-97fd-1347a00507eb', 'Students Demand Action at NEU ', 'Students Demand Action at NEU works to combat gun violence by advocating for common-sense gun laws, endorsing gun-sense candidates, registering voters, educating the community on gun violence-related issues, and uplifting survivor voices. ', 'Students Demand Action (SDA) at NEU is one of SDA''s 700+ chapters across the country working to end gun violence by advocating for common sense gun laws on local, state, and federal levels, endorsing gun sense political candidates, registering voters, educating the community on gun violence related issues, and uplifting survivor voices. SDA is part of the Everytown for Gun Safety and Mom Demand Action network, which has over 10 million supporters across the country. ', '276', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2ee5504a-05db-41bf-837f-38fee6f5fc32', 'Students for Justice in Palestine', 'Northeastern University Students for Justice in Palestine will work to raise awareness about the plight of Palestinians in the West Bank and Gaza. We are dedicated to the struggle for Palestinian self-determination, an end to the illegal Israeli occup...', 'Northeastern University Students for Justice in Palestine will work to raise awareness about the plight of Palestinians in the West Bank and Gaza. We are dedicated to the struggle for Palestinian self-determination, an end to the illegal Israeli occupation of the West Bank, East Jerusalem, and Gaza, and for the right of the Palestinian refugees to return to their homeland. Our mission as students is to promote the cause of justice and speak out against oppression and occupation. We will raise awareness about this issue and provide students with alternative resources of information than the mainstream media. We will also work to provide a comfortable environment where students and faculty can discuss and debate their diverse views on the various aspects of Palestinian politics and society. We do not support violence in the region and will highlight the Palestinian''s non-violent efforts for peace. We envision that one day Palestinians will be free from occupation and will be able to determine their own fate as an independent nation living peacefully with its neighbors. We oppose all forms of racism, discrimination, and oppression', '473', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('677d47cb-c9dd-4f84-90b9-9f562cdd6e49', 'Students for the Exploration and Development of Space of Northeastern University', 'Our mission is to develop the network, skills, and opportunities of a diverse team of students interested in space, science, and astronomy by supporting competition based projects and providing casual events for those with busier schedules.', 'At SEDS our mission is to give our members the opportunity to compete in prestigious academic competitions, become published, and learn more about space. Our teams get hands-on experience in our club workshop with 3D printers, hand tools, and electrical equipment. We host stargazing events and discussions where our members talk about their co-ops from aerospace companies and teach others about technical news and aerospace topics. At SEDS it is a priority to promote diversity in space-related fields and make space approachable for everyone. Our club goals as listed in our constitution are listed here: + +Section 1: To enable students to participate in research competitions that will make meaningful contributions to the fields of space exploration, science, and policy for the purpose of growing Northeastern''s SEDS. + +Section 2: To create an organization that encourages the participation of students from all identities, backgrounds, and majors within the Northeastern community. + +Section 3: To develop a community of students researchers to facilitate the exchange of expertise and ideas, and provide support to student research teams. + +Section 4: To create a platform in which undergraduates can participate in space-related fields by creating networking opportunities with relevant organizations. + +Videos: + +Summer Involvement Fair Info Presentation: + +https://youtu.be/dWZhef9J_7U', '735', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f9027a96-bb13-464e-9d06-1fe6cfbe330f', 'Students to Seniors', 'Students to Seniors believes that social interaction between students and the elderly is valuable to both generations, as members can learn from the experience of their elders while the aging population benefits from an opportunity to engage and connec...', 'Students to Seniors believes that social interaction between students and the elderly is valuable to both generations, as members can learn from the experience of their elders while the aging population benefits from an opportunity to engage and connect with others. Originally founded by a neuroscience-focused student, the idea of Students to Seniors was based upon a growing body of research suggesting that a lack of total environmental enrichment can lead to neurodegeneration. Despite the sustained efforts of leading researchers around the world, no current cure or treatment exists for Alzheimer’s Disease or any other forms of dementia. Thus, our best bet to decrease the burden of neurodegeneration and its other effects on mental health in our senior population is by capitalizing on preventative mechanisms, such as environmental enrichment. Students to Seniors will accomplish these goals by bringing mentally stimulating activities and social interaction to various populations of the elderly at least once a month. In order to ensure that the organization, above all, does no harm, there will be a mandatory training session for all volunteers before their first volunteer outing. The training sessions will occur in place of a general body meeting, and will include a presentation and discussion on geriatric health. Students to Seniors will furthermore keep in mind the pervasive presence of health inequities, and it will be an interrelated focus of Students to Seniors to ensure that served and underserved populations are addressed equally and with great care. Lastly, this organization will include a learning component by hosting a speaker once a semester related to neurodegenerative disease.', '730', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('14d0411c-9378-48ef-a00d-54066fbc91d2', 'Studio Art Club', 'Interested in art? Come join NU Studio Art Club! Our main goal is to provide a fun space for students to learn about and experiment with art, and to make some new friends along the way. Self-proclaimed "non-artists" are especially welcome!', 'Interested in art? This club is for you! Whether or not you have previous art experience or skill we hope create a fun space for students are to try new things and improve their existing skills. Since art can be both relaxing and a stress reliever, we wish to bring both a little fun and a little calm to the hectic daily life of a student. Come here to relax, explore the different mediums, get to know people, and create something cool. We will have a wide-range of activities involving many different mediums such as painting, drawing, embroidery, sculpting and many more. Everyone is welcome, no art skill needed!', '1015', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('74b62790-2afa-4a94-91cc-9c83a69788ba', 'Sunrise Northeastern', 'Sunrise NEU is Northeastern''s hub of the Sunrise Movement, a national youth-led climate justice organization. We work towards climate justice within our institution and beyond through research, education, and organizing with other clubs and communities.', 'Sunrise NEU is Northeastern''s hub of the Sunrise Movement, a national youth-led climate justice organization. We work towards climate justice within our institution and surrounding communities through multiple facets, including research (primarily focused on developing a Green New Deal for Northeastern) education (providing a welcoming space for new members to learn about climate justice and get involved), and organizing with other social-justice clubs and communities (such as collaborating with the Social Justice Resource Center, being part of Huskies Organizing With Labor (HOWL), Supporting YDSA, PSA, and supporting Northeastern Divestment, a campaign fighting for fossil fuel divestment at the university.) We are striving to make Northeastern a more just place that prioritizes its environment and communities.', '946', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('39a691e4-7e51-4374-829f-68eebfa68eb1', 'Super Smash Bros Club', 'Fosters a friendly community for competition in games in the Super Smash Bros Franchise', 'Hello! + +We are the smash bros club, we hold Smash Ultimate tournaments every Friday, and Smash Melee tournaments every Monday. Join the discord servers below for communications. + +Ultimate + +Melee', '392', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b1e9d303-753f-4f06-a22b-7a4a9f7f3dd4', 'Surf Club', 'Surf Club is a fun way to meet new friends, explore the beaches of New England, and advocate for nature preservation, all while catching waves!', 'One thing that many surfers can agree on is that surfing is highly addicting, stress relieving, and physically rewarding to participate in. Unfortunately, many people do not have the money to buy surf gear, or they have never tried it because they didn''t have someone to go with. Our plan is to make new surfers'' experience as easy as possible to increase the total population of surfers here on the Northeastern Campus as a whole. As a surf club member, you will have the opportunity to join other students on trips to beaches all around New England. If you have never surfed before, we will gladly teach you, and if you are a seasoned veteran you will have the opportunity to surf with new and different people. As frequent beach-goers, members of the Surf Club will dedicate a portion of their time to help preserve the New England coastline, whether it be trash pickups, fundraisers, or raising awareness to Northeastern Students. Along with all of the surfing that we will be doing, Surf Club also engages in other fun activities, such as pizza parties and surf movie nights! + + + +Join our Slack channel to get involved: + +https://join.slack.com/t/nusurf/shared_invite/zt-10r3a4f9g-XfenbaKDGIqRvllHoX06qQ', '322', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('97423ea7-a1d9-4fe0-aa5d-b996ffce0b94', 'Survivor: Northeastern', 'Survivor: Northeastern brings together students of all ages, majors, and backgrounds to compete in a semester-long competition, in replica of CBS’s reality series, Survivor. Members may join as a player or as member of the production team.', 'Modeled after the reality television series, Survivor, our organization strives to create similar experiences lived out by contestants on the show without the survival aspects of living on a remote island. Survivor: Northeastern puts together one season per semester, consisting of 16-24 students, who compete for the title of Sole Survivor. They participate in challenges, both mental and physical, experience tribal councils, and test their abilities in social psychology, all while making life-long friends. + +https://www.youtube.com/watch?v=KfbyEAurZvA + +Our seasons are filmed by a camera crew and uploaded to YouTube after several hours of editing and story-boarding. We look to recruit students who have a competitive nature and demonstrate enthusiasm. Students of all ages, majors, and backgrounds are encouraged to apply and submit a video describing their interest in the show. Those who are not cast are encouraged to participate in our club via production or outside events, like viewing events for the CBS Survivor, outings with the organization, and attending challenges or tribal councils. + +The game starts in tribes, where students compete for tribal immunity. The losing tribe must vote out a member of their tribe. When the game has reached about the halfway point, the tribes merge. The contestants then compete for individual immunity and continue to vote each other out. The voted out contestants after the merge become members of the jury, and ultimately vote on the season’s winner when there are two or three contestants left. Not only do we live out the game, but we foster friendships and a communal space centered around a common love for the show. + +Please visit our social media outlets, YouTube page, and website below to learn more about the club!', '259', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0ee7b98c-3fd7-41cb-90e9-fc152fa85f0e', 'Sustainable Transportation @ Northeastern ', 'Sustainable Transportation @ Northeastern serves to give students a chance to explore how transportation shapes their lives, engage with local government and engineering firms, and encourage and advocate for sustainable transportation.', 'Welcome to Sustainable Transportation @ Northeastern, a sort of supergroup consisting of our university’s chapters of the Institute of Transportation Engineers (ITE), Women in Transportation Seminar (WTS), and our newly minted Bike Enthusiasts @ Northeastern. (BEAN) This group focuses on a variety of transportation issues across the globe. We host speakers from a variety of transportation related industries, run bike tours, advocate for bike infrastructure on campus, and help students network with professionals in the industry. The goal of this club is to help students learn more about sustainable transportation both on campus and around Boston while advocating for change in the community. + +Join our email list: http://eepurl.com/hqvuj5 + +Our full calendar is here: https://calendar.google.com/calendar/u/0?cid=bmV1Lml0ZUBnbWFpbC5jb20', '103', 'TRUE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0bc25f73-28b0-406a-b552-0f8347fab526', 'Suzanne B. Greenberg Physician Assistant Student Society of Northeastern University', 'This society was created to guide PA students in the pursuit of integrity, professionalism, and excellence as future certified Physician Assistants and healthcare practitioners.', 'This society was created to guide PA students in the pursuit of integrity, professionalism, and excellence as future certified Physician Assistants and healthcare practitioners.', '245', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('38556509-32f0-43bd-8fb2-dac20e63f352', 'Systematic Alpha', 'Systematic Alpha is a interdisciplinary quantitative finance club that combines elements of Data Science, Finance, and Math', 'Welcome to Systematic Alpha, a vibrant interdisciplinary quantitative finance club that brings together enthusiasts from the worlds of Data Science, Finance, and Math. At Systematic Alpha, we explore the fascinating intersection of these fields to develop cutting-edge strategies and tools for understanding and navigating the complexities of financial markets. Whether you''re a seasoned professional or just starting out, our club offers a welcoming space to learn, collaborate, and grow together, building a community where curiosity and innovation thrive.', '963', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('c323cd8e-262b-44f2-9d78-2f8d73e495bc', 'Taiwanese American Student Association', 'Taiwanese American Student Association provides students who wish to stay connected with their Taiwanese and American roots with a welcoming platform and an inclusive environment for those interested in learning more about both cultures.', 'The Taiwanese American Student Association is a vibrant community that warmly embraces students seeking to explore and celebrate their Taiwanese and American heritage. We offer a welcoming platform where individuals can connect, learn, and grow together in a culturally diverse environment. Whether you''re looking to share your experiences, engage in cultural activities, or simply curious about Taiwanese American culture, our club provides an inclusive space for all to come together and foster meaningful connections.', '279', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ef665c32-d232-4d72-9ac5-9d0f3c1fff15', 'TAMID Group at Northeastern University', 'TAMID is a national organization that prepares students to work with startups and exposes them to disciplines such as entrepreneurship, consulting, finance, and software development through the lens of the Israeli startup ecosystem.', 'TAMID is a national organization that prepares students to work with startups and exposes them to disciplines such as entrepreneurship, consulting, and finance through the lens of the Israeli startup ecosystem. This is done through our pro bono consulting program where we consult for top startups coming out of Tel-Aviv and a national stock pitch competition to decide which companies to add to our stock portfolio. We also provide an exclusive summer internship program in Israel. + +Fill out our interest form here to receive updates on the Spring 2024 recruitment process!', '103', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d65ed509-2e34-43a2-9e4a-8e45cafed47a', 'Tastemakers Magazine', 'Are you interested in music? Do you love going to shows, keeping up with the local scene, and discussing the latest releases with your friends? Do you have an interest in writing, photography, promotions, or design? ', 'Are you interested in music? Do you love going to shows, keeping up with the local scene, and discussing the latest releases with your friends? Do you have an interest in writing, photography, promotions, or design? If you answered yes to any or all of these questions: look no further. + + + +Here at Tastemakers Magazine, we publish 4 print magazines and year-round content, throw 2 concerts, and host meetings and events to discuss our love of music and beyond. We create professional experiences for our members to build their portfolios and resumes, while they make lifelong memories and friends (concert buddies!). + + + +We are committed to fostering a community where everyone is encouraged to enjoy Smash Mouth (or any artist) unapologetically. We welcome people interested in music of all genres and from all walks of life. + +If you want to learn more, sign up to hear from us and check out the discussion section below. ', '159', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0322b744-d156-4c68-b7c7-0d989cf044b4', 'TEDxNortheasternU', 'TEDxNortheasternU is an independently organized TEDx event that showcases ideas worth spreading from the Northeastern University community. Speakers share their experiences, insights, and unique perspectives on a variety of topics in TED-style talks.', 'TEDxNortheasternU is a student-run organization that brings together the Northeastern community to share and discuss innovative ideas, breakthrough technologies, and groundbreaking research. Our events feature local speakers who are leaders in their fields, sharing their knowledge and experience in a series of engaging and thought-provoking talks. Through our events, we aim to inspire and educate our audience, while fostering a sense of community and collaboration among attendees. Join us at our next event to be a part of the conversation and discover new ways of thinking about the world around us.', '791', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a7468ec9-9f42-4056-b865-83478c407e10', 'Thai Society of Northeastern University', ' Thai Society aims to promote Thai culture to the Northeastern Community. We also aspire to bring together to community of Thai and Thai Americans on the campus.', 'Thai club at Northeastern aims to increase the students'' morale across the Boston campus. ', '417', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('80f3057e-c34f-44eb-b552-94b465fc668c', 'The American Red Cross of Northeastern University', 'The American Red Cross, a humanitarian organization, led by volunteers, and guided by its Congressional Charter and the fundamental principles of the International Red Cross movement will provide relief to victims of disaster and help people prevent...', 'The American Red Cross, a humanitarian organization, led by volunteers, and guided by its Congressional Charter and the fundamental principles of the International Red Cross movement will provide relief to victims of disaster and help people prevent, prepare for, and respond to emergencies. + + + +The Red Cross Club at Northeastern works to uphold the principles of the American Red Cross and the Global Red Cross Network. We pursue this through fundraising for disaster relief and specific initiatives, volunteering in the Boston community, organizing blood drives, providing opportunities for CPR and first-aid trainings, and more. Join us if you want to contribute to this movement and help promote public health! + + + +Join our weekly mailing list and check out our social media to stay up to date! + + + +Visit our website to find out more information about Northeastern''s Chapter of the American Red Cross.', '977', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('10f73175-d7a7-4d61-802c-a0cf118e11f9', 'The Avenue Magazine', 'The Avenue Magazine is Northeastern''s first and only fashion, lifestyle, and culture magazine. We strive to create a space where creative voices can be uplifted and heard. We pride ourselves in our team diversity, creative risk taking, and our magazine.', 'The Avenue Magazine is Northeastern University''s first and only fashion and culture magazine. Through our work, we strive to create a publication inclusive to all people and ideas, which offers Northeastern writers and creatives a platform to share their views and express their creativity. Every aspect of our publication is student created: from photography, to design, writing, production, illustration and post-production marketing. + + + +Follow us on Instagram to stay updated: @theavenuemag. General meetings are Thursdays at 7:00 P.M. EST', '951', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5b83a09b-9f49-46b6-b4d1-0ee7bfd73519', 'The Business and Innovative Technologies Club', 'The B.I.T. Club strives to expose its members to the historical, present, and future potential impacts that innovative information systems and technologies have on business, and associated industries.', 'The B.I.T. Club strives to expose its members to the historical, present, and future potential impacts that innovative information systems and technologies have on business, and associated industries. The club will explore the ongoing MIS-based innovations and technologies that drive companies to grow and become more profitable. By promoting the exploration, discussion and understanding of these technologies and demonstrating the positive effects they can have on organizations, the B.I.T. club seeks to inspire its members to drive innovation and positive change in their academic and professional careers', '450', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6b11ea3c-193c-44ce-b027-c544ab2d332e', 'The Data Science Hub at Northeastern', 'The Data Science Hub is a community for graduate students to share knowledge, do data science, and network together.', 'The Data Science Hub is a community for graduate students to share knowledge, do data science, and network together. The hub upholds three tenets: a source for academic content where we share data science skills and knowledge; a venue where we collaborate on data science projects, with emphasis on those that will benefit the Northeastern community; and a place where we can network with our peers in the university and outside, including the industry. + +CLUB LEADERSHIPS: + +PresidentParas Varshney + + + +TreasurerAby Binu + +Scheduling CoordinatorSoham Shinde + +Advisor NameCailyn Kelley + +Organization Emailnudatasciencehub@gmail.com + +', '316', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a6859bce-7332-41ed-bdcd-53dadc477105', 'The Downbeats', 'Founded in 2000, we are a competitive, co-ed a cappella group from Northeastern University, devoted to spreading our melodic and in-house-only musical arrangements to all. We’re dedicated to making music not only as friends but as a family too.', 'Founded in 2000, we are a competitive, co-ed a cappella group from Northeastern University, devoted to spreading our melodic and in-house-only musical arrangements to all. Through the tight-knit bonds we form with each other in and out of rehearsal, we’re dedicated to making music not only as friends but as a family too. Our main goal is to push our boundaries and define our unique sound. + + + +Throughout our time as a group, we’ve recorded lots of music. Our first recordings were our two full length albums - “Ignite” and “Venus," - which can be found on all major streaming platforms. In 2022, we released a single, "Your Guardian Angel" from our 2019 ICCA set. In 2023, we released an EP titled "Reflections" which included three songs - "Calvin''s Joint" "Shrike" and "Vertigo"- the last which was featured on Best of College A Cappella 2024. In 2023, we also released two singles - "Over the Ocean Call" and "It Gets Dark." You can find these anywhere you stream your music. + + + +We have also competed and performed all over the state of Massachusetts and New England. In the 2019 ICCAs, we had the pleasure of winning 1st Place in our Quarterfinals, and being awarded the titles of “Outstanding Soloist” and “Outstanding Arrangement.” + + + +Each Downbeat brings their own individual skills and talents to the group, coming together to form one diverse group that learns and grows from one another. We welcome music lovers and makers of all kinds to join our family, whether you are a trained singer or a timid belter. The Downbeats combine new talent with the knowledge gained from past members to create the blend of sound that is so characteristic of our group. + + + +Check out our website for more info about us!', '776', 'TRUE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f8daab1c-4abf-4f66-a009-1011dae27009', 'The END Initiative at Northeastern University', 'The End Neglected Diseases Initiative fights to end neglected tropical diseases through fundraising, raising awareness, and advocating on campus. Our initiative supports Deworm the World, a campaign run by the non-profit organization Evidence Action', 'The END (End Neglected Diseases) Initiative is a campaign fighting to end neglected tropical diseases (NTDs). Our initiative supports Deworm the World, a campaign run by the non-profit organization Evidence Action. These diseases affect 1 in 7 people worldwide and have been cited as the #1 cause of inescapable poverty in the world. Our student organization aims to increase awareness on Northeastern''s campus, raise donations, and encourage world leaders to make the elimination of these diseases an important part of their policy agendas. The END Initiative of Northeastern University also works closely with Northeastern''s Integrated Initiative for Global Health.', '905', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('44163133-59bd-41aa-893f-bb792b1f2b0e', 'The Fashion Society', 'We work to educate and promote fashion across all aspects - art, culture, entertainment, and business. Our mission is to be the link between Northeastern''s campus and the Boston fashion industry through proactive event planning, networking, and media r...', '*Follow our Instagram: @northeasternfashion to get the latest updates on meetings!* + +We work to educate and promote fashion across all aspects - art, culture, entertainment, and business. Our mission is to be the link between Northeastern''s campus and the Boston fashion industry through proactive event planning, networking, and media relations. We look forward to a productive semester and look forward to working with all of you.', '393', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('fbe40b84-17e2-450f-9f81-af65bd8ff40a', 'The Francophone Club of Northeastern University', 'The Francophone Club welcomes anyone interested in the French language and/or culture. By no means, do you have to be French or be fluent in French. By joining, you will have many opportunities to converse in French with other members of the club.', 'The Francophone Club welcomes anyone interested in the French language and/or Francophone cultures. By no means do you have to be French or be fluent in the language. By joining, you will have many opportunities to converse in French with other members of the club and learn more about Francophone cultures through various events such as: movie night, our intercollegiate mixer, guest speakers, social nights, and more. Follow our Instagram (@nu.francophone) and join our mailing list (nufrancophone@gmail.com) to stay up to date with all our upcoming events. À bientôt!', '806', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3b5c3a36-c7ad-4b4b-a86d-dc29338360a1', 'The Interdisciplinary Women''s Council', 'The Interdisciplinary Women''s Collaborative is the university''s first trilateral student organization dedicated to promoting and sustaining gender equality at Northeastern.', 'The Northeastern University Interdisciplinary Women’s Collaborative, or the IWC for short, is the first body on the Northeastern campus that seeks to bring together women and women’s organizations on campus to facilitate the communication and promotion of women’s empowerment initiatives and events on campus. The organization, at its core, is a means for individuals and clubs on campus to be exposed to the resources, the knowledge, the events, and the practices that have helped propel some of the campus’s largest women’s organizations to the success we see from them today. Too often, the biggest barrier to female empowerment is the lack of communication between women and this council wants to change that. We believe that every organization on campus that has shown their commitment to gender equality should have the ability to know how to succeed as a club at Northeastern and the best way to do that is to learn from clubs that have already done it. The council will be the primary body from which the university hosts campus-wide, interdisciplinary women’s events such as an annual International Women’s Day Celebration. + +The organization itself is split into three pillars: the interdisciplinary women''s organization collective (IWOC), which works to connect the existing women''s organization at Northeastern with the goal of promoting collaboration, the Women''s Research Engagement Network (WREN), the nation''s first research network made to facilitate female mentorship in all fields of research, and the Northeastern Women''s Council, which is a student-led council of over 300+ women working on women''s rights advocacy and empowerment.', '177', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7da7aec0-2ed8-4868-9abd-61a325deba3d', 'The Interrobang Poets', 'The Interrobang Poets forms the basis of the slam poetry community on Northeastern’s campus, and we offer various events for anyone either new to or familiar with slam and spoken-word poetry, including workshops, open mics, poetry readings, and more!', 'Our organization serves to support the slam poetry community on Northeastern’s campus and their efforts to develop an on-campus poetry community that engages with the slam poetry communities of other universities. We also support and are involved in the youth/adult slam poetry communities in the Greater Boston area. We see poetry as a vessel for community building and, as such, long to create an environment where people feel safe enough to share their stories; thus we are actively against any and all forms of oppression. People will be confronted if their material actively causes harm to someone, there is a zero tolerance policy when it comes to oppressive poems and will not tolerate hate-speech or the cooptation of stories in order to create a safe(r) environment for all.', '148', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('11a8a973-4748-4145-b55d-fa026f229baf', 'The National Society of Black Women in Medicine', 'NSBWM is a multi-disciplined national organization that promotes the recruitment and retention of Black + +women pursuing broad careers in medicine, while promoting the advancement of those already established in these fields through unity and mentorship.', 'The National Society of Black Women in Medicine (NSBWM) is a vibrant and inclusive national organization dedicated to supporting and uplifting Black women in the medical field. Our mission is to foster a community that champions the recruitment and retention of Black women pursuing diverse careers in medicine, while also empowering and advancing those who are already established in these fields through the values of unity and mentorship. Join us in celebrating diversity, promoting excellence, and creating opportunities for growth and success in the medical profession!', '975', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('0475dc1a-b655-4bd4-8a2f-2d5f32c1f1c8', 'The Northeastern Debate Society', 'The Northeastern Debate Society is a intercollegiate competitive debate team. We hold two practices a week on Mondays and Wednesdays at 8:00 in Hastings 204, and compete at tournaments across the country every weekend.', 'The Northeastern Debate Society is an intercollegiate competitive debate team. We practice American Parliamentary (APDA) and British Parliamentary (BP) debate. Joining NUDS is a great way to develop your public speaking and critical thinking skills, learn about a wide variety of topics, and have fun doing it! No experience necessary! + +We host two optional meetings weekly, on Monday and Wednesday at 8pm. You can sign up for our mailing list to receive more information here. + + ', '288', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('12d31094-7048-48a1-ac43-dcfe227e9063', 'The Ortelian Society', 'The Ortelian Society is Northeastern’s premier undergraduate society dedicated to Classical and heterodox thought.', '"Alles, was tief ist, liebt die Maske.” - Friedrich Nietzsche, Beyond Good and Evil + + + +The Ortelian Society is Northeastern’s premier undergraduate society dedicated to Classical and heterodox thought. + + + + + + + + + + + +The OS devotes itself to the investigation of the heterodox ideas underexplored or altogether ignored by the wider liberal arts programs (including both the sciences and humanities; Darwin and climate change deserve as much opposition as the progressive orthodoxy underlying the humanities). Our aim is to cultivate genuinely independent thinkers who will grow into virtuous leaders. + + + + + + + +', '108', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('262d8b3a-4472-45e0-bffb-e8e29ad5801c', 'The Red & Black', 'The Red & Black is a sports magazine published once a semester that offers an inside look at Northeastern Athletics through feature writing and podcasting, long-form reporting, photography, design, and social media. ', 'Watch our General Interest Meeting here: https://www.youtube.com/watch?v=9ceCwyYggVw + + + +The Red & Black is Northeastern University’s only student-run athletics magazine. Released semesterly, the writing, photography, design and social media are all handled exclusively by Northeastern students. Check out our current staff here! + +The Red & Black is particularly focused on student-athlete involvement. Modeled around The Players’ Tribune and Sports Illustrated, there are numerous First Person Stories from the student-athletes of Northeastern detailing their experiences. In addition, several student-athletes hold leadership positions within the magazine, ensuring a commitment to high quality coverage of all athletic programs on campus. With an ever-growing partnership with Northeastern Athletics – which includes presenting the annual Red & Black Dedication Award at the athletic department’s year-end banquet – The Red & Black represents a key part of the athletics culture at Northeastern University. + +To learn more, visit our website at www.nuredandblack.com, or watch our appearance on the NESN TV Show, "Tales of the Howlin'' Huskies," here: https://www.youtube.com/watch?v=_EYTh2leTn8 ', '179', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d7a40f48-d5d8-4434-8742-b0c0e8ad3874', 'The Student Osteopathic Medical Association', 'The purpose of the Student Osteopathic Medical Association, the student affiliate organization of the American Osteopathic Association, is to promote osteopathic ideals and unity within the profession and to educate future physicians.', 'The purpose of the Student Osteopathic Medical Association, the student affiliate organization of the American Osteopathic Association, is to promote osteopathic ideals, to educate pre-medical students on their options to becoming a physician, and to establish and to maintain lines of communication among healthcare professionals in an ongoing effort to improve the quality of healthcare.', '977', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('9b08ec71-d139-46b6-84d8-9fc28f95e27a', 'The Sustainable Innovation Network', 'Empowering students to spark change through for-profit, for-impact startups that make less "SIN" in the world. ', 'Our mission is to foster collaboration across disciplines for undergraduates passionate about social innovation. Through our framework of "entrepreneurship is for everyone", we aim to recognize social injustices, find helpful solutions, and build with the intention of having lasting, but profitable, impact. ', '346', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('3d770795-5778-4737-bf84-0d6e93b37c98', 'The Undergraduate Research Club', 'The URC is committed to engaging undergraduate students in innovative, experientially-driven, world changing research by instilling knowledge, advancing skills, and providing opportunities that inspire the next generation of leaders.', 'The Undergraduate Research Club (URC) is a vibrant community dedicated to involving undergraduate students in groundbreaking research initiatives that make a global impact. Our mission is to empower students by cultivating their understanding, honing their abilities, and presenting avenues for growth that ignite the trailblazers of tomorrow. At URC, we encourage curiosity, foster collaboration, and provide a supportive environment where students can explore their passions, develop critical skills, and contribute meaningfully to the realm of research. Join us in the pursuit of knowledge, innovation, and change-making endeavors that shape the future.', '921', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('615d2adf-d941-46cd-9dbb-f0974c58afc6', 'Theme Park Engineering Club', 'The Theme Park Engineering Club works to give students an opportunity to explore the field of engineering through theme parks and to bring entertainment to the Northeastern campus.', 'Northeastern''s Theme Park Engineering Club is an organization for those interested in designing theme park attractions, combining their appreciation for both arts and sciences, or simply just love riding roller coasters! Here we''ll be looking into and learning about the science and illusions used to create many of the world''s most popular theme park rides, as well as working on many projects of our own including in-meeting and national level competitions!', '901', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('2bfb95c9-0a6f-46f1-939d-ca44130dd21f', 'Times New Roman', 'You think you''re funny, huh? You want to perform stand up comedy? You want to write silly tweets? You want a group of people there to listen to your standup and silly tweets? Well then TNR is the club for you!', 'Times New Roman is Northeastern''s standup comedy club, providing laughs through shows in AfterHours and Open-mics in campus classrooms. Our standup shows feature performers ranging from standup veterans to novices, with all able to learn and improve in a friendly, funny environment! Additionally, we post topical content on our blog, Twitter, and Instagram, and make a fun podcast too. Join our weekly meetings or come by a show to get started! + +Check out our website to see all of our content as well as the efforts of wix to get you to spend money: nutnr.com ', '93', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d7064dae-6ad0-4bfe-a9d1-de94e2616f94', 'Transfer Student Organization', 'Come meet other transfer students and learn about Boston and Northeastern!', 'The purpose of NUTS is to create a welcoming and supportive community for transfer students by holding events where they can socialize, get involved in the Northeastern community, and learn more about Boston and the university.', '347', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a9ea79fc-19ef-4c10-aacf-01331cb49a60', 'Trash2Treasure', 'Trash2Treasure''s mission is to make Northeastern University a zero-waste campus. Every semester, we collect items students no longer want or need and resell them at a low cost to students the next semester, promoting a circular economy on campus.', 'Trash2Treasure has one primary mission: to help Northeastern University become a zero-waste campus. This can be achieved by a number of programs set forth by T2T -- most notably, the annual T2T Sale. Every year during Spring move-out, T2T collects items from students that they would otherwise throw away (anywhere from electronics to rugs to kitchen utensils). Then, at the beginning of the Fall semester, all of the items are sold in a yard-sale fashion at incredibly low prices. In 2023 we saved 11,428 pounds from the landfill. In addition, we partnered with 5+ community organizations to recycyle unusual items. We are actively trying to expand our programming and look forward to more great work towards achieving zero waste.', '804', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('f4a21b9c-374c-4712-8f73-0a9b3a3cedd0', 'Treble on Huntington A Cappella Group', 'Treble on Huntington is Northeastern University''s first women''s a cappella group.', 'Founded in 2007, Treble on Huntington is Northeastern University''s first women''s a cappella group. Treble travels around the Boston area and the U.S. for competitions and concerts, showcasing their pop and mixed-genre repertoire and the hard work and unique artistry they''ve cultivated over 10+ years. + + + +Be sure to check out their EP Aura, along with all of their other released music, on all streaming platforms now. + + + +Treble on Huntington is holding Fall 2024 auditions in September! Be sure to follow us on all of our social media to stay in the loop. But, if you: + + - Want to learn more about the audition process, click here. + + - Want to ask us a question, click here. + + - Want to be added to an email list to get updates on auditions as they approach, click here. + + + +We are so excited to hear your beautiful voices! :)', '896', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5e594405-8b69-41ab-9612-651dc6b7e3b7', 'Trivia Club', 'Join us weekly for fun trivia nights, game show nights, and more!', 'Trivia Club''s purpose is to facilitate the study of trivia facts and compete in fun trivia games. We enjoy enriching our minds and lives with trivia facts in order to broaden our breadth of knowledge and in order to meet like-minded nerds. + +We hope to compete not only amongst ourselves and develop ranks of achievement, but to participate in external trivia bowl / quiz events in the Greater Boston area and the New England area. Our scope includes serious competition, friendly exhibition matches, but mostly fun practices just to see what others know. + +Every Tuesday we hold our meetings in Hastings Hall room 206 at 8pm, and Wednesdays and Fridays we have trivia nights at restaurants around town. Come to a meeting to learn more! + +Please fill out this form if you would like to be included in our email list: http://eepurl.com/h-W1ZP + +Groupme, our main communication platform: https://web.groupme.com/join_group/93683454/vJZNo1Kt', '455', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7db4ba58-2f38-4785-b3c1-4ff7bf9d7756', 'Turkish Student Association', 'To educate our fellow peers and professors about the culture, history, and current state of Turkey, and to help incoming Turkish students adapt to their university life in Boston and the US.', 'Welcome to the Turkish Student Association at our university! We pride ourselves on fostering a vibrant community that celebrates the rich culture, history, and current affairs of Turkey. From educational events that enlighten our peers and professors to providing essential support for incoming Turkish students adjusting to life in Boston and the US, we strive to create an inclusive environment where everyone can connect, learn, and grow together. Whether you''re curious about Turkey or seeking a friendly community to join, we''re here to welcome you with open arms!', '102', 'FALSE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4b95f558-1b83-4811-b184-de22760502b1', 'Ukrainian Cultural Club of Northeastern University', 'The primary purpose of this organization is to unite students at Northeastern University and neighboring colleges of Ukrainian descent as well as anyone interested in Ukraine, its culture, language, or history.', 'The primary purpose of this organization is to unite students at Northeastern University and neighboring colleges of Ukrainian descent as well as anyone interested in Ukraine, its culture, language, or history. The goal of this organization is to enrich individuals with the Ukrainian culture via meetings, events, and community service opportunities. The club is hopeful that this will increase student cultural awareness among Northeastern students and others.', '329', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b9bc8a29-6d51-4e83-8c44-2c5cd4112348', 'Undergraduate Global Health Initiative', 'The Undergraduate Global Health Initiative (UGHI) is an organization on campus that seeks to educate fellow students about the pressing issues of global healthby organizing events that promote research, advocacy, and interdisciplinary teamwork ', 'NUGHI members take part in planning health equity and social justice-centered events, such as conversations with activists and clinicians and volunteering opportunities, in collaboration with non-profit organizations and/or student groups on campus. (Past events include Black Health Matters, Palestinian Health Panel, Indigenous People’s Day Health Panel, and many others). ', '867', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('88d0788a-dffc-49b7-81aa-d7832a0a9971', 'UNICEF at Northeastern', 'UNICEF at Northeastern advocates to educate the Northeastern community about UNICEF''s work to protect the rights of children around the world. In addition to raising awareness, we also raise funds to contribute towards UNICEF''s most important projects.', 'UNICEF at Northeastern partners with the U.S. Fund for UNICEF to expand and support UNICEF''s work across the country. We center our work around education, advocacy and fundraising. As a club, we raise awareness about UNICEF''s work through presentations, fundraisers and social events. Members also get a chance to learn about volunteer opportunities directly from UNICEF.', '271', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3', 'Unicycling at Northeastern Club', 'Come unicycle with us every Saturday 12pm! If you don''t know how, we''ll lend you one and teach you. All skill levels welcome! + +', 'Unicycle Club aims to introduce the sport of unicycling to the Northeastern community, providing a supportive and encouraging space for newcomers and mentors alike. We know that not many people have touched or maybe even seen one, but you’d be surprised how far an afternoon of practice could get you! + +https://linktr.ee/neunicyclers?utm_source=linktree_profile_share&ltsid=fb05dda1-492a-484e-848d-51da44e308a0', '594', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('de2ca761-e4ee-4856-8d2a-928249362806', 'United Against Inequities in Disease', 'United Against Inequities in Disease is a national, nonprofit organization that empowers students to develop and eliminate public health inequities through community engagement, volunteering, and research. ', 'United Against Inequities in Disease, or UAID, focuses our efforts on local communities, conducting our work in collaboration with local partners, and leveraging the power of research and an interdisciplinary approach to combatting health inequity. Through our work, we aim to both reduce health inequities in our communities today and also empower public health advocates of tomorrow. We encourage students of all backgrounds and disciplines to join our mission to create sustainable health interventions in Boston.', '949', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b30e9302-6a7f-490a-b9e0-48a9a9d42e2d', 'University Health and Counseling Services (Campus Resource)', 'The University Health and Counseling Services Team is anxious to serve you. We hope that you will use our center as a resource, to help stay healthy, physically and mentally, and for care when you are ill or injured, or depressed or stressed.Our medica...', 'The University Health and Counseling Services Team is anxious to serve you. We hope that you will use our center as a resource, to help stay healthy, physically and mentally, and for care when you are ill or injured, or depressed or stressed. Our medical and behavioral health teams will work with you as partners in your health care so that you get confidential, compassionate and high quality care. We believe in caring for you and advocating for your well-being throughout your college experience.', '892', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('110e0c85-45e0-4461-a82b-837dde664284', 'UTSAV - South Asian Organization', 'UTSAV, named for the Sanskrit word meaning "Festival," was started in 1991 by a handful of South Asian students. Now in its 32nd year, UTSAV has grown into a large community of over 250 South Asian and South Asian American students.', 'UTSAV, named for the Sanskrit word meaning "Festival," was started in 1991 by a handful of South Asian students. Now in its 33rd year, UTSAV has grown into a large community of over 250 South Asian and South Asian American students, and continues to strive to provide them with a sense of belonging, along with supplying fun, unique, and thoughtful opportunities for all Northeastern students to learn about South Asian heritage and identity. We represent students from Bangladesh, Bhutan, India, Nepal, Pakistan and Sri Lanka. Although we represent these six countries, we encourage those of any background to engage with us to navigate South Asian culture, tradition, and context. We are also members of Northeastern''s Pan-Asian American Council, as well as the EMPOWER network for students of color on campus. We hope you join our community, attend our events, perform in our shows, and come share your stories with us! + + + +This is a UNDERGRADUATE STUDENT only organization.', '386', 'TRUE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('27b8ce39-c89e-49f9-a19b-92ea7da6c633', 'Vietnamese Student Association', 'We are a student group that helps promote an awareness of the Vietnamese and Vietnamese American culture to the diverse community of Northeastern. Please like and check out our Facebook and Instagram for more information and updates!', 'We are a student group that helps promote an awareness of the Vietnamese and Vietnamese American culture to the diverse community of Northeastern, and as such we like to call our org a "Home Away From Home"! We emphasize four pillars in our community: Culture, Food, Family, and Dance! We have biweekly general meetings, host multiple events each year - such as our annual Culture Show - and participate in many huge collaborations such as A Night in Asia and Mid-Autumn Festival. We are proud to be part of Northeastern PAAC as well as NEIVSA, the New England Intercollegiate VSA. Please like and check out our Facebook page for more information and updates, and stay connected with us on our Instagram @NortheasternVSA! Thanks for checking us out, and we hope to meet with you soon!', '424', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('e6da21eb-bf79-42af-8a65-5584b84f62d8', 'Virtual Reality Organization of Northeastern University', 'NUVR aims to utilize the latest technologies to develop and research virtual experiences. Please check out our Summer Involvement Fair Information session at this link to learn about what NUVR can offer you this year.', 'NUVR aims to utilize the latest technologies to develop and research virtual experiences. If you have any interest in learning about VR, AR, or XR as a whole join our discord to get in contact with us: https://discord.gg/gfeuhJmeQb + +You can also follow our Instagram: @northeastern_vr to get weekly updates about our meetings + +See you soon!', '422', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('b38c999f-49f5-4ec7-a37f-0f390fc68e75', 'ViTAL: Northeastern''s Healthcare Innovation Core', 'ViTAL is a student-run undergraduate organization that inspires students to explore and innovate beyond the traditional realm of healthcare professions to better serve patients/clients and their families and to enhance the future of healthcare.', 'ViTAL is a student-run undergraduate organization that inspires students to explore and innovate beyond the traditional realm of healthcare professions to better serve patients/clients and their families and to enhance the future of healthcare. We foster an interdisciplinary community of healthcare leaders through guest speaker events, the Husky Health Innovation Challenge, a healthcare case competition, and ViTAL Ventures Consulting, our pro-bono consulting arm. ', '524', 'FALSE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bf4945de-9b26-4bde-84bf-85f9b2b9fdd0', 'Wildlife/Ecology Club', 'A club dedicated to preserving ecological diversity and educating the Northeastern student population around issues of ecology. ', 'The Northeastern Wildlife/Ecology Club is dedicated to spreading awareness of the ecological diversity on our planet, the devastating effects of climate change on nature, and what we can do to preserve our planet. This club is a coming together of individuals with a passion for ecology and a drive for change. ', '956', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('aac82c95-2ad5-4226-b74f-a6879fe86ed7', 'Wireless Club', 'NU Wireless Club is a electronics experimentation club, where students from all disciplines can meet to work on projects and learn electronics through hands-on applications. The club features a lab space and a full amateur radio station.', 'NU Wireless Club is an electronics experimentation club, where students from all disciplines can meet to work on projects and learn electronics through hands-on applications. The club features a maker space and a full amateur radio station.', '393', 'FALSE', 'always', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('5c3abab8-bc93-4dc1-8de0-70d5b9cdd18a', 'Women in Business', 'NU Women in Business empowers undergraduate womxn at Northeastern University through professional and personal development events, fostering their success in the business world. Join us to unlock your potential and thrive in a supportive community.', 'Welcome to Northeastern Women in Business (WIB), a thriving organization built on the four principles of professional development, inspiration, mentorship, and community. We host a variety of events every Tuesday at 8PM that are geared towards these four principles in an overall mission to support and uplift the young women of Northeastern who are interested in the dynamic, interdisciplinary world of business. + +Professional DevelopmentOur professional development events are designed to equip you with the critical hard skills and soft skills necessary to excel in the business industry. Hoping to revamp your resume or ace your upcoming co-op interview? Our fun workshops and activities provide practical guidance that will help you stand out among your peers! + +InspirationPrepare to be inspired by our captivating Executive Speaker series, where we bring in top female business leaders from the Boston area. These accomplished individuals share their remarkable stories, providing invaluable insights and igniting a passion for success. Additionally, our panel events feature esteemed alumni and even our own student body, discussing post-grad life or the transformative co-op experience. + +MentorshipOur remarkable Mentor/Mentee program pairs older members, who have completed at least one co-op, with younger members seeking guidance in their Northeastern journey. This unique relationship provides an exceptional opportunity to learn from other inspiring women who have walked in your shoes, offering invaluable advice and insights that can shape your future success. + +CommunityAt WIB, we believe that a strong community fosters growth. That’s why we host a variety of engaging community events, called Empower Hour, including fun socials that foster friendships and connections beyond the classroom. Other Empower Hour socials focus on topics like healthy work-life balance, taking members out of the classroom and into activities such as group workouts, shared meals, and adopting balanced lifestyles. + +Joining WIB means becoming part of a strong and beautiful community. We are dedicated to helping each other grow, supporting one another’s aspirations, and celebrating our collective achievements. Whether you’re a young underclassman or an upperclassman seeking new horizons, WIB welcomes you with open arms!', '467', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('648f5dde-d549-4879-a645-f7fd1aef22b4', 'Women in CyberSecurity', 'Women in CyberSecurity (WiCyS) is dedicated to bringing together female leaders interested in cybersecurity. We hold workshops, seminars, and opportunities for community bonding, offering you chances to learn and network.', '***WE DO NOT REGULARLY USE ENGAGE! Check out our Linktree (the globe icon under "Contact Information") to see the best ways to keep in touch with us!*** + +WiCyS is a national organization and global community of women, allies, and advocates who are dedicated to bringing talented women together to celebrate and foster their passion and drive for cybersecurity. As Northeastern University’s chapter of the national organization, we bring this environment of community engagement and career-building to Northeastern and its students. + +Our intended audience is women interested in cybersecurity, both undergraduate and graduate, looking to have a career in cyber or even just curious and open to learning more about the world of security. NU WiCyS is a close-knit community providing a safe space for an underrepresented niche. + +Our purpose is to bring passionate and driven women to a united space where they can share their love for cybersecurity. We also strive towards educating people, connecting communities with industry leaders/professionals, connecting students with faculty, and guiding students towards research opportunities. We put a large emphasis on sharing the experiences of upperclassmen to the underclassmen looking for advice and guidance. + + ', '406', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d6950ddc-1c2c-4c39-8b58-8a8ad66482f1', 'Women in Economics', 'Women in Economics addresses the gender disparities within economics. We cultivate an empowering community for all students who express an interest in the field of economics by inviting them to engage with economics on an interdisciplinary level.', 'As an undergraduate student organization, Women in Economics addresses the gender disparities within economics. We cultivate an empowering community for all students who express an interest in the field of economics. We invite our members to engage on an interdisciplinary level with economics while promoting diversity and inclusivity. Women in Economics provides members with skills-building opportunities, empowerment in the field, and a connection with faculty and graduate students. + +We host bi-weekly meetings along with occasional large-scale events during the year. The focus of our more informal weekly meetings is to provide a space where members can connect with each other and share their thoughts on the topic at hand. These meetings cover current research being done by female economists, workshops on important tools for success in the field, and discussions about improving the field for women. + +With the larger events, we seek to inspire and encourage members by demonstrating the possibilities of the tools of economics. These events will feature a speaker, either a PhD student in economics or professor, who will speak to the group about their research, experience, and challenges in the field. + +We welcome all to join Women in Economics regardless of major. ', '388', 'TRUE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('bfaef5ac-4c61-4e7a-849e-c60b4790c1b7', 'Women in Music Northeastern', 'WIM Northeastern is the first collegiate chapter of Women in Music and aims to provide educational resources and networking opportunities for aspiring music industry professionals. ', 'Women in Music Northeastern is the first collegiate chapter of Women in Music and aims to provide educational resources and networking opportunities for aspiring music industry professionals, with a focus on empowering, supporting, and recognizing women-identifying students and individuals in the musical arts. ', '773', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a5b79b0c-bdf1-4ff3-84f1-6a0e1425f373', 'Women in the Enterprise of Science and Technology at Northeastern', 'WEST NEU is Northeastern''s chapter of WEST, or Women in the Enterprise of Science and Technology. The Northeastern chapter was formed to foster connections with professionals in STEM-based fields, with a focus on networking and mentorship.', 'WEST NEU is Northeastern’s chapter of WEST, or Women in the Enterprise of Science and Technology. WEST is an organization in the greater Boston area that is dedicated to expanding and enriching the careers of women in the fields of science, technology, and engineering. WEST NEU is an avenue for Northeastern students to connect with established members of the organization and other Boston-based students in STEM. WEST NEU offers monthly workshops and panels tailored to helping women develop as leaders in their fields. WEST members include prominent women and minorities holding executive positions in their fields, helping connect WEST NEU members to unique resources and opportunities. Our mission is to connect Northeastern students to the plethora of resources that WEST has to offer, in order to inspire and facilitate the career advancement of our members.', '436', 'FALSE', 'fall', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('4cf62182-da37-4bf0-8e59-4bac1be6a79e', 'Women''s and Nonbinary Club Ultimate Frisbee', 'This is the women''s club ultimate frisbee team. We have 2 teams, one high-commitment team that competes nationally and one lower-commitment team that competes in the region. Both teams love to have fun and play ultimate together. No experience needed!', 'We are the women''s club ultimate frisbee team. We have 2 teams: one high-commitment team that competes nationally and one lower-commitment team that competes in the northeast region. Both teams love to have fun and play ultimate together. No experience is necessary to join! Check out the Gallery, Documents, and these two websites for more introductory information', '426', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('1bbc7ad4-962b-4e1c-afd9-300f67cd50fe', 'Women''s Club Basketball', 'Northeastern Women''s Club Basketball is a great opportunity for players who want to continue playing basketball competitively without committing to the rigorous collegiate level. + +', 'Northeastern Women''s Club Basketball is a great opportunity for players who want to continue playing basketball competitively without committing to the rigorous collegiate level. This organization allows students to develop their skills, compete against other college teams, and have fun while doing it! Please contact nuwomensclubbball@gmail.com for more information.', '395', 'FALSE', 'fallSpring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('38eb6703-0c11-491b-a6e9-d88d84a4ed8b', 'Women''s Club Ice Hockey', 'We are a student-run club hockey organization based out of Northeastern University. Our purpose is to give Northeastern students an opportunity to continue their ice hockey careers in a collegiate setting, and to participate in the sport of ice hockey ...', 'We are a student-run club hockey organization based out of Northeastern University. Our purpose is to give Northeastern students an opportunity to continue their ice hockey careers in a collegiate setting, and to participate in the sport of ice hockey at a competitive level in a team environment. We participate in the Presidential Division of the IWCHL, playing teams from around the Boston and New England area and within Division 2 of the ACHA.', '60', 'TRUE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('d66326e4-af95-4625-8274-590a0d7388b5', 'Women''s Club Lacrosse', 'Last year, the Northeastern Women''s Lacrosse team made it to the NEWLL regional playoffs, but fell to Boston College in the semifinals. The team also traveled to Clemson to play some of the best teams in the country. We are a competitive team with grea...', 'Last year, the Northeastern Women''s Lacrosse season was cut short due to Covid-19, however had an outstanding year in 2019. The team beat their biggest competitor. Boston College, in the Semifinals, making it to the National Tournament hosted in Virginia Beach for the first time in years. NUWLAX also traveled to Colorado to play some of the best teams in the country, going 4/4 that weekend. We are a competitive team with great chemistry and a force to be reckoned with.', '669', 'FALSE', 'spring', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('a536b622-a91e-4064-acb3-c7d7f8f5c1ea', 'Women''s Club Water Polo', 'Northeastern University Women''s Club Water Polo competes in the New England Division of the Collegiate Water Polo Association. Feel free to reach out if you''re interested in joining the team, there''s no experience necessary! Check out our insta or FB!', 'Northeastern University Women''s Club Water Polo competes in the New England Division of the Collegiate Water Polo Association. We are a no experience needed team with no try outs and players of a variety of skill levels. So definitely feel free to reach out if you''re interested in joining the team! ', '1010', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('312c7723-493f-4f4a-b9b9-635bb832b1ac', 'Women''s Interdisciplinary Society of Entrepreneurship', 'WISE is a student-led organization dedicated to supporting womxn interested in exploring entrepreneurship through interdisciplinary workshops, mentorship pairings, and startup classes.', 'The Women’s Interdisciplinary Society of Entrepreneurship (WISE) is a student-led group at Northeastern University dedicated to helping women develop an innovative mindset through interactive workshops (WeLearn), a thought-incubator (WeBuild), and mentorship pairings (WeSupport). + +WISE provides students the opportunity to explore curiosities and discover paths together. Experiential learning is at the heart of Northeastern University, and WISE builds upon its ethos. + +Whether you are looking to attend interactive workshops that showcase entrepreneurship in every light, find a mentor to help develop personal and professional skills, or strengthen problem-solving skills through working on a semester-long project, WISE has an opportunity for you! + +If your interested and want to learn more, sign up for our newsletter here! + +Also, follow us on instagram @northeasternwise', '868', 'FALSE', 'spring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('17ca81bd-194f-46a9-81fd-69ca39101a37', 'Woof Magazine', 'Woof Magazine is Northeastern''s only lifestyle magazine on campus. We’re your source for fun things you can do on campus or around Boston, opinions on hot topics, and much more with all writing, photography, and design created by students.', 'Woof Magazine is Northeastern''s only on-campus lifestyle magazine. We’re your source for fun things you can do on campus or around Boston, opinions on hot topics and much more with all writing, photography and design created by students. Currently, we print one issue each academic year, publish articles on our website and post on our Instagram constantly! Woof welcomes students of all levels: join to learn or improve your creative skills and get your work published! + +If you are interested in joining Woof, join our Slack!', '622', 'TRUE', 'fallSpring', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('80400af6-e6a1-4321-992d-48c09fc68984', 'WRBB 104.9FM Campus Radio', 'WRBB has provided the Northeastern and Back Bay communities with the best on-air programming since the ''60''s, and that hasn''t changed in the modern era! Launching bands like Passion Pit, All These Elements, and numerous others, WRBB is dedicated to sup...', 'WRBB has provided the Northeastern and Back Bay communities with the best on-air programming since the ''60s, and that hasn''t changed in the modern era! Launching bands like Passion Pit, All These Elements, and numerous others, WRBB is dedicated to supporting the Boston music scene and act as a creative and professional outlet for those interested in broadcast media. Join today and get on the air, or get involved with our growing promotional department, award-winning sports broadcasters, music department, or even get involved with booking shows on campus! WRBB is one of the biggest media groups on campus for a reason. We dare you to listen. ', '669', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('ae4f1111-5c1a-4600-bd9e-f0183e727e06', 'Young Democratic Socialists of America at Northeastern University', 'Expanding socialist politics and labor solidarity is the name of the game! We are a collective organizing for a future where workers control their economic output and no person is exploited. We host several campaigns and political education events.', 'Our mission is to educate and organize students and young people to play a helpful and principled role in the movement for social and economic justice in the Northeastern University and local communities. Within and throughout this struggle both nationally and locally, we will articulate and defend the idea that true human liberation is impossible under capitalism. We seek social change which extends democracy into all aspects of life -- social, political and economic. We accept members of broad ideologies while never sacrificing our values. We believe in the universality of social programs, the collective ownership of the means of production, and our struggle for justice will not end until every human can live a just life. Our vision of socialism is profoundly democratic, feminist, and anti-racist. ', '38', 'TRUE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('7b6c22b2-e81d-45f2-b619-b5b9fc031ba9', 'Zeta Beta Tau: Gamma Psi Chapter', 'A chapter of the Zeta Beta Tau fraternity operating at Northeastern University', 'Our fraternity is a brotherhood of college aged men who have a vested interests in striving for excellence. We host various events including philanthropy events on and off campus that raise money for various different charities in Boston. We have roughly 30 members consisting of all undergraduate students.', '3', 'TRUE', 'always', 'unrestricted', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('6f641d7c-9d1e-4b8a-9fd5-79d05463c131', 'Zeta Phi Beta Sorority, Inc.', 'The Beta Chi chapter of Zeta Phi Beta Sorority, Inc. was chartered on March 31, 2023, by six matriculating women on the campus of Northeastern University. Beta Chi is a university-based undergraduate chapter that seeks to serve the Northeastern community', 'The Beta Chi chapter of Zeta Phi Beta Sorority, Inc. was chartered on March 31, 2023, by six matriculating women on the campus of Northeastern University. Beta Chi is a university-based, undergraduate chapter that seeks to serve the students and community of Northeastern while upholding the sorority''s principles of scholarship, service, sisterhood, and finerwomanhood.', '77', 'FALSE', 'fall', 'application', '00000000-0000-0000-0000-000000000000'); +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '07d91099-3ccd-481e-b24d-cfa7b5bdce52') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '07d91099-3ccd-481e-b24d-cfa7b5bdce52') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '02823e48-6cb5-4727-ae13-3ca6b4eca78b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '02823e48-6cb5-4727-ae13-3ca6b4eca78b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '02823e48-6cb5-4727-ae13-3ca6b4eca78b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '75dc80f4-ea4f-4964-8fba-e752794d1a47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '82142fe4-7603-4828-9d19-64fbbe09029d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '82142fe4-7603-4828-9d19-64fbbe09029d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '82142fe4-7603-4828-9d19-64fbbe09029d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '82142fe4-7603-4828-9d19-64fbbe09029d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '82142fe4-7603-4828-9d19-64fbbe09029d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '8e12dc9d-2900-4cca-b08d-caed85720fa6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8e12dc9d-2900-4cca-b08d-caed85720fa6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '8e12dc9d-2900-4cca-b08d-caed85720fa6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '2b4315f6-304f-4704-be0f-ba367fe87932') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2b4315f6-304f-4704-be0f-ba367fe87932') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '2b4315f6-304f-4704-be0f-ba367fe87932') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '33a0db57-ff20-4997-bfe7-518c7d8db242') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '33a0db57-ff20-4997-bfe7-518c7d8db242') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '952d429e-f309-4332-a45b-113efd8e27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', '952d429e-f309-4332-a45b-113efd8e27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '952d429e-f309-4332-a45b-113efd8e27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '952d429e-f309-4332-a45b-113efd8e27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '1eff502d-5ac2-4f9d-a33e-66a5e9b98f15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '1eff502d-5ac2-4f9d-a33e-66a5e9b98f15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '1eff502d-5ac2-4f9d-a33e-66a5e9b98f15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '1eff502d-5ac2-4f9d-a33e-66a5e9b98f15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'cb86b62b-a14f-49d0-8217-005f456992d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'cb86b62b-a14f-49d0-8217-005f456992d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'cb86b62b-a14f-49d0-8217-005f456992d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'cb86b62b-a14f-49d0-8217-005f456992d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'e1e3acda-e4d0-477d-b504-c84e9bd035f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e1e3acda-e4d0-477d-b504-c84e9bd035f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'e1e3acda-e4d0-477d-b504-c84e9bd035f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'e1e3acda-e4d0-477d-b504-c84e9bd035f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'e1e3acda-e4d0-477d-b504-c84e9bd035f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f7ba90a7-6dc5-45ce-8297-c98eff5eb887') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'e9acd08e-38f7-4605-95f1-2f2f5489a85e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'e9acd08e-38f7-4605-95f1-2f2f5489a85e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'b2acdd0b-da3d-4b1a-a6d5-6aa1b2150289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('634b4962-9bf6-444e-84c7-5e54d8655ba4', 'b2acdd0b-da3d-4b1a-a6d5-6aa1b2150289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'b2acdd0b-da3d-4b1a-a6d5-6aa1b2150289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'b2acdd0b-da3d-4b1a-a6d5-6aa1b2150289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'a3b62d86-ceeb-4172-9e2d-2c24849ce4f3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a3b62d86-ceeb-4172-9e2d-2c24849ce4f3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'f547f70a-c0d7-4819-af01-3a60c87887f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f547f70a-c0d7-4819-af01-3a60c87887f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'f547f70a-c0d7-4819-af01-3a60c87887f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '11920fef-97cb-459d-925d-3278273af5fd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '11920fef-97cb-459d-925d-3278273af5fd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '11920fef-97cb-459d-925d-3278273af5fd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '11920fef-97cb-459d-925d-3278273af5fd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', '11920fef-97cb-459d-925d-3278273af5fd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '64187513-b253-4146-b8f4-3f054e006c0f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '64187513-b253-4146-b8f4-3f054e006c0f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '64187513-b253-4146-b8f4-3f054e006c0f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1f6a6680-7f92-4dfa-852a-35a60a680e2c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1f6a6680-7f92-4dfa-852a-35a60a680e2c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'ae05ed0d-760d-4d49-b9f8-f3c8c511f673') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ae05ed0d-760d-4d49-b9f8-f3c8c511f673') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'ae05ed0d-760d-4d49-b9f8-f3c8c511f673') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'ae05ed0d-760d-4d49-b9f8-f3c8c511f673') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'c65f0dfb-ffbc-4a57-a59c-b8a421036017') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'c65f0dfb-ffbc-4a57-a59c-b8a421036017') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'c65f0dfb-ffbc-4a57-a59c-b8a421036017') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c65f0dfb-ffbc-4a57-a59c-b8a421036017') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'c65f0dfb-ffbc-4a57-a59c-b8a421036017') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '7530b744-7467-4556-a6a1-6d7def71452b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '7530b744-7467-4556-a6a1-6d7def71452b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7530b744-7467-4556-a6a1-6d7def71452b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7530b744-7467-4556-a6a1-6d7def71452b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '7530b744-7467-4556-a6a1-6d7def71452b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '7530b744-7467-4556-a6a1-6d7def71452b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '006ac5f3-a924-478e-96ee-81c89ee5b0a2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '006ac5f3-a924-478e-96ee-81c89ee5b0a2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '006ac5f3-a924-478e-96ee-81c89ee5b0a2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5aa9d717-c2d9-449b-9f5f-31651e0bb833') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2c410248-ebe5-4eff-a6a7-f3e24d7a388b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '2c410248-ebe5-4eff-a6a7-f3e24d7a388b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '63f14e5f-340f-44c8-be84-c148f72647f2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '63f14e5f-340f-44c8-be84-c148f72647f2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '63f14e5f-340f-44c8-be84-c148f72647f2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '63f14e5f-340f-44c8-be84-c148f72647f2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '63f14e5f-340f-44c8-be84-c148f72647f2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '889424c8-db97-415e-a3fd-879e1b348c82') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '86596efb-e351-44b1-b765-54f292cc8159') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '86596efb-e351-44b1-b765-54f292cc8159') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '86596efb-e351-44b1-b765-54f292cc8159') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'fd7ed185-e0d8-4a32-b287-35fb8b70fe6a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'fd7ed185-e0d8-4a32-b287-35fb8b70fe6a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'fd7ed185-e0d8-4a32-b287-35fb8b70fe6a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'ee941f33-6952-449c-a214-228f399a770f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ee941f33-6952-449c-a214-228f399a770f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'ee941f33-6952-449c-a214-228f399a770f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', 'ee941f33-6952-449c-a214-228f399a770f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'a1921f1d-f7e7-4c3d-b4da-3669172ff1e9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'a1921f1d-f7e7-4c3d-b4da-3669172ff1e9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'a1921f1d-f7e7-4c3d-b4da-3669172ff1e9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a1921f1d-f7e7-4c3d-b4da-3669172ff1e9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '8fbb2d83-09fe-4269-9a10-16f082cbc067') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '578da4f2-2b3c-4e2c-91e0-966ea85580d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '578da4f2-2b3c-4e2c-91e0-966ea85580d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '578da4f2-2b3c-4e2c-91e0-966ea85580d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '578da4f2-2b3c-4e2c-91e0-966ea85580d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '578da4f2-2b3c-4e2c-91e0-966ea85580d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '0968bde1-e0b5-4425-bfdb-8682a70038b7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0968bde1-e0b5-4425-bfdb-8682a70038b7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '0968bde1-e0b5-4425-bfdb-8682a70038b7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'c9dd5836-8c0c-444a-a85e-1bb2d362fa25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'c9dd5836-8c0c-444a-a85e-1bb2d362fa25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'c9dd5836-8c0c-444a-a85e-1bb2d362fa25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'c9dd5836-8c0c-444a-a85e-1bb2d362fa25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '73956459-f909-4dbc-a9d7-fda4e2d6b521') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '73956459-f909-4dbc-a9d7-fda4e2d6b521') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '73956459-f909-4dbc-a9d7-fda4e2d6b521') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '73956459-f909-4dbc-a9d7-fda4e2d6b521') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '73956459-f909-4dbc-a9d7-fda4e2d6b521') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '4031a438-5d75-484e-b2ea-47989cf09970') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '4031a438-5d75-484e-b2ea-47989cf09970') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '4031a438-5d75-484e-b2ea-47989cf09970') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4031a438-5d75-484e-b2ea-47989cf09970') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '4031a438-5d75-484e-b2ea-47989cf09970') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '8bc2a8d9-fcba-496f-a8d3-f79f666f353b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '8bc2a8d9-fcba-496f-a8d3-f79f666f353b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '8bc2a8d9-fcba-496f-a8d3-f79f666f353b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8bc2a8d9-fcba-496f-a8d3-f79f666f353b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5b0abf55-2806-47d2-a95f-f8c411290df7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '5b0abf55-2806-47d2-a95f-f8c411290df7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5b0abf55-2806-47d2-a95f-f8c411290df7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '5b0abf55-2806-47d2-a95f-f8c411290df7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd1600f1e-31cf-4370-8b48-c852eecff9ad') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd1600f1e-31cf-4370-8b48-c852eecff9ad') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'd1600f1e-31cf-4370-8b48-c852eecff9ad') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '3709674c-2428-4c9b-aba0-b6384f3d472a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '3709674c-2428-4c9b-aba0-b6384f3d472a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3709674c-2428-4c9b-aba0-b6384f3d472a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '21a2aaae-cc07-4c34-bc6c-2730e3d545f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '21a2aaae-cc07-4c34-bc6c-2730e3d545f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '21a2aaae-cc07-4c34-bc6c-2730e3d545f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '21a2aaae-cc07-4c34-bc6c-2730e3d545f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f1ac80bc-e361-4952-8978-8354d21e4ae9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f1ac80bc-e361-4952-8978-8354d21e4ae9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '2bd54300-0c35-4215-acdc-996f79c65173') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '2bd54300-0c35-4215-acdc-996f79c65173') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2bd54300-0c35-4215-acdc-996f79c65173') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '2bd54300-0c35-4215-acdc-996f79c65173') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '2bd54300-0c35-4215-acdc-996f79c65173') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'c5ae7818-c950-4d00-9d31-896bdde44289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c5ae7818-c950-4d00-9d31-896bdde44289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'c5ae7818-c950-4d00-9d31-896bdde44289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'c5ae7818-c950-4d00-9d31-896bdde44289') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '58cb00dc-7f5a-4dc3-86ff-fb5f8fcf67ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '58cb00dc-7f5a-4dc3-86ff-fb5f8fcf67ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '58cb00dc-7f5a-4dc3-86ff-fb5f8fcf67ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '58cb00dc-7f5a-4dc3-86ff-fb5f8fcf67ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '5d21ca30-045d-436d-9d50-9ca4e66ea184') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', '5d21ca30-045d-436d-9d50-9ca4e66ea184') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5d21ca30-045d-436d-9d50-9ca4e66ea184') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '5d21ca30-045d-436d-9d50-9ca4e66ea184') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5d21ca30-045d-436d-9d50-9ca4e66ea184') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9b2fb82e-a66f-4ab2-86f5-2820d76898e7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '9b2fb82e-a66f-4ab2-86f5-2820d76898e7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('297fd449-1e9a-461b-8014-48f08fb16aa5', '7b2b7918-0324-4af5-a258-9da7299e7427') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '7b2b7918-0324-4af5-a258-9da7299e7427') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7b2b7918-0324-4af5-a258-9da7299e7427') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '7b2b7918-0324-4af5-a258-9da7299e7427') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'aa34fab0-e637-4e9e-b639-b802f38e1cb2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'aa34fab0-e637-4e9e-b639-b802f38e1cb2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'aa34fab0-e637-4e9e-b639-b802f38e1cb2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1000c08-c02e-421c-ad34-a81836d1d053', 'd78bd9d4-9898-49c1-a3e9-d7dbebf3854d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', 'd78bd9d4-9898-49c1-a3e9-d7dbebf3854d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'd78bd9d4-9898-49c1-a3e9-d7dbebf3854d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd78bd9d4-9898-49c1-a3e9-d7dbebf3854d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd78bd9d4-9898-49c1-a3e9-d7dbebf3854d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '5e339489-2d81-42fe-b3d9-67aca6e58ade') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5e339489-2d81-42fe-b3d9-67aca6e58ade') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'ed6cd8c8-395a-4518-b088-297e242d1c12') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', 'ed6cd8c8-395a-4518-b088-297e242d1c12') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ed6cd8c8-395a-4518-b088-297e242d1c12') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8a7c1789-7b91-414a-b762-0c536c065b4f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('e4ea26ce-1444-41be-9342-f085f615f9a7', '47923cd1-c713-4375-8e3f-4ba05a965835') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '47923cd1-c713-4375-8e3f-4ba05a965835') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '47923cd1-c713-4375-8e3f-4ba05a965835') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '3a07882c-8ad3-4603-8874-deff6257c63f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3a07882c-8ad3-4603-8874-deff6257c63f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3a07882c-8ad3-4603-8874-deff6257c63f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '3a07882c-8ad3-4603-8874-deff6257c63f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '0d1881f5-70d2-40e0-9bc0-c09bd5dfe4cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '0d1881f5-70d2-40e0-9bc0-c09bd5dfe4cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0d1881f5-70d2-40e0-9bc0-c09bd5dfe4cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '0d1881f5-70d2-40e0-9bc0-c09bd5dfe4cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '0d1881f5-70d2-40e0-9bc0-c09bd5dfe4cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '0d1881f5-70d2-40e0-9bc0-c09bd5dfe4cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '5853cb38-3c73-4f76-a37a-4bfe9c7ff93d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5853cb38-3c73-4f76-a37a-4bfe9c7ff93d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '22282392-c6ec-4695-a166-54707a4920eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '22282392-c6ec-4695-a166-54707a4920eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '22282392-c6ec-4695-a166-54707a4920eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '22282392-c6ec-4695-a166-54707a4920eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '6353fdfb-e795-4d78-8287-be296708db7f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '6353fdfb-e795-4d78-8287-be296708db7f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ad528419-c98a-47f9-b0a2-e72ac372faa2', '6353fdfb-e795-4d78-8287-be296708db7f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6353fdfb-e795-4d78-8287-be296708db7f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '022fc6e0-2b9e-474b-b6e1-43f4f88cc350') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '022fc6e0-2b9e-474b-b6e1-43f4f88cc350') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '01465118-26a2-4d8b-b4c4-826228f0b88e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '01465118-26a2-4d8b-b4c4-826228f0b88e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '01465118-26a2-4d8b-b4c4-826228f0b88e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '01465118-26a2-4d8b-b4c4-826228f0b88e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '01465118-26a2-4d8b-b4c4-826228f0b88e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'c9f58449-6a94-44c7-afc4-628cd7a0fc65') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c9f58449-6a94-44c7-afc4-628cd7a0fc65') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'b6fda1b2-7120-452b-96f4-25054ad94389') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'b6fda1b2-7120-452b-96f4-25054ad94389') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b6fda1b2-7120-452b-96f4-25054ad94389') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', 'b6fda1b2-7120-452b-96f4-25054ad94389') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '3f239dfb-8362-4f93-a54c-f8107e8ef2d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3f239dfb-8362-4f93-a54c-f8107e8ef2d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3f239dfb-8362-4f93-a54c-f8107e8ef2d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '3f239dfb-8362-4f93-a54c-f8107e8ef2d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '3f239dfb-8362-4f93-a54c-f8107e8ef2d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '634d8b37-550e-410c-b99c-d0fd966f3229') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '634d8b37-550e-410c-b99c-d0fd966f3229') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '634d8b37-550e-410c-b99c-d0fd966f3229') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '10f8b2a5-33fa-416f-9d84-6b9b7723ba2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '10f8b2a5-33fa-416f-9d84-6b9b7723ba2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'c8279222-aff2-46a7-9069-30f762fff748') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'c8279222-aff2-46a7-9069-30f762fff748') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('634b4962-9bf6-444e-84c7-5e54d8655ba4', 'c8279222-aff2-46a7-9069-30f762fff748') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'c8279222-aff2-46a7-9069-30f762fff748') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c8279222-aff2-46a7-9069-30f762fff748') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f7002326-556e-47a4-9abe-498844fc6a33') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f7002326-556e-47a4-9abe-498844fc6a33') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('9195072b-0a1b-4915-bd80-10b05ad1bef0', 'fb0657be-9b2e-4471-b90d-86c1c247a6b2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'fb0657be-9b2e-4471-b90d-86c1c247a6b2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'c17df5f6-6bc1-4063-a0a9-1ef900406a1f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c17df5f6-6bc1-4063-a0a9-1ef900406a1f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'c17df5f6-6bc1-4063-a0a9-1ef900406a1f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c17df5f6-6bc1-4063-a0a9-1ef900406a1f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'c17df5f6-6bc1-4063-a0a9-1ef900406a1f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '640a7dea-8630-4aa1-8be8-940a336e359d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a561e329-6337-4ba9-ab92-e92b0b1f1a40') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1e5fc4c7-78d8-4dbf-8612-bfd44c2bc113') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1e5fc4c7-78d8-4dbf-8612-bfd44c2bc113') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1e5fc4c7-78d8-4dbf-8612-bfd44c2bc113') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'efd81923-a8b2-4598-aa31-ffc0eefca530') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'efd81923-a8b2-4598-aa31-ffc0eefca530') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b64572a6-8c30-4d84-8828-0ab5a3719967') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'b64572a6-8c30-4d84-8828-0ab5a3719967') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a660b03d-e5cf-4ea6-bf19-8373baab801a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a660b03d-e5cf-4ea6-bf19-8373baab801a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1000c08-c02e-421c-ad34-a81836d1d053', '6ae239d3-e712-44a4-a4d1-99d8df8a6286') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '6ae239d3-e712-44a4-a4d1-99d8df8a6286') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6ae239d3-e712-44a4-a4d1-99d8df8a6286') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6ae239d3-e712-44a4-a4d1-99d8df8a6286') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('67f9a398-4dd3-4cc5-8e72-8f3f2e65a436', '6ae239d3-e712-44a4-a4d1-99d8df8a6286') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '0c4628be-3745-4c63-aacf-8046ce2bf7d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '0c4628be-3745-4c63-aacf-8046ce2bf7d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0c4628be-3745-4c63-aacf-8046ce2bf7d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', '0c4628be-3745-4c63-aacf-8046ce2bf7d0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b95c5bf2-e75b-4af8-8f09-cf9ea9403c91') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '4f9b1c4d-2f02-43d8-9d8c-b7ecebf423a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '4f9b1c4d-2f02-43d8-9d8c-b7ecebf423a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '4f9b1c4d-2f02-43d8-9d8c-b7ecebf423a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4f9b1c4d-2f02-43d8-9d8c-b7ecebf423a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '2d6b5173-0074-4a29-8b40-b99227344f63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '2d6b5173-0074-4a29-8b40-b99227344f63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2d6b5173-0074-4a29-8b40-b99227344f63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '2d6b5173-0074-4a29-8b40-b99227344f63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', 'd8c815c1-b68f-4675-8ac8-70911ca7963f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'd8c815c1-b68f-4675-8ac8-70911ca7963f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'd8c815c1-b68f-4675-8ac8-70911ca7963f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd8c815c1-b68f-4675-8ac8-70911ca7963f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'd4770261-f9a0-4edb-8c3e-0b7d413484cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'd4770261-f9a0-4edb-8c3e-0b7d413484cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'd4770261-f9a0-4edb-8c3e-0b7d413484cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd4770261-f9a0-4edb-8c3e-0b7d413484cf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'f2392921-48f8-49d7-aea2-fc645e16228d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f2392921-48f8-49d7-aea2-fc645e16228d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'f2392921-48f8-49d7-aea2-fc645e16228d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f2392921-48f8-49d7-aea2-fc645e16228d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '2963e562-891c-456e-a461-d7ea9174febe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2963e562-891c-456e-a461-d7ea9174febe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '2963e562-891c-456e-a461-d7ea9174febe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '8ea18cba-d416-4281-9bc8-af9552a87689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8ea18cba-d416-4281-9bc8-af9552a87689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '8ea18cba-d416-4281-9bc8-af9552a87689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '8ea18cba-d416-4281-9bc8-af9552a87689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'bd086043-40ad-4712-ab61-0b1590be9485') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'bd086043-40ad-4712-ab61-0b1590be9485') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'a833d90f-8823-4a43-adba-0e8cc092a98e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'a833d90f-8823-4a43-adba-0e8cc092a98e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a833d90f-8823-4a43-adba-0e8cc092a98e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'a833d90f-8823-4a43-adba-0e8cc092a98e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', 'b27ab19e-d197-4740-bbb9-e30535e44cac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b27ab19e-d197-4740-bbb9-e30535e44cac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b27ab19e-d197-4740-bbb9-e30535e44cac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1000c08-c02e-421c-ad34-a81836d1d053', '69be0953-8919-475f-a917-0515f261d421') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', '69be0953-8919-475f-a917-0515f261d421') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '69be0953-8919-475f-a917-0515f261d421') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '69be0953-8919-475f-a917-0515f261d421') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '69be0953-8919-475f-a917-0515f261d421') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ad528419-c98a-47f9-b0a2-e72ac372faa2', '1a98a66f-9057-4921-9d40-7c8054b574f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1a98a66f-9057-4921-9d40-7c8054b574f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1a98a66f-9057-4921-9d40-7c8054b574f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1a98a66f-9057-4921-9d40-7c8054b574f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'b88022e2-6c10-4133-92ca-818d25168c34') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b88022e2-6c10-4133-92ca-818d25168c34') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'b88022e2-6c10-4133-92ca-818d25168c34') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '3a43a2a4-1c7d-494a-b579-ec40bd54ae1d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3a43a2a4-1c7d-494a-b579-ec40bd54ae1d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3a43a2a4-1c7d-494a-b579-ec40bd54ae1d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '3a43a2a4-1c7d-494a-b579-ec40bd54ae1d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '590db4c5-efa3-4a2a-a843-d5284b0ae3ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '590db4c5-efa3-4a2a-a843-d5284b0ae3ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '590db4c5-efa3-4a2a-a843-d5284b0ae3ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a14ed6a2-38c9-48d7-9879-fcbda58a1653') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'a14ed6a2-38c9-48d7-9879-fcbda58a1653') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'fc0914c5-38f3-47f9-a0f5-6f356e997d66') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'fc0914c5-38f3-47f9-a0f5-6f356e997d66') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'fc0914c5-38f3-47f9-a0f5-6f356e997d66') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'fc0914c5-38f3-47f9-a0f5-6f356e997d66') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '6347b395-430f-4724-ad78-58551eaca8f3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f21180bf-2ac2-4881-b979-7e4be312a7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f21180bf-2ac2-4881-b979-7e4be312a7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '97654d06-b860-4644-9054-05c09f04f259') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '97654d06-b860-4644-9054-05c09f04f259') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8e7a984a-c091-4ec9-b529-12cab33fa494') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '8e7a984a-c091-4ec9-b529-12cab33fa494') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '8e7a984a-c091-4ec9-b529-12cab33fa494') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('634b4962-9bf6-444e-84c7-5e54d8655ba4', '82c76098-e4f2-489b-b87d-098cbfc92d08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '82c76098-e4f2-489b-b87d-098cbfc92d08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '82c76098-e4f2-489b-b87d-098cbfc92d08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '82c76098-e4f2-489b-b87d-098cbfc92d08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '64d4520d-4d0a-4bed-b9cc-1b3210b1f8bb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '64d4520d-4d0a-4bed-b9cc-1b3210b1f8bb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '6f5a74bd-6f89-47d2-8eb1-3f0c09eb27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '6f5a74bd-6f89-47d2-8eb1-3f0c09eb27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '6f5a74bd-6f89-47d2-8eb1-3f0c09eb27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6f5a74bd-6f89-47d2-8eb1-3f0c09eb27ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '252cac46-b5e5-4917-9737-f8fb468afaa9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '252cac46-b5e5-4917-9737-f8fb468afaa9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '252cac46-b5e5-4917-9737-f8fb468afaa9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '252cac46-b5e5-4917-9737-f8fb468afaa9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '97412c7e-d2e3-4019-b1ef-76b3ebcc4bcf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '97412c7e-d2e3-4019-b1ef-76b3ebcc4bcf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '97412c7e-d2e3-4019-b1ef-76b3ebcc4bcf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '20083dc8-cbe0-45dd-b713-c3a2a63faa94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '20083dc8-cbe0-45dd-b713-c3a2a63faa94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '20083dc8-cbe0-45dd-b713-c3a2a63faa94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '4a8970d4-e043-43ee-b122-79df6d8d0201') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4a8970d4-e043-43ee-b122-79df6d8d0201') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '1b07929e-e312-4a84-a39a-f7fe09639262') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1b07929e-e312-4a84-a39a-f7fe09639262') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1b07929e-e312-4a84-a39a-f7fe09639262') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '35e73f06-3d7e-4f6d-88c6-86ac5c40f64d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '35e73f06-3d7e-4f6d-88c6-86ac5c40f64d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '30713479-8e72-4bba-84b3-6eaa3f7f6008') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('297fd449-1e9a-461b-8014-48f08fb16aa5', '30713479-8e72-4bba-84b3-6eaa3f7f6008') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '30713479-8e72-4bba-84b3-6eaa3f7f6008') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '30713479-8e72-4bba-84b3-6eaa3f7f6008') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '6afb64d9-e319-4e32-95fd-7d8aad4d0af2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('e4ea26ce-1444-41be-9342-f085f615f9a7', '6afb64d9-e319-4e32-95fd-7d8aad4d0af2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6afb64d9-e319-4e32-95fd-7d8aad4d0af2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6afb64d9-e319-4e32-95fd-7d8aad4d0af2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'f56c182b-95f4-47c9-9d59-91e43ebc3c79') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f56c182b-95f4-47c9-9d59-91e43ebc3c79') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f56c182b-95f4-47c9-9d59-91e43ebc3c79') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'f56c182b-95f4-47c9-9d59-91e43ebc3c79') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '6cafa98a-3b08-4460-a21c-cb25b8afa83e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', 'ba099964-2709-4907-9644-4e0d0cd5fd30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ba099964-2709-4907-9644-4e0d0cd5fd30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '77c73388-0ddd-4907-b5b2-a056925e4a8a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '77c73388-0ddd-4907-b5b2-a056925e4a8a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '77c73388-0ddd-4907-b5b2-a056925e4a8a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '977fb50e-bfd6-4fea-8aa7-8c71a7777209') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '977fb50e-bfd6-4fea-8aa7-8c71a7777209') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '60268d7e-5aaa-4553-a5fa-78b198dffc73') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '60268d7e-5aaa-4553-a5fa-78b198dffc73') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '60268d7e-5aaa-4553-a5fa-78b198dffc73') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '59fe27cb-931e-4c46-a272-0a6f6aff113f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('9195072b-0a1b-4915-bd80-10b05ad1bef0', '09584e54-ab26-4984-9c33-42891bf3326e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '09584e54-ab26-4984-9c33-42891bf3326e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '09584e54-ab26-4984-9c33-42891bf3326e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '09584e54-ab26-4984-9c33-42891bf3326e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '09584e54-ab26-4984-9c33-42891bf3326e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e559f504-8b9a-4bba-9823-eba61794b7d5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8918e5df-e641-4ec3-8fa5-0112b15a5857') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '852114f4-a6e2-498e-ba3d-23afaee23052') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd72ab90a-4cc4-437e-a7d9-4ad881ccd042') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd72ab90a-4cc4-437e-a7d9-4ad881ccd042') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'd72ab90a-4cc4-437e-a7d9-4ad881ccd042') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'd72ab90a-4cc4-437e-a7d9-4ad881ccd042') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '9d763d47-1b04-40aa-9330-e55d6afb5640') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '9d763d47-1b04-40aa-9330-e55d6afb5640') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9d763d47-1b04-40aa-9330-e55d6afb5640') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '9d763d47-1b04-40aa-9330-e55d6afb5640') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'ccda223b-81e7-4d9e-96e3-d0031e997b3f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ccda223b-81e7-4d9e-96e3-d0031e997b3f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'ccda223b-81e7-4d9e-96e3-d0031e997b3f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '6332bde1-4212-4958-bf76-fcf8bc3e7892') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6332bde1-4212-4958-bf76-fcf8bc3e7892') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('618cafbb-0d29-4a94-8b0d-14d76e53b51a', '6332bde1-4212-4958-bf76-fcf8bc3e7892') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '6332bde1-4212-4958-bf76-fcf8bc3e7892') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1cec5bce-1a6b-45e2-b5fd-a06beec2261c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1cec5bce-1a6b-45e2-b5fd-a06beec2261c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1cec5bce-1a6b-45e2-b5fd-a06beec2261c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '1cec5bce-1a6b-45e2-b5fd-a06beec2261c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '1cec5bce-1a6b-45e2-b5fd-a06beec2261c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '1cec5bce-1a6b-45e2-b5fd-a06beec2261c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1f61f2ea-7ecc-4779-ab87-f705ecd19e30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '1f61f2ea-7ecc-4779-ab87-f705ecd19e30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1f61f2ea-7ecc-4779-ab87-f705ecd19e30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '1f61f2ea-7ecc-4779-ab87-f705ecd19e30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'af748daa-e6e1-4fe5-805a-6cfb4979f58e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'af748daa-e6e1-4fe5-805a-6cfb4979f58e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', 'af748daa-e6e1-4fe5-805a-6cfb4979f58e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'af748daa-e6e1-4fe5-805a-6cfb4979f58e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('618cafbb-0d29-4a94-8b0d-14d76e53b51a', 'f79d7003-0acb-4289-8b1f-cf6ee3aa81b9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f79d7003-0acb-4289-8b1f-cf6ee3aa81b9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f79d7003-0acb-4289-8b1f-cf6ee3aa81b9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'f79d7003-0acb-4289-8b1f-cf6ee3aa81b9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', 'b493b28b-c86c-4623-ac56-0cc42cda3cd9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b493b28b-c86c-4623-ac56-0cc42cda3cd9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b493b28b-c86c-4623-ac56-0cc42cda3cd9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', 'b493b28b-c86c-4623-ac56-0cc42cda3cd9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'ab164b35-9ec3-4d2b-8007-92081c1f1343') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ab164b35-9ec3-4d2b-8007-92081c1f1343') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'a09e48ca-4bd7-42b5-8921-6f8b9cbe3e05') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a09e48ca-4bd7-42b5-8921-6f8b9cbe3e05') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a09e48ca-4bd7-42b5-8921-6f8b9cbe3e05') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'a09e48ca-4bd7-42b5-8921-6f8b9cbe3e05') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '35cd3be1-3bf2-4205-aca9-616ff954b153') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '35cd3be1-3bf2-4205-aca9-616ff954b153') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '35cd3be1-3bf2-4205-aca9-616ff954b153') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '35cd3be1-3bf2-4205-aca9-616ff954b153') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'dab66b71-5760-42a0-906a-07a1a50d9144') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'dab66b71-5760-42a0-906a-07a1a50d9144') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'dab66b71-5760-42a0-906a-07a1a50d9144') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'dab66b71-5760-42a0-906a-07a1a50d9144') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '2d151ef0-938d-4aeb-8407-f66f3b606aa4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '2d151ef0-938d-4aeb-8407-f66f3b606aa4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2d151ef0-938d-4aeb-8407-f66f3b606aa4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', 'e25ec7c0-2652-4409-ba77-b7d01d976bd1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e25ec7c0-2652-4409-ba77-b7d01d976bd1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'e25ec7c0-2652-4409-ba77-b7d01d976bd1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '86219681-e680-4f36-a7a9-95d281afe244') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '86219681-e680-4f36-a7a9-95d281afe244') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '86219681-e680-4f36-a7a9-95d281afe244') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '86219681-e680-4f36-a7a9-95d281afe244') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '86219681-e680-4f36-a7a9-95d281afe244') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('e4ea26ce-1444-41be-9342-f085f615f9a7', 'c4f8b6ff-eef0-43da-9167-0ceef9720e94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'c4f8b6ff-eef0-43da-9167-0ceef9720e94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c4f8b6ff-eef0-43da-9167-0ceef9720e94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'c4f8b6ff-eef0-43da-9167-0ceef9720e94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'a2e169ec-3450-4c8e-a1be-ad25f04a9fc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'a2e169ec-3450-4c8e-a1be-ad25f04a9fc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'a2e169ec-3450-4c8e-a1be-ad25f04a9fc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5766548c-7b8c-4f51-ac1c-42a3b465613b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '5766548c-7b8c-4f51-ac1c-42a3b465613b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5766548c-7b8c-4f51-ac1c-42a3b465613b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '95b13530-00b8-44d2-a5ec-a4107aa432cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '95b13530-00b8-44d2-a5ec-a4107aa432cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '95b13530-00b8-44d2-a5ec-a4107aa432cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '8c6259cb-9198-42e0-b84c-69ba32830aa6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8c6259cb-9198-42e0-b84c-69ba32830aa6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '8c6259cb-9198-42e0-b84c-69ba32830aa6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '64003b38-b495-4e6f-b5d9-1e97ef6829d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '64003b38-b495-4e6f-b5d9-1e97ef6829d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '64003b38-b495-4e6f-b5d9-1e97ef6829d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '64003b38-b495-4e6f-b5d9-1e97ef6829d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '2dcdd4a8-4c6d-4def-8268-4726be585821') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '2dcdd4a8-4c6d-4def-8268-4726be585821') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '2dcdd4a8-4c6d-4def-8268-4726be585821') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '2dcdd4a8-4c6d-4def-8268-4726be585821') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2dcdd4a8-4c6d-4def-8268-4726be585821') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '98ff28fb-ab4c-4f99-8f7e-10e7d71113ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '98ff28fb-ab4c-4f99-8f7e-10e7d71113ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '98ff28fb-ab4c-4f99-8f7e-10e7d71113ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '98ff28fb-ab4c-4f99-8f7e-10e7d71113ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '063a13a8-0dcd-4d5b-9191-24cd426b17ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '063a13a8-0dcd-4d5b-9191-24cd426b17ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '063a13a8-0dcd-4d5b-9191-24cd426b17ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '03650e7d-8909-4608-b6bf-b29abf62c689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '03650e7d-8909-4608-b6bf-b29abf62c689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '03650e7d-8909-4608-b6bf-b29abf62c689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '03650e7d-8909-4608-b6bf-b29abf62c689') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '38de0f70-3e05-4f81-9e59-69d3fb27b5bc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '38de0f70-3e05-4f81-9e59-69d3fb27b5bc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '38de0f70-3e05-4f81-9e59-69d3fb27b5bc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '38de0f70-3e05-4f81-9e59-69d3fb27b5bc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'a3cc4d9d-e0b4-4d14-80d1-3bf2031e1ccd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a3cc4d9d-e0b4-4d14-80d1-3bf2031e1ccd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'a3cc4d9d-e0b4-4d14-80d1-3bf2031e1ccd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a3cc4d9d-e0b4-4d14-80d1-3bf2031e1ccd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'a3cc4d9d-e0b4-4d14-80d1-3bf2031e1ccd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0ab8dd8e-c49d-4587-a94c-0840547c14f3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '0ab8dd8e-c49d-4587-a94c-0840547c14f3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('618cafbb-0d29-4a94-8b0d-14d76e53b51a', '0ab8dd8e-c49d-4587-a94c-0840547c14f3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '0ab8dd8e-c49d-4587-a94c-0840547c14f3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '906332c9-4835-4e7a-be9f-28e242ab7837') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dcf59820-af9a-4599-9552-0154f35d42d6', '906332c9-4835-4e7a-be9f-28e242ab7837') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '906332c9-4835-4e7a-be9f-28e242ab7837') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '906332c9-4835-4e7a-be9f-28e242ab7837') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '0d63d8d3-774c-4887-abd2-ca62c3c92b7e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '0d63d8d3-774c-4887-abd2-ca62c3c92b7e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0d63d8d3-774c-4887-abd2-ca62c3c92b7e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '5fe7c175-f7c4-461b-bcaa-a79122b26b77') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '5fe7c175-f7c4-461b-bcaa-a79122b26b77') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '5fe7c175-f7c4-461b-bcaa-a79122b26b77') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5fe7c175-f7c4-461b-bcaa-a79122b26b77') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9cb59962-92f5-4eff-a8ed-15a5374489b8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '9cb59962-92f5-4eff-a8ed-15a5374489b8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '9cb59962-92f5-4eff-a8ed-15a5374489b8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '9cb59962-92f5-4eff-a8ed-15a5374489b8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '9cb59962-92f5-4eff-a8ed-15a5374489b8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', '12ee8ced-5fdf-4384-a2c6-b563e7134d60') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a3737b0f-3683-4da7-b553-e23f73edfe3d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a3737b0f-3683-4da7-b553-e23f73edfe3d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '58f5c3d2-c359-4e9f-baf8-fc90963e89bb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '58f5c3d2-c359-4e9f-baf8-fc90963e89bb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '58f5c3d2-c359-4e9f-baf8-fc90963e89bb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'b03c58f2-e195-4d8d-a599-5e0497f2810f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b03c58f2-e195-4d8d-a599-5e0497f2810f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1000c08-c02e-421c-ad34-a81836d1d053', '72edaaad-3206-4ced-b3b9-d935405de7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', '72edaaad-3206-4ced-b3b9-d935405de7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '72edaaad-3206-4ced-b3b9-d935405de7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '72edaaad-3206-4ced-b3b9-d935405de7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'cf38457d-91a5-491b-89e6-d24029a8a6a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'cf38457d-91a5-491b-89e6-d24029a8a6a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '5ee085a9-3861-4f00-9b2a-9644feb13f08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5ee085a9-3861-4f00-9b2a-9644feb13f08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6a5b9d23-5f38-41be-992b-62d613842634') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6a5b9d23-5f38-41be-992b-62d613842634') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '6a5b9d23-5f38-41be-992b-62d613842634') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '70f36e73-251b-445a-9af4-a0a96da80ee4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '49dc7465-7dd5-4f1e-8f52-12a80c3f382c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'c1b69a04-f42b-4162-afbb-6f838065da85') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c1b69a04-f42b-4162-afbb-6f838065da85') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'c1b69a04-f42b-4162-afbb-6f838065da85') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '4986e524-a387-431b-98c5-397a708b3ea1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '4986e524-a387-431b-98c5-397a708b3ea1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4986e524-a387-431b-98c5-397a708b3ea1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '4986e524-a387-431b-98c5-397a708b3ea1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', '14244dab-1757-4dca-a0ad-70ef22f8b0fd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '14244dab-1757-4dca-a0ad-70ef22f8b0fd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '4e10d8e3-829b-48c0-8c9d-8183063d1b82') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4e10d8e3-829b-48c0-8c9d-8183063d1b82') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '4e10d8e3-829b-48c0-8c9d-8183063d1b82') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '4e10d8e3-829b-48c0-8c9d-8183063d1b82') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '717a1103-1d28-4759-aa60-d025edbb96ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '717a1103-1d28-4759-aa60-d025edbb96ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '717a1103-1d28-4759-aa60-d025edbb96ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '717a1103-1d28-4759-aa60-d025edbb96ed') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '0f5d835d-d1ed-465f-8994-4893c8f6aa23') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '0f5d835d-d1ed-465f-8994-4893c8f6aa23') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0f5d835d-d1ed-465f-8994-4893c8f6aa23') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', '0f5d835d-d1ed-465f-8994-4893c8f6aa23') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '77a1edc7-a5d1-4192-9002-c712b24fd445') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5a54dfa0-65b9-4e74-b4b5-8d3ba03c18c4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5a54dfa0-65b9-4e74-b4b5-8d3ba03c18c4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '5a54dfa0-65b9-4e74-b4b5-8d3ba03c18c4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '5a54dfa0-65b9-4e74-b4b5-8d3ba03c18c4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '02ec7c51-3bfd-42ae-ac34-b9bc0fba203c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '02ec7c51-3bfd-42ae-ac34-b9bc0fba203c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'a8c7ed2d-f0d5-4572-a7c4-3c37fea4e6bd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'a8c7ed2d-f0d5-4572-a7c4-3c37fea4e6bd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a8c7ed2d-f0d5-4572-a7c4-3c37fea4e6bd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'a8c7ed2d-f0d5-4572-a7c4-3c37fea4e6bd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'a8c7ed2d-f0d5-4572-a7c4-3c37fea4e6bd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '5a626302-85a7-495f-bd46-872e740bf4bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5a626302-85a7-495f-bd46-872e740bf4bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1000c08-c02e-421c-ad34-a81836d1d053', 'b9203d3a-dd72-4b20-adae-351a1330ee62') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', 'b9203d3a-dd72-4b20-adae-351a1330ee62') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b9203d3a-dd72-4b20-adae-351a1330ee62') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b9203d3a-dd72-4b20-adae-351a1330ee62') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '8eeedfb1-2b0b-4a5b-9bc4-e5036300503f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8eeedfb1-2b0b-4a5b-9bc4-e5036300503f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '2d434677-7947-4868-8795-c1798fa57c26') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '2d434677-7947-4868-8795-c1798fa57c26') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2d434677-7947-4868-8795-c1798fa57c26') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '2d434677-7947-4868-8795-c1798fa57c26') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '87168e5f-903a-403e-a0fa-b101de3f6a30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '87168e5f-903a-403e-a0fa-b101de3f6a30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '87168e5f-903a-403e-a0fa-b101de3f6a30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '7248654e-c897-4cd7-a75d-c6a62d445547') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7248654e-c897-4cd7-a75d-c6a62d445547') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7248654e-c897-4cd7-a75d-c6a62d445547') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '7248654e-c897-4cd7-a75d-c6a62d445547') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '7248654e-c897-4cd7-a75d-c6a62d445547') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'a79d6d94-b4be-4533-b4d0-353884b443a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'a79d6d94-b4be-4533-b4d0-353884b443a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'a79d6d94-b4be-4533-b4d0-353884b443a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'a79d6d94-b4be-4533-b4d0-353884b443a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a79d6d94-b4be-4533-b4d0-353884b443a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '15729dee-2327-4fa7-9c97-3ae0d0181674') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '15729dee-2327-4fa7-9c97-3ae0d0181674') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '15729dee-2327-4fa7-9c97-3ae0d0181674') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '0f136ff2-5ef3-4608-9825-d2455e90991d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0f136ff2-5ef3-4608-9825-d2455e90991d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '500f3a05-d88b-450f-895a-03f16371b0c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '500f3a05-d88b-450f-895a-03f16371b0c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '5ef447dc-74b7-4a11-8102-55157e99ccd7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5ef447dc-74b7-4a11-8102-55157e99ccd7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '2413469c-1902-49cf-b9dc-a055d2b21bd1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '2413469c-1902-49cf-b9dc-a055d2b21bd1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2413469c-1902-49cf-b9dc-a055d2b21bd1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '2413469c-1902-49cf-b9dc-a055d2b21bd1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3b4f091f-820a-4602-8c25-ba7ac02d0e8e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3b4f091f-820a-4602-8c25-ba7ac02d0e8e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1de638bd-2c03-4085-9a80-48bc2d53aeae') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1de638bd-2c03-4085-9a80-48bc2d53aeae') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1de638bd-2c03-4085-9a80-48bc2d53aeae') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '1de638bd-2c03-4085-9a80-48bc2d53aeae') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '1f15dbd6-fafe-4a25-bbde-26b05ba5ab64') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '1f15dbd6-fafe-4a25-bbde-26b05ba5ab64') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1f15dbd6-fafe-4a25-bbde-26b05ba5ab64') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1bb913cc-4e88-44f9-970b-8ac7822d330d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0a4fcbfb-2113-46ad-a79b-2fe4641eda6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '0a4fcbfb-2113-46ad-a79b-2fe4641eda6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '0a4fcbfb-2113-46ad-a79b-2fe4641eda6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '0a4fcbfb-2113-46ad-a79b-2fe4641eda6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'd1dd90f4-0e5b-427b-8bf5-d50db9159482') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'd1dd90f4-0e5b-427b-8bf5-d50db9159482') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd1dd90f4-0e5b-427b-8bf5-d50db9159482') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd1dd90f4-0e5b-427b-8bf5-d50db9159482') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'db0db8b5-9414-4577-952b-43776ca28368') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'd40a2f07-9dfb-48e4-ad34-f6ffb8cb4287') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'd40a2f07-9dfb-48e4-ad34-f6ffb8cb4287') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'd40a2f07-9dfb-48e4-ad34-f6ffb8cb4287') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '02dd47a8-9754-4c9e-9421-832f4d5f44c2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '02dd47a8-9754-4c9e-9421-832f4d5f44c2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '02dd47a8-9754-4c9e-9421-832f4d5f44c2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', '02dd47a8-9754-4c9e-9421-832f4d5f44c2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'aef74eca-0898-46f5-a5b1-632cae970d7d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '2d05b5c0-f7e5-4a56-ba3c-6f946c806616') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '2d05b5c0-f7e5-4a56-ba3c-6f946c806616') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '2d05b5c0-f7e5-4a56-ba3c-6f946c806616') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8328f618-7188-41e6-ba9b-40da53ecad27') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7b806197-85dc-40d8-b38f-4e6bf1ec5ae0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7b806197-85dc-40d8-b38f-4e6bf1ec5ae0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '7b806197-85dc-40d8-b38f-4e6bf1ec5ae0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'a3057c60-14c0-4414-809e-d974c4e3b8a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'a3057c60-14c0-4414-809e-d974c4e3b8a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a3057c60-14c0-4414-809e-d974c4e3b8a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('9195072b-0a1b-4915-bd80-10b05ad1bef0', '98caf9dd-d89b-410a-ab52-0627d139ddf8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '98caf9dd-d89b-410a-ab52-0627d139ddf8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '98caf9dd-d89b-410a-ab52-0627d139ddf8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '98caf9dd-d89b-410a-ab52-0627d139ddf8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ad528419-c98a-47f9-b0a2-e72ac372faa2', '937fb8db-9d3c-4cef-81b0-2df0be46824b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '937fb8db-9d3c-4cef-81b0-2df0be46824b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ad528419-c98a-47f9-b0a2-e72ac372faa2', '9b8a96b2-a0c7-4ec9-b985-1d84321f26c5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9b8a96b2-a0c7-4ec9-b985-1d84321f26c5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '9b8a96b2-a0c7-4ec9-b985-1d84321f26c5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '1acca48a-ed55-4656-afa5-edae4bf70c2e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '1acca48a-ed55-4656-afa5-edae4bf70c2e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1acca48a-ed55-4656-afa5-edae4bf70c2e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6947079a-1d22-466d-a095-a3da8747f6c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '4ad8385f-b5f9-4837-8e3c-382975aa5bc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4ad8385f-b5f9-4837-8e3c-382975aa5bc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '4ad8385f-b5f9-4837-8e3c-382975aa5bc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f75db770-a6ac-4533-955e-29b832f1a03d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'f75db770-a6ac-4533-955e-29b832f1a03d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f75db770-a6ac-4533-955e-29b832f1a03d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'f75db770-a6ac-4533-955e-29b832f1a03d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '90e770a8-f127-4a0f-9372-4b2152306726') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', '90e770a8-f127-4a0f-9372-4b2152306726') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '90e770a8-f127-4a0f-9372-4b2152306726') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '90e770a8-f127-4a0f-9372-4b2152306726') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '90e770a8-f127-4a0f-9372-4b2152306726') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'd4992212-45be-440c-940d-bbf49328a670') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'd4992212-45be-440c-940d-bbf49328a670') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'd4992212-45be-440c-940d-bbf49328a670') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd4992212-45be-440c-940d-bbf49328a670') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'd4992212-45be-440c-940d-bbf49328a670') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '12b88afc-2652-4366-b8bd-b6bc165858c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '12b88afc-2652-4366-b8bd-b6bc165858c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '12b88afc-2652-4366-b8bd-b6bc165858c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '12b88afc-2652-4366-b8bd-b6bc165858c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '12b88afc-2652-4366-b8bd-b6bc165858c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('9195072b-0a1b-4915-bd80-10b05ad1bef0', '14f63889-eced-4f22-a677-0a5976e574e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '14f63889-eced-4f22-a677-0a5976e574e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '14f63889-eced-4f22-a677-0a5976e574e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '57639e08-48ea-474b-99dd-387d34520dcb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '57639e08-48ea-474b-99dd-387d34520dcb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '57639e08-48ea-474b-99dd-387d34520dcb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '99e28aba-91f1-4b15-ae03-149e33009e79') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'bf9a3e7a-4aa0-4539-8ffd-430e57a5c89c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', 'bf9a3e7a-4aa0-4539-8ffd-430e57a5c89c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '60af3c04-3c66-4524-ad49-611d9cae89f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '60af3c04-3c66-4524-ad49-611d9cae89f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '60af3c04-3c66-4524-ad49-611d9cae89f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '60af3c04-3c66-4524-ad49-611d9cae89f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '06854eca-e16c-4cad-b936-3701870f1706') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '06854eca-e16c-4cad-b936-3701870f1706') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '06854eca-e16c-4cad-b936-3701870f1706') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '6dcc6c21-b647-4fa0-be32-e911c274ad63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '6dcc6c21-b647-4fa0-be32-e911c274ad63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '6dcc6c21-b647-4fa0-be32-e911c274ad63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6dcc6c21-b647-4fa0-be32-e911c274ad63') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'b1405c53-a14e-45f1-8916-e511f6f81b7b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b1405c53-a14e-45f1-8916-e511f6f81b7b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b1405c53-a14e-45f1-8916-e511f6f81b7b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', 'b1405c53-a14e-45f1-8916-e511f6f81b7b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '8eba8f4c-5e07-4908-8c15-27bbe338b2ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '8eba8f4c-5e07-4908-8c15-27bbe338b2ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '8eba8f4c-5e07-4908-8c15-27bbe338b2ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8eba8f4c-5e07-4908-8c15-27bbe338b2ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '8eba8f4c-5e07-4908-8c15-27bbe338b2ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '8eba8f4c-5e07-4908-8c15-27bbe338b2ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '9e241979-b013-4774-b21b-b8ecfe153981') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '9e241979-b013-4774-b21b-b8ecfe153981') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '9e241979-b013-4774-b21b-b8ecfe153981') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9e241979-b013-4774-b21b-b8ecfe153981') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', 'c945dc51-b468-4293-a6f7-cc487a67c7ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'c945dc51-b468-4293-a6f7-cc487a67c7ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c945dc51-b468-4293-a6f7-cc487a67c7ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'c945dc51-b468-4293-a6f7-cc487a67c7ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('67f9a398-4dd3-4cc5-8e72-8f3f2e65a436', '051d0aad-50d8-4ce2-a9af-67c53119a85a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('9195072b-0a1b-4915-bd80-10b05ad1bef0', '9da950b0-221a-46ef-bdac-5c938c6e6e69') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '9da950b0-221a-46ef-bdac-5c938c6e6e69') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ad528419-c98a-47f9-b0a2-e72ac372faa2', '9da950b0-221a-46ef-bdac-5c938c6e6e69') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '9da950b0-221a-46ef-bdac-5c938c6e6e69') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9da950b0-221a-46ef-bdac-5c938c6e6e69') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '9da950b0-221a-46ef-bdac-5c938c6e6e69') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd81599b5-0b57-4328-9140-2887c76fd6dc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6a12546b-afcb-4c0e-9c94-4dc4846c86b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6a12546b-afcb-4c0e-9c94-4dc4846c86b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('67f9a398-4dd3-4cc5-8e72-8f3f2e65a436', '6a12546b-afcb-4c0e-9c94-4dc4846c86b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '6a12546b-afcb-4c0e-9c94-4dc4846c86b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '6a12546b-afcb-4c0e-9c94-4dc4846c86b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '04eb0410-6ab0-4795-be9c-163606fc8e25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '04eb0410-6ab0-4795-be9c-163606fc8e25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '04eb0410-6ab0-4795-be9c-163606fc8e25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '04eb0410-6ab0-4795-be9c-163606fc8e25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '04eb0410-6ab0-4795-be9c-163606fc8e25') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '91c13e24-d069-45d8-8780-420224dc2b44') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '91c13e24-d069-45d8-8780-420224dc2b44') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', '91c13e24-d069-45d8-8780-420224dc2b44') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '91c13e24-d069-45d8-8780-420224dc2b44') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'acdf7039-28fc-478d-85ad-bb02cf504817') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'acdf7039-28fc-478d-85ad-bb02cf504817') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '36d7b641-5f85-48ad-87d2-8c464dde5151') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '36d7b641-5f85-48ad-87d2-8c464dde5151') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '36d7b641-5f85-48ad-87d2-8c464dde5151') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('297fd449-1e9a-461b-8014-48f08fb16aa5', 'bab7c81b-7564-4b01-a9a3-2e68f78c4e02') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'bab7c81b-7564-4b01-a9a3-2e68f78c4e02') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'bab7c81b-7564-4b01-a9a3-2e68f78c4e02') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'bab7c81b-7564-4b01-a9a3-2e68f78c4e02') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '09af5ded-dbb8-4581-a283-ac51dbdd67a7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '09af5ded-dbb8-4581-a283-ac51dbdd67a7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '09af5ded-dbb8-4581-a283-ac51dbdd67a7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '09af5ded-dbb8-4581-a283-ac51dbdd67a7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '418a1f09-32a5-4671-be7b-b4df8debf47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '418a1f09-32a5-4671-be7b-b4df8debf47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '418a1f09-32a5-4671-be7b-b4df8debf47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '418a1f09-32a5-4671-be7b-b4df8debf47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('9195072b-0a1b-4915-bd80-10b05ad1bef0', '06bd0a64-02d4-4bde-9838-0423566f1399') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '06bd0a64-02d4-4bde-9838-0423566f1399') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '06bd0a64-02d4-4bde-9838-0423566f1399') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '06bd0a64-02d4-4bde-9838-0423566f1399') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'e1911d6a-2107-4784-9c04-ead572fd90ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e1911d6a-2107-4784-9c04-ead572fd90ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'e1911d6a-2107-4784-9c04-ead572fd90ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'e1911d6a-2107-4784-9c04-ead572fd90ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'e1911d6a-2107-4784-9c04-ead572fd90ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'b8fe43d1-1869-4637-b020-b784f42ca405') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b8fe43d1-1869-4637-b020-b784f42ca405') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'b8fe43d1-1869-4637-b020-b784f42ca405') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '3bffe299-9656-4e6f-a40d-7894b3f21e78') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '3bffe299-9656-4e6f-a40d-7894b3f21e78') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3bffe299-9656-4e6f-a40d-7894b3f21e78') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3bffe299-9656-4e6f-a40d-7894b3f21e78') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'ef484a82-089f-487d-aec3-fb1e01f1f5b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ef484a82-089f-487d-aec3-fb1e01f1f5b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'ef484a82-089f-487d-aec3-fb1e01f1f5b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'ef484a82-089f-487d-aec3-fb1e01f1f5b0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6cf1f413-f32d-409a-8f41-204625f4c1fb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6cf1f413-f32d-409a-8f41-204625f4c1fb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6cf1f413-f32d-409a-8f41-204625f4c1fb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1b32e0d8-bb7e-4494-89a6-ae0cf53fe346') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1b32e0d8-bb7e-4494-89a6-ae0cf53fe346') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1b32e0d8-bb7e-4494-89a6-ae0cf53fe346') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '3aa95840-5bd8-4545-aa03-1ed54da61a8e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'bbea8456-45b5-41fe-af35-2c0c8aa405eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('634b4962-9bf6-444e-84c7-5e54d8655ba4', 'bbea8456-45b5-41fe-af35-2c0c8aa405eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'bbea8456-45b5-41fe-af35-2c0c8aa405eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'bbea8456-45b5-41fe-af35-2c0c8aa405eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'bbea8456-45b5-41fe-af35-2c0c8aa405eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '63da9b45-373a-446e-a095-b72849b28553') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '63da9b45-373a-446e-a095-b72849b28553') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '63da9b45-373a-446e-a095-b72849b28553') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '63da9b45-373a-446e-a095-b72849b28553') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '63da9b45-373a-446e-a095-b72849b28553') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6fafab70-19a6-411c-9a37-cdd8ba4696f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '6fafab70-19a6-411c-9a37-cdd8ba4696f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '6fafab70-19a6-411c-9a37-cdd8ba4696f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6fafab70-19a6-411c-9a37-cdd8ba4696f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '6fafab70-19a6-411c-9a37-cdd8ba4696f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '07e301ff-6110-4fee-bb2d-41d37fa61486') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '07e301ff-6110-4fee-bb2d-41d37fa61486') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2aa0afbf-d52b-4284-ab74-3aaf04c59d11') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '91298d67-b518-46d3-af6d-eba7e6eac29a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '91298d67-b518-46d3-af6d-eba7e6eac29a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '91298d67-b518-46d3-af6d-eba7e6eac29a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '91298d67-b518-46d3-af6d-eba7e6eac29a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', 'de695076-5285-4564-8647-64a51615cef3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'de695076-5285-4564-8647-64a51615cef3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'de695076-5285-4564-8647-64a51615cef3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '42c287d3-d5ec-4cda-be72-2163c028677b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '42c287d3-d5ec-4cda-be72-2163c028677b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '351ba11c-93f5-488a-9e68-1525822ebb84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '351ba11c-93f5-488a-9e68-1525822ebb84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '351ba11c-93f5-488a-9e68-1525822ebb84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '351ba11c-93f5-488a-9e68-1525822ebb84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '20824280-fdfe-4d43-935c-0a935f83623b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '20824280-fdfe-4d43-935c-0a935f83623b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'c39b9851-001c-48af-a23b-ad372c5f0a07') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c39b9851-001c-48af-a23b-ad372c5f0a07') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '6095149b-b59f-4f00-8642-9f3b79abf6cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '6095149b-b59f-4f00-8642-9f3b79abf6cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6095149b-b59f-4f00-8642-9f3b79abf6cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6095149b-b59f-4f00-8642-9f3b79abf6cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6095149b-b59f-4f00-8642-9f3b79abf6cc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '301554cd-99ea-48ff-a037-5b2f77f59e3a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '301554cd-99ea-48ff-a037-5b2f77f59e3a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '65d9d5ce-e0d2-4295-82a4-25fb6aa85210') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '65d9d5ce-e0d2-4295-82a4-25fb6aa85210') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '65d9d5ce-e0d2-4295-82a4-25fb6aa85210') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '76a8df2c-b7a3-44fc-a5b1-592966620239') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '76a8df2c-b7a3-44fc-a5b1-592966620239') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '76a8df2c-b7a3-44fc-a5b1-592966620239') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '76a8df2c-b7a3-44fc-a5b1-592966620239') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', 'e356fa30-cfca-4696-b3ac-290e6ab461ab') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e356fa30-cfca-4696-b3ac-290e6ab461ab') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'e356fa30-cfca-4696-b3ac-290e6ab461ab') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'e356fa30-cfca-4696-b3ac-290e6ab461ab') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '5d5f7ac0-e299-4515-aaf4-12734d70f8a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '5d5f7ac0-e299-4515-aaf4-12734d70f8a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5d5f7ac0-e299-4515-aaf4-12734d70f8a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '5d5f7ac0-e299-4515-aaf4-12734d70f8a5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '33858a2c-3622-4012-b5fc-b6ea33c2d3ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '33858a2c-3622-4012-b5fc-b6ea33c2d3ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '33858a2c-3622-4012-b5fc-b6ea33c2d3ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '33858a2c-3622-4012-b5fc-b6ea33c2d3ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('67f9a398-4dd3-4cc5-8e72-8f3f2e65a436', '21600875-b129-4878-bed0-84f111c863a0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '5f6b1961-350f-4c05-aa79-29139c8d1b30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '5f6b1961-350f-4c05-aa79-29139c8d1b30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5f6b1961-350f-4c05-aa79-29139c8d1b30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '5f6b1961-350f-4c05-aa79-29139c8d1b30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'cfd7545f-6323-4ac1-a7af-0aede709b7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'cfd7545f-6323-4ac1-a7af-0aede709b7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'cfd7545f-6323-4ac1-a7af-0aede709b7b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'a3555d95-e1bb-4637-9cf7-1d552e6ef3e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a3555d95-e1bb-4637-9cf7-1d552e6ef3e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'a3555d95-e1bb-4637-9cf7-1d552e6ef3e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a3555d95-e1bb-4637-9cf7-1d552e6ef3e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'a3555d95-e1bb-4637-9cf7-1d552e6ef3e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '912fde04-b7ca-4125-961a-96e3a551c87e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '912fde04-b7ca-4125-961a-96e3a551c87e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '912fde04-b7ca-4125-961a-96e3a551c87e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '912fde04-b7ca-4125-961a-96e3a551c87e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', 'db57f61c-cf27-4dce-9a36-6f577adb6e8d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'db57f61c-cf27-4dce-9a36-6f577adb6e8d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'db57f61c-cf27-4dce-9a36-6f577adb6e8d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '5a5829ae-6899-4ca3-b974-405cd8639675') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5a5829ae-6899-4ca3-b974-405cd8639675') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5a5829ae-6899-4ca3-b974-405cd8639675') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '0fd953c4-3658-48a5-9e65-a27279faec66') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '113b7f7a-e7e7-46b9-9f52-ec75c68492db') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '113b7f7a-e7e7-46b9-9f52-ec75c68492db') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '113b7f7a-e7e7-46b9-9f52-ec75c68492db') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '83985f5f-1dff-4692-90aa-50472fa4b9b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '83985f5f-1dff-4692-90aa-50472fa4b9b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '83985f5f-1dff-4692-90aa-50472fa4b9b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'a9b7483b-c163-483d-8922-1402f65b5889') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a9b7483b-c163-483d-8922-1402f65b5889') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'a9b7483b-c163-483d-8922-1402f65b5889') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a9b7483b-c163-483d-8922-1402f65b5889') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', 'aa447f7f-549f-40fe-989a-3619945c1b65') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6bdecd9e-b28f-433c-9644-f7da9fe2289c', 'aa447f7f-549f-40fe-989a-3619945c1b65') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'aa447f7f-549f-40fe-989a-3619945c1b65') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '5da4c77a-febd-43d7-bbc5-270d8a3561a9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5da4c77a-febd-43d7-bbc5-270d8a3561a9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5da4c77a-febd-43d7-bbc5-270d8a3561a9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '5da4c77a-febd-43d7-bbc5-270d8a3561a9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '9f69b94a-18b9-470c-a6e2-1f8732f6671c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9f69b94a-18b9-470c-a6e2-1f8732f6671c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '9f69b94a-18b9-470c-a6e2-1f8732f6671c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '9f69b94a-18b9-470c-a6e2-1f8732f6671c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6be637bd-180d-44ea-be6e-3fe635af7f4a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6be637bd-180d-44ea-be6e-3fe635af7f4a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'd546d680-e6a3-4f06-aa9b-e6f9e9dbd8c3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd546d680-e6a3-4f06-aa9b-e6f9e9dbd8c3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ebd75475-11e9-4077-b4cc-9591ef458754') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '7f22bdd2-df9a-4c9a-82e6-ee4b2d602783') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '7f22bdd2-df9a-4c9a-82e6-ee4b2d602783') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7f22bdd2-df9a-4c9a-82e6-ee4b2d602783') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7f22bdd2-df9a-4c9a-82e6-ee4b2d602783') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '7f22bdd2-df9a-4c9a-82e6-ee4b2d602783') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd6e7de62-50c2-4329-812a-af5203622951') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd6e7de62-50c2-4329-812a-af5203622951') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'd6e7de62-50c2-4329-812a-af5203622951') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'd6e7de62-50c2-4329-812a-af5203622951') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'd6e7de62-50c2-4329-812a-af5203622951') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'cfce96fc-118b-46db-89f1-5c4d7593a499') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'cfce96fc-118b-46db-89f1-5c4d7593a499') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'cfce96fc-118b-46db-89f1-5c4d7593a499') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'cedf33a6-46bc-402b-b498-988c71fb5fd4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'dc4bec06-5410-4827-9603-801ed6e5efb6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'dc4bec06-5410-4827-9603-801ed6e5efb6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'dc4bec06-5410-4827-9603-801ed6e5efb6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'dc4bec06-5410-4827-9603-801ed6e5efb6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'dc4bec06-5410-4827-9603-801ed6e5efb6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '7e496706-f397-4c65-a156-c7c9edf5cb15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7e496706-f397-4c65-a156-c7c9edf5cb15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7e496706-f397-4c65-a156-c7c9edf5cb15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '7e496706-f397-4c65-a156-c7c9edf5cb15') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '437f119f-49ab-4fb7-8661-318ba88e8a33') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '437f119f-49ab-4fb7-8661-318ba88e8a33') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '437f119f-49ab-4fb7-8661-318ba88e8a33') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '437f119f-49ab-4fb7-8661-318ba88e8a33') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e7ef4e42-b347-4244-8add-2d124d74e76d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '11580607-285f-448f-895d-85eee2eeda17') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '11580607-285f-448f-895d-85eee2eeda17') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '11580607-285f-448f-895d-85eee2eeda17') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '11580607-285f-448f-895d-85eee2eeda17') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'a7145bf5-5609-41af-84ef-1a88d0987326') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '628faa74-5251-481a-8c71-6c7784525c31') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '628faa74-5251-481a-8c71-6c7784525c31') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '628faa74-5251-481a-8c71-6c7784525c31') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '628faa74-5251-481a-8c71-6c7784525c31') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'aae74af5-e58c-435c-8d85-2d32c24a7ddb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'aae74af5-e58c-435c-8d85-2d32c24a7ddb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'aae74af5-e58c-435c-8d85-2d32c24a7ddb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '8c5ae4c5-bd87-47a3-ba85-6fe0c4231bd6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '8c5ae4c5-bd87-47a3-ba85-6fe0c4231bd6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '8c5ae4c5-bd87-47a3-ba85-6fe0c4231bd6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8c5ae4c5-bd87-47a3-ba85-6fe0c4231bd6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'b21fcf9a-1969-498a-a47e-53e7cf06ce7d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'b21fcf9a-1969-498a-a47e-53e7cf06ce7d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '1407cf7f-5299-4a2f-82b8-a50e5c1df406') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '1407cf7f-5299-4a2f-82b8-a50e5c1df406') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '1407cf7f-5299-4a2f-82b8-a50e5c1df406') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '63ba4f64-1bab-4d53-97a4-58cb4223678e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '63ba4f64-1bab-4d53-97a4-58cb4223678e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '63ba4f64-1bab-4d53-97a4-58cb4223678e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '63ba4f64-1bab-4d53-97a4-58cb4223678e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '63ba4f64-1bab-4d53-97a4-58cb4223678e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', 'f72f69e9-b9e4-4e70-abe3-d92499451323') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '141c5e8c-8b23-4db6-b3fe-b3bfa86e1d1b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '141c5e8c-8b23-4db6-b3fe-b3bfa86e1d1b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'ee3f8fc7-f7ad-41a6-968d-34a19357da47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ee3f8fc7-f7ad-41a6-968d-34a19357da47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'ee3f8fc7-f7ad-41a6-968d-34a19357da47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'ee3f8fc7-f7ad-41a6-968d-34a19357da47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '526687f9-0c1e-4494-a15c-052bcad744a9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '526687f9-0c1e-4494-a15c-052bcad744a9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '526687f9-0c1e-4494-a15c-052bcad744a9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '37f90c6b-c8f1-41a2-9d45-ccfca86132f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '37f90c6b-c8f1-41a2-9d45-ccfca86132f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '37f90c6b-c8f1-41a2-9d45-ccfca86132f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '37f90c6b-c8f1-41a2-9d45-ccfca86132f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '37f90c6b-c8f1-41a2-9d45-ccfca86132f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '23493bea-c053-470b-abe3-bf0b3f0336d6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '23493bea-c053-470b-abe3-bf0b3f0336d6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '97169846-8eea-485b-bd67-c01c3375cfbc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '97169846-8eea-485b-bd67-c01c3375cfbc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '9c29e773-7213-43a2-b49b-f08f1f7b1605') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9c29e773-7213-43a2-b49b-f08f1f7b1605') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '10fd121e-679b-4dbc-9493-be7b01532cd8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '10fd121e-679b-4dbc-9493-be7b01532cd8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '10fd121e-679b-4dbc-9493-be7b01532cd8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '10fd121e-679b-4dbc-9493-be7b01532cd8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '6b759b65-9244-47dd-9e48-2f8696c4df35') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', '6b759b65-9244-47dd-9e48-2f8696c4df35') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '6b759b65-9244-47dd-9e48-2f8696c4df35') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6b759b65-9244-47dd-9e48-2f8696c4df35') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f4981899-fa3c-400d-ab75-bd290a585bf9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f4981899-fa3c-400d-ab75-bd290a585bf9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '46f49b5e-b5eb-4efc-b861-4367d125fae6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '46f49b5e-b5eb-4efc-b861-4367d125fae6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '46f49b5e-b5eb-4efc-b861-4367d125fae6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '46f49b5e-b5eb-4efc-b861-4367d125fae6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6bdecd9e-b28f-433c-9644-f7da9fe2289c', 'e3bbd599-240c-4de2-a374-efe1e2651b01') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('618cafbb-0d29-4a94-8b0d-14d76e53b51a', '5b762b9d-5adb-4394-9399-6232667536e3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5b762b9d-5adb-4394-9399-6232667536e3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '89300221-e78e-42d5-93d4-4e91add9e857') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '89300221-e78e-42d5-93d4-4e91add9e857') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '89300221-e78e-42d5-93d4-4e91add9e857') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '89300221-e78e-42d5-93d4-4e91add9e857') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '3d03364f-32e7-45c3-aa2c-84d533ce0fdb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '3d03364f-32e7-45c3-aa2c-84d533ce0fdb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3d03364f-32e7-45c3-aa2c-84d533ce0fdb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3d03364f-32e7-45c3-aa2c-84d533ce0fdb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '4e1fc549-f081-45c3-aaaf-089d09fb4c95') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', '4e1fc549-f081-45c3-aaaf-089d09fb4c95') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '4e1fc549-f081-45c3-aaaf-089d09fb4c95') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '4e1fc549-f081-45c3-aaaf-089d09fb4c95') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '4e1fc549-f081-45c3-aaaf-089d09fb4c95') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '5d869f76-26c2-46cc-80bc-efe046961bc7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5d869f76-26c2-46cc-80bc-efe046961bc7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5d869f76-26c2-46cc-80bc-efe046961bc7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '5d869f76-26c2-46cc-80bc-efe046961bc7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '5d869f76-26c2-46cc-80bc-efe046961bc7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '0a1fdc09-8e2c-4a7e-82fc-4b7ad7d5bdc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0a1fdc09-8e2c-4a7e-82fc-4b7ad7d5bdc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '0a1fdc09-8e2c-4a7e-82fc-4b7ad7d5bdc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '0a1fdc09-8e2c-4a7e-82fc-4b7ad7d5bdc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '0a1fdc09-8e2c-4a7e-82fc-4b7ad7d5bdc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '6fa06ea9-3fba-4282-8533-15317d7899e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '6fa06ea9-3fba-4282-8533-15317d7899e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '6fa06ea9-3fba-4282-8533-15317d7899e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', '6fa06ea9-3fba-4282-8533-15317d7899e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '276701aa-e4c1-44a0-a835-6aea3de7204b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '276701aa-e4c1-44a0-a835-6aea3de7204b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '43b3e89e-4734-4574-bfeb-e2c54d035061') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '43b3e89e-4734-4574-bfeb-e2c54d035061') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '43b3e89e-4734-4574-bfeb-e2c54d035061') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '43b3e89e-4734-4574-bfeb-e2c54d035061') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '057a319b-0df3-4bca-8386-065995857228') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '057a319b-0df3-4bca-8386-065995857228') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '057a319b-0df3-4bca-8386-065995857228') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '057a319b-0df3-4bca-8386-065995857228') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', 'd74001dc-be13-42d5-9eff-2e0777ac10d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6bdecd9e-b28f-433c-9644-f7da9fe2289c', 'd74001dc-be13-42d5-9eff-2e0777ac10d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', 'd74001dc-be13-42d5-9eff-2e0777ac10d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd74001dc-be13-42d5-9eff-2e0777ac10d7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '7acdea33-4023-451d-8b57-4fa3a44f1276') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7acdea33-4023-451d-8b57-4fa3a44f1276') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '23b94894-12fd-4c60-8c22-8b57c28c027b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '23b94894-12fd-4c60-8c22-8b57c28c027b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '23b94894-12fd-4c60-8c22-8b57c28c027b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'fbf36867-482a-40a1-a7d8-1b31f2087895') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'fbf36867-482a-40a1-a7d8-1b31f2087895') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6b555915-75f5-400a-91b0-d2b4187b5b2a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '6b555915-75f5-400a-91b0-d2b4187b5b2a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6b555915-75f5-400a-91b0-d2b4187b5b2a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '79de7c55-4843-49c8-8bcb-cec8be9b9427') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '29abd3d1-49b7-407c-bea4-bfcf39f044ac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '99775359-37b6-45fa-b55a-ecc4da6990d9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '99775359-37b6-45fa-b55a-ecc4da6990d9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '99775359-37b6-45fa-b55a-ecc4da6990d9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4c2e42dc-3d55-425e-b719-cc791335a0eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '2aad44f7-6baf-4eef-b7a9-6b342362a3b4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '2aad44f7-6baf-4eef-b7a9-6b342362a3b4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2aad44f7-6baf-4eef-b7a9-6b342362a3b4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '25cd5652-e169-4c72-b84c-43427caa536a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '25cd5652-e169-4c72-b84c-43427caa536a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '25cd5652-e169-4c72-b84c-43427caa536a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '25cd5652-e169-4c72-b84c-43427caa536a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '499727df-68a8-4179-875c-b5fea3dcdf9c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '1860790d-35fe-436d-af6b-728926f46234') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1860790d-35fe-436d-af6b-728926f46234') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1860790d-35fe-436d-af6b-728926f46234') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '743e6dc0-58fc-4c3e-a23c-a313fce44173') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c412fdfb-95bf-4a02-b2c7-ee99cd38fdac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '6f68a592-9bae-48d9-898f-b0f166ce8e86') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6f68a592-9bae-48d9-898f-b0f166ce8e86') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6f68a592-9bae-48d9-898f-b0f166ce8e86') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', '625e9786-84b5-425b-abe7-19e63e0facf1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '625e9786-84b5-425b-abe7-19e63e0facf1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '625e9786-84b5-425b-abe7-19e63e0facf1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '625e9786-84b5-425b-abe7-19e63e0facf1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '256e5f58-5001-4295-a650-eebc3e1f8ee8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', '256e5f58-5001-4295-a650-eebc3e1f8ee8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '256e5f58-5001-4295-a650-eebc3e1f8ee8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '256e5f58-5001-4295-a650-eebc3e1f8ee8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '82e16fab-095d-4a2b-8cc1-a5847226ad46') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', '57116326-0a8c-4880-8629-6fde4217477b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('618cafbb-0d29-4a94-8b0d-14d76e53b51a', '57116326-0a8c-4880-8629-6fde4217477b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '57116326-0a8c-4880-8629-6fde4217477b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '57116326-0a8c-4880-8629-6fde4217477b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b0e9906c-2a32-4da9-8d24-971e32e04842') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b0e9906c-2a32-4da9-8d24-971e32e04842') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '6e500d95-8144-4b7a-93fc-55570db3990e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6e500d95-8144-4b7a-93fc-55570db3990e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6e500d95-8144-4b7a-93fc-55570db3990e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '6e500d95-8144-4b7a-93fc-55570db3990e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '865b39d3-10af-41ad-85b1-9136c5e89cd6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '94f18e08-d7c2-4940-b6f4-ec5200c8ab57') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '94f18e08-d7c2-4940-b6f4-ec5200c8ab57') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '6b51a14a-09ff-4799-8e0c-859d3b48ed1c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '6b51a14a-09ff-4799-8e0c-859d3b48ed1c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '6b51a14a-09ff-4799-8e0c-859d3b48ed1c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6b51a14a-09ff-4799-8e0c-859d3b48ed1c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '19c83f75-e5a6-425f-a9a0-36fe4ff4d850') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '19c83f75-e5a6-425f-a9a0-36fe4ff4d850') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '19c83f75-e5a6-425f-a9a0-36fe4ff4d850') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '19c83f75-e5a6-425f-a9a0-36fe4ff4d850') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', 'c7a84a30-f032-4cb8-bb7d-0adb2e900cc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c7a84a30-f032-4cb8-bb7d-0adb2e900cc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'c7a84a30-f032-4cb8-bb7d-0adb2e900cc9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '5723b66f-014d-4f37-a5da-66fcd036bb8d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5723b66f-014d-4f37-a5da-66fcd036bb8d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('e4ea26ce-1444-41be-9342-f085f615f9a7', '9b568029-5b03-4e45-860e-854f382cdcc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '9b568029-5b03-4e45-860e-854f382cdcc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '9b568029-5b03-4e45-860e-854f382cdcc3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'bc07acdd-a9da-4d14-9a53-910df7364b9f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'bc07acdd-a9da-4d14-9a53-910df7364b9f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'bc07acdd-a9da-4d14-9a53-910df7364b9f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '28cad9f5-b82b-4c6e-b5b5-136ef8a31b3e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '28cad9f5-b82b-4c6e-b5b5-136ef8a31b3e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '28cad9f5-b82b-4c6e-b5b5-136ef8a31b3e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '59e489cb-20a3-4f23-9116-ba31e4a2a06a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '59e489cb-20a3-4f23-9116-ba31e4a2a06a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '59e489cb-20a3-4f23-9116-ba31e4a2a06a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '59e489cb-20a3-4f23-9116-ba31e4a2a06a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '59e489cb-20a3-4f23-9116-ba31e4a2a06a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'b46e8c2d-de26-4e7c-befd-32994f55bb4a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b46e8c2d-de26-4e7c-befd-32994f55bb4a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'b46e8c2d-de26-4e7c-befd-32994f55bb4a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '5717372d-86b6-4a5d-984e-abc5f48042f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '5717372d-86b6-4a5d-984e-abc5f48042f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('634b4962-9bf6-444e-84c7-5e54d8655ba4', '5717372d-86b6-4a5d-984e-abc5f48042f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5717372d-86b6-4a5d-984e-abc5f48042f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5717372d-86b6-4a5d-984e-abc5f48042f8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '654f5433-ac08-4907-b9ac-e95743cb9b9e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '654f5433-ac08-4907-b9ac-e95743cb9b9e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '654f5433-ac08-4907-b9ac-e95743cb9b9e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '654f5433-ac08-4907-b9ac-e95743cb9b9e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e97273b1-209d-4828-957f-f32ad0dfc2ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'fd4f9e2f-3278-41f2-968f-90ae4d26982a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'fd4f9e2f-3278-41f2-968f-90ae4d26982a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'fd4f9e2f-3278-41f2-968f-90ae4d26982a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'fd4f9e2f-3278-41f2-968f-90ae4d26982a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '906fc230-b0f9-46b5-a2ad-e0faf9832843') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '906fc230-b0f9-46b5-a2ad-e0faf9832843') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '906fc230-b0f9-46b5-a2ad-e0faf9832843') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5321ee09-3ce6-4bad-b913-3f6276dc4653') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5321ee09-3ce6-4bad-b913-3f6276dc4653') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('67f9a398-4dd3-4cc5-8e72-8f3f2e65a436', 'b4bc9693-e91e-4c0d-bb62-0a124062903f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b4bc9693-e91e-4c0d-bb62-0a124062903f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '1a942a05-fc2e-4d57-8d58-4ffe1fdd3e2e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '35bcadfc-f7a9-4869-921e-c87ed1a6b9c6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '35bcadfc-f7a9-4869-921e-c87ed1a6b9c6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '35bcadfc-f7a9-4869-921e-c87ed1a6b9c6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '35bcadfc-f7a9-4869-921e-c87ed1a6b9c6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '52e940ca-c459-4727-9b99-4148b49045d6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '52e940ca-c459-4727-9b99-4148b49045d6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '52e940ca-c459-4727-9b99-4148b49045d6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '95aee52a-b817-4ca2-bb5b-50c13fa7f96b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '95aee52a-b817-4ca2-bb5b-50c13fa7f96b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '95aee52a-b817-4ca2-bb5b-50c13fa7f96b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '8762e19b-70bc-41d2-87e6-a3eebeaeb4f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8762e19b-70bc-41d2-87e6-a3eebeaeb4f4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'd871be0d-8b6a-4a49-a115-95bef7a5c1e4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd871be0d-8b6a-4a49-a115-95bef7a5c1e4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '8941ddb8-5151-49e7-b8de-c85320ae677c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8941ddb8-5151-49e7-b8de-c85320ae677c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'fdcf66f9-3a65-47a6-b892-cd4b26cb3f80') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'fdcf66f9-3a65-47a6-b892-cd4b26cb3f80') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'fdcf66f9-3a65-47a6-b892-cd4b26cb3f80') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'fdcf66f9-3a65-47a6-b892-cd4b26cb3f80') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'c661d98e-cedc-4aab-81e3-57fd54002bf3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'c661d98e-cedc-4aab-81e3-57fd54002bf3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c661d98e-cedc-4aab-81e3-57fd54002bf3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', 'c661d98e-cedc-4aab-81e3-57fd54002bf3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '2e2b7dad-e064-441c-b4bf-a2cb5da8fb79') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2e2b7dad-e064-441c-b4bf-a2cb5da8fb79') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '41a7249f-6aad-46a1-ba88-88156b9b4236') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '41a7249f-6aad-46a1-ba88-88156b9b4236') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '41a7249f-6aad-46a1-ba88-88156b9b4236') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '41a7249f-6aad-46a1-ba88-88156b9b4236') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'ab1eba93-397e-4bcc-b992-80d97cd38407') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'ab1eba93-397e-4bcc-b992-80d97cd38407') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ab1eba93-397e-4bcc-b992-80d97cd38407') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '7843ccac-dcaf-4394-ab24-a5039f2212d5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7843ccac-dcaf-4394-ab24-a5039f2212d5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7843ccac-dcaf-4394-ab24-a5039f2212d5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'af8f71cd-c443-4713-8488-bd357bcb7eb9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'af8f71cd-c443-4713-8488-bd357bcb7eb9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', '47f135f3-c491-4ce5-a258-00a111c95d30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '47f135f3-c491-4ce5-a258-00a111c95d30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '47f135f3-c491-4ce5-a258-00a111c95d30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '47f135f3-c491-4ce5-a258-00a111c95d30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '8dd78998-09ef-418a-a5d3-b0d47567b80f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8dd78998-09ef-418a-a5d3-b0d47567b80f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e1a2268c-490a-4675-91fb-29fc912ade7c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'a68cb588-e03a-4450-b3d7-966b05512513') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'a68cb588-e03a-4450-b3d7-966b05512513') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'a68cb588-e03a-4450-b3d7-966b05512513') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a68cb588-e03a-4450-b3d7-966b05512513') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'a68cb588-e03a-4450-b3d7-966b05512513') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', 'a68cb588-e03a-4450-b3d7-966b05512513') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '04fc2b20-f493-4caf-9bed-27596a67ad2f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '04fc2b20-f493-4caf-9bed-27596a67ad2f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '04fc2b20-f493-4caf-9bed-27596a67ad2f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '04fc2b20-f493-4caf-9bed-27596a67ad2f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '62974649-7e90-47ca-b81c-73c2eee948be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '62974649-7e90-47ca-b81c-73c2eee948be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '62974649-7e90-47ca-b81c-73c2eee948be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '609ba5af-2fa9-453f-9831-57b2144a43e8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '609ba5af-2fa9-453f-9831-57b2144a43e8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '609ba5af-2fa9-453f-9831-57b2144a43e8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '47b58b16-9691-46a6-b575-fda8a6a7961f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '47b58b16-9691-46a6-b575-fda8a6a7961f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6bdecd9e-b28f-433c-9644-f7da9fe2289c', '92c26bd0-7e97-44e1-b594-56fd35701afb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', '92c26bd0-7e97-44e1-b594-56fd35701afb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '92c26bd0-7e97-44e1-b594-56fd35701afb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '92c26bd0-7e97-44e1-b594-56fd35701afb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '2029bdb5-8d5c-4788-86aa-a6db6404cb57') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '0e5e7153-6255-4601-830c-5932d9895c0c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '0e5e7153-6255-4601-830c-5932d9895c0c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0e5e7153-6255-4601-830c-5932d9895c0c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '4611c238-b84d-40d1-8c0e-d1490d40ba8c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4611c238-b84d-40d1-8c0e-d1490d40ba8c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '4611c238-b84d-40d1-8c0e-d1490d40ba8c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '8d9945f0-0e75-439b-87bd-06683204aebe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8d9945f0-0e75-439b-87bd-06683204aebe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '8d9945f0-0e75-439b-87bd-06683204aebe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '82aee5c7-f719-466d-91c7-8b1e6e46b087') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '82aee5c7-f719-466d-91c7-8b1e6e46b087') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '82aee5c7-f719-466d-91c7-8b1e6e46b087') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '82aee5c7-f719-466d-91c7-8b1e6e46b087') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '6d191bc6-1559-4cab-a06e-e17cfa503b6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6d191bc6-1559-4cab-a06e-e17cfa503b6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6d191bc6-1559-4cab-a06e-e17cfa503b6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6d191bc6-1559-4cab-a06e-e17cfa503b6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '6d191bc6-1559-4cab-a06e-e17cfa503b6f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '58433bd0-2368-4f35-9819-fd9d0e7ee9ce') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'd9f0a97b-695c-4302-916b-c34bf4537936') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'd9f0a97b-695c-4302-916b-c34bf4537936') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'd9f0a97b-695c-4302-916b-c34bf4537936') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '1a2004c9-b3fa-46ed-982d-ea5c060025d3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1a2004c9-b3fa-46ed-982d-ea5c060025d3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1a2004c9-b3fa-46ed-982d-ea5c060025d3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1a2004c9-b3fa-46ed-982d-ea5c060025d3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '1a2004c9-b3fa-46ed-982d-ea5c060025d3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '649e5d2a-6a8b-463f-a26e-089375a21011') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '649e5d2a-6a8b-463f-a26e-089375a21011') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '649e5d2a-6a8b-463f-a26e-089375a21011') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '649e5d2a-6a8b-463f-a26e-089375a21011') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('7eb9c15f-4243-4895-ada4-d08c61ebeaf1', '83567200-73ee-47a6-9c0c-f448d68ba6be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '83567200-73ee-47a6-9c0c-f448d68ba6be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '027f52b0-d37a-4418-a1b0-35f9227cf20d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '027f52b0-d37a-4418-a1b0-35f9227cf20d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '027f52b0-d37a-4418-a1b0-35f9227cf20d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '027f52b0-d37a-4418-a1b0-35f9227cf20d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd84e774a-27f5-4df4-b0c4-b1d94bb0c846') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd84e774a-27f5-4df4-b0c4-b1d94bb0c846') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'd84e774a-27f5-4df4-b0c4-b1d94bb0c846') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'd84e774a-27f5-4df4-b0c4-b1d94bb0c846') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3ba73960-9584-41e6-949b-c498078249bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3ba73960-9584-41e6-949b-c498078249bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '01214497-ce5b-4e96-a962-e0f1d54afca4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '01214497-ce5b-4e96-a962-e0f1d54afca4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '01214497-ce5b-4e96-a962-e0f1d54afca4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '01214497-ce5b-4e96-a962-e0f1d54afca4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '01214497-ce5b-4e96-a962-e0f1d54afca4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'ef8c701a-6c33-4967-b619-38d0f08fcd49') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'ef8c701a-6c33-4967-b619-38d0f08fcd49') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ef8c701a-6c33-4967-b619-38d0f08fcd49') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'ef8c701a-6c33-4967-b619-38d0f08fcd49') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', 'fe1ccff6-b318-4033-bc38-46a55c971eac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'fe1ccff6-b318-4033-bc38-46a55c971eac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'fe1ccff6-b318-4033-bc38-46a55c971eac') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5367bdbf-8797-4cf1-ab1e-08b6949fa97d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '5367bdbf-8797-4cf1-ab1e-08b6949fa97d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5367bdbf-8797-4cf1-ab1e-08b6949fa97d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '5367bdbf-8797-4cf1-ab1e-08b6949fa97d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '9a66803d-d4e0-4928-8040-19e81e31f089') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '9a66803d-d4e0-4928-8040-19e81e31f089') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9a66803d-d4e0-4928-8040-19e81e31f089') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '9a66803d-d4e0-4928-8040-19e81e31f089') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77b17b1f-0c74-46da-8e19-293ac88097f4', '9a66803d-d4e0-4928-8040-19e81e31f089') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'c0a50d22-76b4-46d7-b045-0fc1cf98f2ca') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c0a50d22-76b4-46d7-b045-0fc1cf98f2ca') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6443dce2-85bc-4f24-b36c-65cb57ab22d4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '17efbb66-dc5b-46e4-be11-215534fb635e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '17efbb66-dc5b-46e4-be11-215534fb635e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '7849a398-638c-4b4c-bf34-3f1576d5327b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7849a398-638c-4b4c-bf34-3f1576d5327b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '7849a398-638c-4b4c-bf34-3f1576d5327b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '453d8638-9ee5-4536-bb8c-e4c97bb78576') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '453d8638-9ee5-4536-bb8c-e4c97bb78576') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '453d8638-9ee5-4536-bb8c-e4c97bb78576') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '453d8638-9ee5-4536-bb8c-e4c97bb78576') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '453d8638-9ee5-4536-bb8c-e4c97bb78576') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'f5f267dd-2546-44d2-a050-2df29019a3c8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f5f267dd-2546-44d2-a050-2df29019a3c8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '65315542-f7a8-44f9-a2b7-e2130758f5be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '65315542-f7a8-44f9-a2b7-e2130758f5be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '65315542-f7a8-44f9-a2b7-e2130758f5be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '65315542-f7a8-44f9-a2b7-e2130758f5be') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '91b1a3d5-1412-4a05-90c5-365ff25edd08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '91b1a3d5-1412-4a05-90c5-365ff25edd08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '91b1a3d5-1412-4a05-90c5-365ff25edd08') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('e4ea26ce-1444-41be-9342-f085f615f9a7', '91e5b613-e46b-4703-ae64-3f0f2cff2bd5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '91e5b613-e46b-4703-ae64-3f0f2cff2bd5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '91e5b613-e46b-4703-ae64-3f0f2cff2bd5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '017ca9fe-4ba7-4b21-8ebd-e7fe827ac99e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '017ca9fe-4ba7-4b21-8ebd-e7fe827ac99e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '017ca9fe-4ba7-4b21-8ebd-e7fe827ac99e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '017ca9fe-4ba7-4b21-8ebd-e7fe827ac99e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'dd3608aa-532d-474e-9f50-2a50853c7c1e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'dd3608aa-532d-474e-9f50-2a50853c7c1e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'dd3608aa-532d-474e-9f50-2a50853c7c1e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'dd3608aa-532d-474e-9f50-2a50853c7c1e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5ce1bc2e-48f1-44a7-8a58-98528cef6ecb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '5ce1bc2e-48f1-44a7-8a58-98528cef6ecb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '2106db0a-707e-4956-bf7c-0bb1a47a5be0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2106db0a-707e-4956-bf7c-0bb1a47a5be0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '2106db0a-707e-4956-bf7c-0bb1a47a5be0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5f3a0b44-1a77-4385-8b14-4859bdf20dd2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '94ae40df-f0b3-44f5-b25a-6e675ead69ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'a40bd8bb-0771-474b-9cbd-128081e83b04') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a40bd8bb-0771-474b-9cbd-128081e83b04') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a40bd8bb-0771-474b-9cbd-128081e83b04') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'a40bd8bb-0771-474b-9cbd-128081e83b04') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '51146862-0dc0-4c63-8405-1ab992e8a151') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '51146862-0dc0-4c63-8405-1ab992e8a151') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '51146862-0dc0-4c63-8405-1ab992e8a151') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '4d66ab2e-c555-4dfa-9aae-8d7211664aa9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '4d66ab2e-c555-4dfa-9aae-8d7211664aa9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4d66ab2e-c555-4dfa-9aae-8d7211664aa9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'e86e3800-2400-4c18-ae5f-b0f24f8a9f84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e86e3800-2400-4c18-ae5f-b0f24f8a9f84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'e86e3800-2400-4c18-ae5f-b0f24f8a9f84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'e86e3800-2400-4c18-ae5f-b0f24f8a9f84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'e86e3800-2400-4c18-ae5f-b0f24f8a9f84') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '964843b7-e7da-4568-933b-59c9ca60a56d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '964843b7-e7da-4568-933b-59c9ca60a56d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '964843b7-e7da-4568-933b-59c9ca60a56d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '964843b7-e7da-4568-933b-59c9ca60a56d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '964843b7-e7da-4568-933b-59c9ca60a56d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '964843b7-e7da-4568-933b-59c9ca60a56d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', 'a6e93234-d3ef-4e31-b1bd-53c5a288a66e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'a6e93234-d3ef-4e31-b1bd-53c5a288a66e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dcf59820-af9a-4599-9552-0154f35d42d6', 'a6e93234-d3ef-4e31-b1bd-53c5a288a66e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'a6e93234-d3ef-4e31-b1bd-53c5a288a66e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'd089f7c9-bb2e-4d00-9dc2-ba5eb11dae10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd089f7c9-bb2e-4d00-9dc2-ba5eb11dae10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd089f7c9-bb2e-4d00-9dc2-ba5eb11dae10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'd089f7c9-bb2e-4d00-9dc2-ba5eb11dae10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a3bb4ecd-66c8-46fd-9e6f-81ae8477467e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a3bb4ecd-66c8-46fd-9e6f-81ae8477467e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'a3bb4ecd-66c8-46fd-9e6f-81ae8477467e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'a3bb4ecd-66c8-46fd-9e6f-81ae8477467e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'a3bb4ecd-66c8-46fd-9e6f-81ae8477467e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '52738ae4-4edf-41c1-b4ad-03fc118f3f90') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '52738ae4-4edf-41c1-b4ad-03fc118f3f90') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', '52738ae4-4edf-41c1-b4ad-03fc118f3f90') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '52738ae4-4edf-41c1-b4ad-03fc118f3f90') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', '43f659ef-e17d-49b9-abc8-da64251394e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '43f659ef-e17d-49b9-abc8-da64251394e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '43f659ef-e17d-49b9-abc8-da64251394e2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '21e5dc15-e416-46f7-806d-cd9c6755b92c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '21e5dc15-e416-46f7-806d-cd9c6755b92c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '032f8cf8-e928-48b6-9f68-1e629c7110a2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '032f8cf8-e928-48b6-9f68-1e629c7110a2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '7cbbd91a-1034-41ec-90b3-e26bad836bd8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7cbbd91a-1034-41ec-90b3-e26bad836bd8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7cbbd91a-1034-41ec-90b3-e26bad836bd8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'e710a596-0331-4b3d-9376-f17d61c5213b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e710a596-0331-4b3d-9376-f17d61c5213b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'e710a596-0331-4b3d-9376-f17d61c5213b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'e710a596-0331-4b3d-9376-f17d61c5213b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'b0463c60-0912-4851-8012-6ae55742002d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b0463c60-0912-4851-8012-6ae55742002d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b0463c60-0912-4851-8012-6ae55742002d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '29560832-55a2-4110-8fbc-733ba606582e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '29560832-55a2-4110-8fbc-733ba606582e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '026f4d61-a301-4bd1-97a6-b934da4798af') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '026f4d61-a301-4bd1-97a6-b934da4798af') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '026f4d61-a301-4bd1-97a6-b934da4798af') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '026f4d61-a301-4bd1-97a6-b934da4798af') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'a6a5543e-1e39-4a13-a333-0778cdcfb6c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'a6a5543e-1e39-4a13-a333-0778cdcfb6c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', 'a6a5543e-1e39-4a13-a333-0778cdcfb6c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a6a5543e-1e39-4a13-a333-0778cdcfb6c1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '49e5474a-ad99-4b6f-9849-9ad595a7313f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '49e5474a-ad99-4b6f-9849-9ad595a7313f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '49e5474a-ad99-4b6f-9849-9ad595a7313f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '49e5474a-ad99-4b6f-9849-9ad595a7313f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1b37f6a1-e7b5-4691-a71b-23a23c91ad01') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1b37f6a1-e7b5-4691-a71b-23a23c91ad01') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1b37f6a1-e7b5-4691-a71b-23a23c91ad01') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('4bcaa3bb-019d-4e2b-8f7b-26ce7c280abf', '670fa5f9-984e-41a8-bd7a-baa40a5814dc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '670fa5f9-984e-41a8-bd7a-baa40a5814dc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '670fa5f9-984e-41a8-bd7a-baa40a5814dc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', '670fa5f9-984e-41a8-bd7a-baa40a5814dc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '670fa5f9-984e-41a8-bd7a-baa40a5814dc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c65d8ed5-cdaa-43e2-a9d8-02872027b61a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '5d020637-878e-4270-acbc-14c138c4f799') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5d020637-878e-4270-acbc-14c138c4f799') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '5d020637-878e-4270-acbc-14c138c4f799') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '5d020637-878e-4270-acbc-14c138c4f799') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '5d020637-878e-4270-acbc-14c138c4f799') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '4cbcad6d-1691-4f9c-bdf1-ab6c82958fb0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '4cbcad6d-1691-4f9c-bdf1-ab6c82958fb0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4cbcad6d-1691-4f9c-bdf1-ab6c82958fb0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '16be7f8a-b94e-4f25-8ab1-c9aac42f917c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '16be7f8a-b94e-4f25-8ab1-c9aac42f917c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '16be7f8a-b94e-4f25-8ab1-c9aac42f917c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'bc1fc335-eddf-453c-a07a-99eaed639db4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'bc1fc335-eddf-453c-a07a-99eaed639db4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'bc1fc335-eddf-453c-a07a-99eaed639db4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '25eedef6-abb2-4894-894d-035678041417') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '25eedef6-abb2-4894-894d-035678041417') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '25eedef6-abb2-4894-894d-035678041417') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '25eedef6-abb2-4894-894d-035678041417') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '75a74f43-9bbf-41ae-b5ad-97134dfb1b47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '75a74f43-9bbf-41ae-b5ad-97134dfb1b47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '75a74f43-9bbf-41ae-b5ad-97134dfb1b47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '75a74f43-9bbf-41ae-b5ad-97134dfb1b47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '75a74f43-9bbf-41ae-b5ad-97134dfb1b47') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7aa72071-dd77-4f18-b765-00788e36186f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7aa72071-dd77-4f18-b765-00788e36186f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '3384e776-ec3f-42ab-a8dd-dfa7f6ee352c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3384e776-ec3f-42ab-a8dd-dfa7f6ee352c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3384e776-ec3f-42ab-a8dd-dfa7f6ee352c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4e6b3901-f133-41d9-b2df-9d7f9b6ad5de') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('1f14ba08-b71f-4f00-b2a4-a9b6ae25e420', 'bacc180d-97c5-48ae-a2b5-fa965b9fca30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e8618f39-20af-49b0-964d-bf87010a17d8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'e8618f39-20af-49b0-964d-bf87010a17d8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'e8618f39-20af-49b0-964d-bf87010a17d8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9618d07b-cd85-48d9-a7d7-8448247e045d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '9618d07b-cd85-48d9-a7d7-8448247e045d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '9618d07b-cd85-48d9-a7d7-8448247e045d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '40f68f35-fbb9-4e9f-85b8-af8be32a8088') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '40f68f35-fbb9-4e9f-85b8-af8be32a8088') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '522c4361-6eb9-4552-9ba4-70b73f67393d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '522c4361-6eb9-4552-9ba4-70b73f67393d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '522c4361-6eb9-4552-9ba4-70b73f67393d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'e38a5ca0-ce64-4c01-b93a-ac09a72a434a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'e38a5ca0-ce64-4c01-b93a-ac09a72a434a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '8ed1fbdc-c5cd-4778-8549-a18046584579') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '08543747-14c4-4298-a4ce-24841eb9d886') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '08543747-14c4-4298-a4ce-24841eb9d886') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '08543747-14c4-4298-a4ce-24841eb9d886') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '53702ae5-7311-44f8-8296-43da5fc952e0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '53702ae5-7311-44f8-8296-43da5fc952e0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '53702ae5-7311-44f8-8296-43da5fc952e0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '53702ae5-7311-44f8-8296-43da5fc952e0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '0b3ecd1c-22e2-420f-b9bd-66e567b96d8a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0b3ecd1c-22e2-420f-b9bd-66e567b96d8a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '0b3ecd1c-22e2-420f-b9bd-66e567b96d8a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '488f2279-566f-4fca-b342-2d55848f31a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '488f2279-566f-4fca-b342-2d55848f31a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '488f2279-566f-4fca-b342-2d55848f31a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '488f2279-566f-4fca-b342-2d55848f31a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '0e2ac07f-42a9-4f2c-a9d9-27aa28f38712') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0e2ac07f-42a9-4f2c-a9d9-27aa28f38712') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '41d5cb73-0a49-47aa-a46f-fdec1e7c165d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '41d5cb73-0a49-47aa-a46f-fdec1e7c165d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('7eb9c15f-4243-4895-ada4-d08c61ebeaf1', 'c4679eed-a890-4b2f-a4fb-f714641f7d26') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', 'c4679eed-a890-4b2f-a4fb-f714641f7d26') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c4679eed-a890-4b2f-a4fb-f714641f7d26') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a413055d-725d-4a1f-a799-f13d1b7615dd') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('338fcc4b-2b2c-4312-8de9-58ccd249a028', 'ece0b104-b27e-4567-b436-ba81ead4ee9f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ece0b104-b27e-4567-b436-ba81ead4ee9f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'ece0b104-b27e-4567-b436-ba81ead4ee9f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'f089c406-46ee-46a2-a224-b858b2d494df') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'f9b68f87-356b-46bc-80b9-e61ebbe03358') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '779ab354-664d-4eeb-95a3-04e3d0f3a009') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '779ab354-664d-4eeb-95a3-04e3d0f3a009') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '779ab354-664d-4eeb-95a3-04e3d0f3a009') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '779ab354-664d-4eeb-95a3-04e3d0f3a009') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7917b9dc-f46c-42a1-af2c-9205b9d6f712') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7917b9dc-f46c-42a1-af2c-9205b9d6f712') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '50bb2af0-205c-45d9-b845-7a1f513438f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '50bb2af0-205c-45d9-b845-7a1f513438f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '50bb2af0-205c-45d9-b845-7a1f513438f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '50bb2af0-205c-45d9-b845-7a1f513438f7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9a92a868-53c3-4d4c-a373-482ba666cd30') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a54d633a-a48e-4a27-bd50-51fcb27b0bcb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a54d633a-a48e-4a27-bd50-51fcb27b0bcb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'a54d633a-a48e-4a27-bd50-51fcb27b0bcb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'a54d633a-a48e-4a27-bd50-51fcb27b0bcb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '66c9f5db-5049-41bd-938c-76c398d00682') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '66c9f5db-5049-41bd-938c-76c398d00682') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '66c9f5db-5049-41bd-938c-76c398d00682') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6f95c8cc-4dd0-4c5a-ba5a-6e9be5edc631') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'dbd36963-bece-4dfa-aa80-e39aa0959492') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'dbd36963-bece-4dfa-aa80-e39aa0959492') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '20be53d8-0d69-4311-9871-86c362315850') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('634b4962-9bf6-444e-84c7-5e54d8655ba4', '6904b0a6-8b97-4982-a650-854f29b1d4bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6904b0a6-8b97-4982-a650-854f29b1d4bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6904b0a6-8b97-4982-a650-854f29b1d4bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6394b2cc-d9f1-4962-92d9-de4ec03019bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6394b2cc-d9f1-4962-92d9-de4ec03019bf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'ac0c0f04-560f-4952-8c9f-aec9437f3cca') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'ac0c0f04-560f-4952-8c9f-aec9437f3cca') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'c32a2f53-3ea0-4999-a40e-5ea4cd33f275') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c32a2f53-3ea0-4999-a40e-5ea4cd33f275') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'c32a2f53-3ea0-4999-a40e-5ea4cd33f275') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'c32a2f53-3ea0-4999-a40e-5ea4cd33f275') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '44f64434-e4b9-498c-9d83-df00b8f9ca1a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '44f64434-e4b9-498c-9d83-df00b8f9ca1a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '44f64434-e4b9-498c-9d83-df00b8f9ca1a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f8b4b862-4838-4b1b-a56d-46b2ddfe6b6b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'f8b4b862-4838-4b1b-a56d-46b2ddfe6b6b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'f8b4b862-4838-4b1b-a56d-46b2ddfe6b6b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f8b4b862-4838-4b1b-a56d-46b2ddfe6b6b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'f8b4b862-4838-4b1b-a56d-46b2ddfe6b6b') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1bf9572d-5135-48fc-bf03-c63ade9a08c9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '1bf9572d-5135-48fc-bf03-c63ade9a08c9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f36f7749-6407-4c01-9c20-139da076e3ef') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f36f7749-6407-4c01-9c20-139da076e3ef') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'de2198c0-6c17-4cbf-90b1-7db066ad7a50') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'de2198c0-6c17-4cbf-90b1-7db066ad7a50') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'de2198c0-6c17-4cbf-90b1-7db066ad7a50') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3af16bab-c64c-42db-bc15-3df7cdb01d48') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '3af16bab-c64c-42db-bc15-3df7cdb01d48') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3af16bab-c64c-42db-bc15-3df7cdb01d48') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '3af16bab-c64c-42db-bc15-3df7cdb01d48') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6c849c81-c198-4412-97fd-1347a00507eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '6c849c81-c198-4412-97fd-1347a00507eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '6c849c81-c198-4412-97fd-1347a00507eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '6c849c81-c198-4412-97fd-1347a00507eb') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '2ee5504a-05db-41bf-837f-38fee6f5fc32') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2ee5504a-05db-41bf-837f-38fee6f5fc32') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '2ee5504a-05db-41bf-837f-38fee6f5fc32') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '2ee5504a-05db-41bf-837f-38fee6f5fc32') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'f9027a96-bb13-464e-9d06-1fe6cfbe330f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f9027a96-bb13-464e-9d06-1fe6cfbe330f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'f9027a96-bb13-464e-9d06-1fe6cfbe330f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f9027a96-bb13-464e-9d06-1fe6cfbe330f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'f9027a96-bb13-464e-9d06-1fe6cfbe330f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '14d0411c-9378-48ef-a00d-54066fbc91d2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '14d0411c-9378-48ef-a00d-54066fbc91d2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '14d0411c-9378-48ef-a00d-54066fbc91d2') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '74b62790-2afa-4a94-91cc-9c83a69788ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '74b62790-2afa-4a94-91cc-9c83a69788ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '74b62790-2afa-4a94-91cc-9c83a69788ba') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '39a691e4-7e51-4374-829f-68eebfa68eb1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '39a691e4-7e51-4374-829f-68eebfa68eb1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', '39a691e4-7e51-4374-829f-68eebfa68eb1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'b1e9d303-753f-4f06-a22b-7a4a9f7f3dd4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b1e9d303-753f-4f06-a22b-7a4a9f7f3dd4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '97423ea7-a1d9-4fe0-aa5d-b996ffce0b94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', '97423ea7-a1d9-4fe0-aa5d-b996ffce0b94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '97423ea7-a1d9-4fe0-aa5d-b996ffce0b94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '97423ea7-a1d9-4fe0-aa5d-b996ffce0b94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('374736cf-3d8d-4ffc-849f-89efd55ee243', '97423ea7-a1d9-4fe0-aa5d-b996ffce0b94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '0ee7b98c-3fd7-41cb-90e9-fc152fa85f0e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0ee7b98c-3fd7-41cb-90e9-fc152fa85f0e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', '0bc25f73-28b0-406a-b552-0f8347fab526') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '0bc25f73-28b0-406a-b552-0f8347fab526') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0bc25f73-28b0-406a-b552-0f8347fab526') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '38556509-32f0-43bd-8fb2-dac20e63f352') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b533527-e232-42d6-9d50-686266095a6d', '38556509-32f0-43bd-8fb2-dac20e63f352') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '38556509-32f0-43bd-8fb2-dac20e63f352') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'c323cd8e-262b-44f2-9d78-2f8d73e495bc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'c323cd8e-262b-44f2-9d78-2f8d73e495bc') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'd65ed509-2e34-43a2-9e4a-8e45cafed47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'd65ed509-2e34-43a2-9e4a-8e45cafed47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'd65ed509-2e34-43a2-9e4a-8e45cafed47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd65ed509-2e34-43a2-9e4a-8e45cafed47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', 'd65ed509-2e34-43a2-9e4a-8e45cafed47a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '0322b744-d156-4c68-b7c7-0d989cf044b4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', 'a7468ec9-9f42-4056-b865-83478c407e10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a7468ec9-9f42-4056-b865-83478c407e10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'a7468ec9-9f42-4056-b865-83478c407e10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'a7468ec9-9f42-4056-b865-83478c407e10') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '80f3057e-c34f-44eb-b552-94b465fc668c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '80f3057e-c34f-44eb-b552-94b465fc668c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '80f3057e-c34f-44eb-b552-94b465fc668c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '80f3057e-c34f-44eb-b552-94b465fc668c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '80f3057e-c34f-44eb-b552-94b465fc668c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '10f73175-d7a7-4d61-802c-a0cf118e11f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '10f73175-d7a7-4d61-802c-a0cf118e11f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '10f73175-d7a7-4d61-802c-a0cf118e11f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '10f73175-d7a7-4d61-802c-a0cf118e11f9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '5b83a09b-9f49-46b6-b4d1-0ee7bfd73519') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '5b83a09b-9f49-46b6-b4d1-0ee7bfd73519') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '5b83a09b-9f49-46b6-b4d1-0ee7bfd73519') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', '6b11ea3c-193c-44ce-b027-c544ab2d332e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6b11ea3c-193c-44ce-b027-c544ab2d332e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6b11ea3c-193c-44ce-b027-c544ab2d332e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'a6859bce-7332-41ed-bdcd-53dadc477105') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'a6859bce-7332-41ed-bdcd-53dadc477105') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a6859bce-7332-41ed-bdcd-53dadc477105') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a6859bce-7332-41ed-bdcd-53dadc477105') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'a6859bce-7332-41ed-bdcd-53dadc477105') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'f8daab1c-4abf-4f66-a009-1011dae27009') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'f8daab1c-4abf-4f66-a009-1011dae27009') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'f8daab1c-4abf-4f66-a009-1011dae27009') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '44163133-59bd-41aa-893f-bb792b1f2b0e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '44163133-59bd-41aa-893f-bb792b1f2b0e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '3b5c3a36-c7ad-4b4b-a86d-dc29338360a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '3b5c3a36-c7ad-4b4b-a86d-dc29338360a1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '7da7aec0-2ed8-4868-9abd-61a325deba3d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '7da7aec0-2ed8-4868-9abd-61a325deba3d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7da7aec0-2ed8-4868-9abd-61a325deba3d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '7da7aec0-2ed8-4868-9abd-61a325deba3d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d75ecc02-7eae-4786-8e18-3882d3aa718e', '11a8a973-4748-4145-b55d-fa026f229baf') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', '0475dc1a-b655-4bd4-8a2f-2d5f32c1f1c8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '0475dc1a-b655-4bd4-8a2f-2d5f32c1f1c8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '0475dc1a-b655-4bd4-8a2f-2d5f32c1f1c8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '12d31094-7048-48a1-ac43-dcfe227e9063') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '12d31094-7048-48a1-ac43-dcfe227e9063') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '12d31094-7048-48a1-ac43-dcfe227e9063') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '12d31094-7048-48a1-ac43-dcfe227e9063') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '262d8b3a-4472-45e0-bffb-e8e29ad5801c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '262d8b3a-4472-45e0-bffb-e8e29ad5801c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '262d8b3a-4472-45e0-bffb-e8e29ad5801c') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'd7a40f48-d5d8-4434-8742-b0c0e8ad3874') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'd7a40f48-d5d8-4434-8742-b0c0e8ad3874') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd7a40f48-d5d8-4434-8742-b0c0e8ad3874') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd7a40f48-d5d8-4434-8742-b0c0e8ad3874') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '9b08ec71-d139-46b6-84d8-9fc28f95e27a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '9b08ec71-d139-46b6-84d8-9fc28f95e27a') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', '3d770795-5778-4737-bf84-0d6e93b37c98') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', '3d770795-5778-4737-bf84-0d6e93b37c98') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '3d770795-5778-4737-bf84-0d6e93b37c98') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('7eb9c15f-4243-4895-ada4-d08c61ebeaf1', '615d2adf-d941-46cd-9dbb-f0974c58afc6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '615d2adf-d941-46cd-9dbb-f0974c58afc6') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '2bfb95c9-0a6f-46f1-939d-ca44130dd21f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '2bfb95c9-0a6f-46f1-939d-ca44130dd21f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '2bfb95c9-0a6f-46f1-939d-ca44130dd21f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '2bfb95c9-0a6f-46f1-939d-ca44130dd21f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '2bfb95c9-0a6f-46f1-939d-ca44130dd21f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '2bfb95c9-0a6f-46f1-939d-ca44130dd21f') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd7064dae-6ad0-4bfe-a9d1-de94e2616f94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd7064dae-6ad0-4bfe-a9d1-de94e2616f94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd7064dae-6ad0-4bfe-a9d1-de94e2616f94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'd7064dae-6ad0-4bfe-a9d1-de94e2616f94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'd7064dae-6ad0-4bfe-a9d1-de94e2616f94') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'a9ea79fc-19ef-4c10-aacf-01331cb49a60') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a9ea79fc-19ef-4c10-aacf-01331cb49a60') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a9ea79fc-19ef-4c10-aacf-01331cb49a60') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'a9ea79fc-19ef-4c10-aacf-01331cb49a60') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'f4a21b9c-374c-4712-8f73-0a9b3a3cedd0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'f4a21b9c-374c-4712-8f73-0a9b3a3cedd0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4b95f558-1b83-4811-b184-de22760502b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '4b95f558-1b83-4811-b184-de22760502b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '4b95f558-1b83-4811-b184-de22760502b1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'b9bc8a29-6d51-4e83-8c44-2c5cd4112348') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b9bc8a29-6d51-4e83-8c44-2c5cd4112348') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '88d0788a-dffc-49b7-81aa-d7832a0a9971') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '88d0788a-dffc-49b7-81aa-d7832a0a9971') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '88d0788a-dffc-49b7-81aa-d7832a0a9971') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', '88d0788a-dffc-49b7-81aa-d7832a0a9971') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'd31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'd31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', 'd31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'd31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'd31c5a2d-d5a7-4ad5-bcbf-e7b3d0c8f7a3') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'de2ca761-e4ee-4856-8d2a-928249362806') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('df857ed6-d53d-490f-8066-d769303cf847', 'de2ca761-e4ee-4856-8d2a-928249362806') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'de2ca761-e4ee-4856-8d2a-928249362806') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'de2ca761-e4ee-4856-8d2a-928249362806') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'de2ca761-e4ee-4856-8d2a-928249362806') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('3b8d0f19-9588-4e45-b038-77cba49803c0', 'b30e9302-6a7f-490a-b9e0-48a9a9d42e2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('5b779401-bfa3-45c3-9f90-bb018ad8caec', 'b30e9302-6a7f-490a-b9e0-48a9a9d42e2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('be0ce236-b828-4184-bab6-a4c74f467f44', 'b30e9302-6a7f-490a-b9e0-48a9a9d42e2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'b30e9302-6a7f-490a-b9e0-48a9a9d42e2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'b30e9302-6a7f-490a-b9e0-48a9a9d42e2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'b30e9302-6a7f-490a-b9e0-48a9a9d42e2d') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '110e0c85-45e0-4461-a82b-837dde664284') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', '110e0c85-45e0-4461-a82b-837dde664284') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '110e0c85-45e0-4461-a82b-837dde664284') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '110e0c85-45e0-4461-a82b-837dde664284') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c1e80507-4a20-43a4-b22e-bb42d6dbb5d8', '27b8ce39-c89e-49f9-a19b-92ea7da6c633') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '27b8ce39-c89e-49f9-a19b-92ea7da6c633') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('ae80ccd8-f2be-4785-b08b-c13c59f6cf84', 'e6da21eb-bf79-42af-8a65-5584b84f62d8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('290813fd-91c8-42b6-8788-d2eea533a6cf', 'e6da21eb-bf79-42af-8a65-5584b84f62d8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', 'e6da21eb-bf79-42af-8a65-5584b84f62d8') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('0cab608f-1a16-41fd-bdf8-6c4107e1e4bc', 'bf4945de-9b26-4bde-84bf-85f9b2b9fdd0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'bf4945de-9b26-4bde-84bf-85f9b2b9fdd0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'bf4945de-9b26-4bde-84bf-85f9b2b9fdd0') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('f810f8cf-4957-4012-892a-a50cd15e7294', 'aac82c95-2ad5-4226-b74f-a6879fe86ed7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', 'aac82c95-2ad5-4226-b74f-a6879fe86ed7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'aac82c95-2ad5-4226-b74f-a6879fe86ed7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('77f5f79b-349e-48b6-add1-73e61ff51909', '648f5dde-d549-4879-a645-f7fd1aef22b4') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd6950ddc-1c2c-4c39-8b58-8a8ad66482f1') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', 'bfaef5ac-4c61-4e7a-849e-c60b4790c1b7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('bf8001e3-006f-4dc0-8f52-0be4d17d1a37', 'bfaef5ac-4c61-4e7a-849e-c60b4790c1b7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'bfaef5ac-4c61-4e7a-849e-c60b4790c1b7') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '4cf62182-da37-4bf0-8e59-4bac1be6a79e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '4cf62182-da37-4bf0-8e59-4bac1be6a79e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '4cf62182-da37-4bf0-8e59-4bac1be6a79e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '4cf62182-da37-4bf0-8e59-4bac1be6a79e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '4cf62182-da37-4bf0-8e59-4bac1be6a79e') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', '1bbc7ad4-962b-4e1c-afd9-300f67cd50fe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', '1bbc7ad4-962b-4e1c-afd9-300f67cd50fe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '1bbc7ad4-962b-4e1c-afd9-300f67cd50fe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', '1bbc7ad4-962b-4e1c-afd9-300f67cd50fe') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6bdecd9e-b28f-433c-9644-f7da9fe2289c', 'd66326e4-af95-4625-8274-590a0d7388b5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'd66326e4-af95-4625-8274-590a0d7388b5') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('57ed199d-56d3-4308-bda1-3d7b7bf785c3', 'a536b622-a91e-4064-acb3-c7d7f8f5c1ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('6415c616-6b9c-47cc-a694-390da0d0a1ea', 'a536b622-a91e-4064-acb3-c7d7f8f5c1ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', 'a536b622-a91e-4064-acb3-c7d7f8f5c1ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', 'a536b622-a91e-4064-acb3-c7d7f8f5c1ea') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '17ca81bd-194f-46a9-81fd-69ca39101a37') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '17ca81bd-194f-46a9-81fd-69ca39101a37') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b870132-e0a6-41db-b85c-88ff7d89eaeb', '17ca81bd-194f-46a9-81fd-69ca39101a37') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '17ca81bd-194f-46a9-81fd-69ca39101a37') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c95794c9-a2af-45f8-9ece-c7f343984e60', '80400af6-e6a1-4321-992d-48c09fc68984') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('37e50d51-2f18-42a2-9500-3b507b7239e2', '80400af6-e6a1-4321-992d-48c09fc68984') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c77ad999-8456-4ded-bab7-ba6c2072c7b4', '80400af6-e6a1-4321-992d-48c09fc68984') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('d2f1e774-1eb1-4972-b9ad-2e764f70cf2c', '80400af6-e6a1-4321-992d-48c09fc68984') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('8b492a72-8606-4660-9c7b-179be1d0be9e', 'ae4f1111-5c1a-4600-bd9e-f0183e727e06') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('80514d04-a7e6-4594-93cb-8c1131641b06', 'ae4f1111-5c1a-4600-bd9e-f0183e727e06') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '7b6c22b2-e81d-45f2-b619-b5b9fc031ba9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '7b6c22b2-e81d-45f2-b619-b5b9fc031ba9') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('c3e1908c-d9ef-4ac1-8b6d-8ba2a36585c3', '6f641d7c-9d1e-4b8a-9fd5-79d05463c131') +INSERT INTO "club_tags" ("tag_id", "club_id") VALUES ('dfa2cfd7-6ff1-4ea9-ac8a-c837a7ae95d2', '6f641d7c-9d1e-4b8a-9fd5-79d05463c131') +COMMIT; +-- END GENERATED MOCK DATA. Made with <3 by Garrett and Michael diff --git a/mock_data/requirements.txt b/mock_data/requirements.txt new file mode 100644 index 000000000..f37826c7e --- /dev/null +++ b/mock_data/requirements.txt @@ -0,0 +1,3 @@ +openai==1.24.0 +progress==1.6 +Requests==2.31.0 diff --git a/mock_data/src/cli.rs b/mock_data/src/cli.rs deleted file mode 100644 index bb9af8885..000000000 --- a/mock_data/src/cli.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::path::PathBuf; - -use clap::Parser; - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -pub struct Args { - /// Top N results to parse - #[clap(short, long, default_value = "1024")] - pub top_n: usize, - /// Output file - #[clap(short, long, default_value = "mock.sql")] - pub output: PathBuf, - /// Parent club UUID - #[clap(short, long, default_value = "00000000-0000-0000-0000-000000000000")] - pub parent: uuid::Uuid, -} diff --git a/mock_data/src/domain/category.rs b/mock_data/src/domain/category.rs deleted file mode 100644 index 702f021ff..000000000 --- a/mock_data/src/domain/category.rs +++ /dev/null @@ -1,69 +0,0 @@ -use once_cell::sync::Lazy; -use strum::IntoEnumIterator; -use strum_macros::{Display, EnumIter}; - -use crate::domain::tag::{ - ArtsAndCreativityTag, CommunityServiceAndAdvocacyTag, CulturalAndIdentityTag, - MediaAndCommunicationTag, PreProfessionalTag, ScienceAndTechnologyTag, SportsAndRecreationTag, - Tag, -}; - -#[derive(Debug, EnumIter, Display)] -pub enum CategoryExample { - PreProfessional(PreProfessionalTag), - CulturalAndIdentity(CulturalAndIdentityTag), - ArtsAndCreativity(ArtsAndCreativityTag), - SportsAndRecreation(SportsAndRecreationTag), - ScienceAndTechnology(ScienceAndTechnologyTag), - CommunityServiceAndAdvocacy(CommunityServiceAndAdvocacyTag), - MediaAndCommunication(MediaAndCommunicationTag), -} - -#[derive(Debug)] -pub struct Category { - pub id: uuid::Uuid, - pub category: CategoryExample, - pub tags: Vec, -} - -macro_rules! match_category { - ($expr:expr, $id:expr, $( $variant:ident => $type:ty ),*) => {{ - fn create_tags_for_category( - category_id: uuid::Uuid, - ) -> Vec { - T::iter() - .map(|tag| Tag::new(&tag.to_string(), category_id)) - .collect() - } - - match $expr { - $( - CategoryExample::$variant(_) => create_tags_for_category::<$type>($id), - )* - } - }}; -} - -pub static CATEGORIES: Lazy> = Lazy::new(|| { - CategoryExample::iter() - .map(|category_example| { - let id = uuid::Uuid::new_v4(); - - let tags = match_category! { category_example, id, - PreProfessional => PreProfessionalTag, - CulturalAndIdentity => CulturalAndIdentityTag, - ArtsAndCreativity => ArtsAndCreativityTag, - SportsAndRecreation => SportsAndRecreationTag, - ScienceAndTechnology => ScienceAndTechnologyTag, - CommunityServiceAndAdvocacy => CommunityServiceAndAdvocacyTag, - MediaAndCommunication => MediaAndCommunicationTag - }; - - Category { - id, - category: category_example, - tags, - } - }) - .collect() -}); diff --git a/mock_data/src/domain/club.rs b/mock_data/src/domain/club.rs deleted file mode 100644 index 044c177eb..000000000 --- a/mock_data/src/domain/club.rs +++ /dev/null @@ -1,66 +0,0 @@ -use rand::thread_rng; -use strum::IntoEnumIterator; -use strum_macros::{Display, EnumIter}; - -use rand::{seq::IteratorRandom, Rng}; - -use voca_rs::Voca; - -use crate::scraper::ScrapedClub; - -use crate::domain::tag::{Tag, TAGS}; - -#[derive(Debug, PartialEq, EnumIter, Display)] -pub enum RecruitmentCycle { - #[strum(serialize = "fall")] - Fall, - #[strum(serialize = "spring")] - Spring, - #[strum(serialize = "fallSpring")] - FallSpring, - #[strum(serialize = "always")] - Always, -} - -#[derive(Debug, PartialEq, EnumIter, Display)] -pub enum RecruitmentType { - #[strum(serialize = "unrestricted")] - Unrestricted, - #[strum(serialize = "application")] - Tryout, - #[strum(serialize = "application")] - Application, -} - -#[derive(Debug)] -pub struct Club { - pub id: uuid::Uuid, - pub name: String, - pub preview: String, - pub description: String, - pub num_members: usize, - pub is_recruiting: bool, - pub recruitment_cycle: RecruitmentCycle, - pub recruitment_type: RecruitmentType, - pub tags: Vec<&'static &'static Tag>, -} - -impl<'a> From<&'a ScrapedClub> for Club { - fn from(scraped: &'a ScrapedClub) -> Self { - let mut rng = thread_rng(); - - let num_tags = rng.gen_range(1..8); - - Club { - id: uuid::Uuid::new_v4(), - name: scraped.name.clone().replace("(Tentative) ", ""), - preview: scraped.preview.clone(), - description: scraped.description._strip_tags().replace(" ", " "), - num_members: rng.gen_range(1..1024), - is_recruiting: rng.gen_bool(0.5), - recruitment_cycle: RecruitmentCycle::iter().choose(&mut rng).unwrap(), - recruitment_type: RecruitmentType::iter().choose(&mut rng).unwrap(), - tags: TAGS.iter().choose_multiple(&mut rng, num_tags), - } - } -} diff --git a/mock_data/src/domain/mod.rs b/mock_data/src/domain/mod.rs deleted file mode 100644 index c46eabc10..000000000 --- a/mock_data/src/domain/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub mod category; -pub mod club; -pub mod tag; - -pub use category::Category; -pub use tag::Tag; diff --git a/mock_data/src/domain/tag.rs b/mock_data/src/domain/tag.rs deleted file mode 100644 index a01d082a2..000000000 --- a/mock_data/src/domain/tag.rs +++ /dev/null @@ -1,114 +0,0 @@ -use once_cell::sync::Lazy; -use strum_macros::Display; -use strum_macros::EnumIter; - -use crate::domain::category::CATEGORIES; - -#[derive(Debug)] -pub struct Tag { - pub id: uuid::Uuid, - pub name: String, - pub category_id: uuid::Uuid, -} - -impl Tag { - pub fn new(name: &str, category_id: uuid::Uuid) -> Self { - Self { - id: uuid::Uuid::new_v4(), - name: name.to_string(), - category_id, - } - } -} - -#[derive(Debug, Default, EnumIter, Display)] -pub enum PreProfessionalTag { - Premed, - Prelaw, - #[default] - Other, -} - -#[derive(Debug, Default, EnumIter, Display)] -pub enum CulturalAndIdentityTag { - Judaism, - Christianity, - Hinduism, - Islam, - LatinAmerica, - AfricanAmerican, - AsianAmerican, - LGBTQ, - #[default] - Other, -} - -#[derive(Debug, Default, EnumIter, Display)] -pub enum ArtsAndCreativityTag { - PerformingArts, - VisualArts, - CreativeWriting, - Music, - #[default] - Other, -} - -#[derive(Debug, Default, EnumIter, Display)] -pub enum SportsAndRecreationTag { - Soccer, - Hiking, - Climbing, - Lacrosse, - #[default] - Other, -} - -#[derive(Debug, Default, EnumIter, Display)] -pub enum ScienceAndTechnologyTag { - Mathematics, - Physics, - Biology, - Chemistry, - EnvironmentalScience, - Geology, - Neuroscience, - Psychology, - SoftwareEngineering, - ArtificialIntelligence, - DataScience, - MechanicalEngineering, - ElectricalEngineering, - IndustrialEngineering, - #[default] - Other, -} - -#[derive(Debug, Default, EnumIter, Display)] -pub enum CommunityServiceAndAdvocacyTag { - Volunteerism, - EnvironmentalAdvocacy, - HumanRights, - CommunityOutreach, - #[default] - Other, -} - -#[derive(Debug, Default, EnumIter, Display)] -pub enum MediaAndCommunicationTag { - Journalism, - Broadcasting, - Film, - PublicRelations, - #[default] - Other, -} - -pub static TAGS: Lazy> = Lazy::new(|| { - let mut tags = Vec::new(); - - CATEGORIES - .iter() - .for_each(|category| category.tags.iter().for_each(|tag| tags.push(tag))); - - tags -}); diff --git a/mock_data/src/dumper/category.rs b/mock_data/src/dumper/category.rs deleted file mode 100644 index 4957791ea..000000000 --- a/mock_data/src/dumper/category.rs +++ /dev/null @@ -1,14 +0,0 @@ -use std::{error::Error, fs::File, io::Write}; - -use crate::domain::Category; - -pub fn dump(categories: &[Category], file: &mut File) -> Result<(), Box> { - for category in categories { - writeln!( - file, - r#"INSERT INTO "categories" ("id", "name") VALUES ('{}', '{}');"#, - category.id, category.category - )?; - } - Ok(()) -} diff --git a/mock_data/src/dumper/club.rs b/mock_data/src/dumper/club.rs deleted file mode 100644 index 195787d5c..000000000 --- a/mock_data/src/dumper/club.rs +++ /dev/null @@ -1,23 +0,0 @@ -use std::{error::Error, fs::File, io::Write}; - -use crate::domain::club::Club; - -pub fn dump(clubs: Vec, file: &mut File, parent: uuid::Uuid) -> Result<(), Box> { - for club in clubs { - writeln!( - file, - r#"INSERT INTO "clubs" ("id", "name", "preview", "description", "num_members", "is_recruiting", "recruitment_cycle", "recruitment_type", "parent") VALUES ('{}', '{}', '{}', '{}', {}, {}, '{}', '{}', '{}');"#, - club.id, - club.name.replace('\'', "''"), - club.preview.replace('\'', "''"), - club.description.replace('\'', "''"), - club.num_members, - club.is_recruiting, - club.recruitment_cycle, - club.recruitment_type, - parent, - )?; - } - - Ok(()) -} diff --git a/mock_data/src/dumper/dump.rs b/mock_data/src/dumper/dump.rs deleted file mode 100644 index d57d53662..000000000 --- a/mock_data/src/dumper/dump.rs +++ /dev/null @@ -1,38 +0,0 @@ -use chrono::Local; -use std::{error::Error, fs::File, io::Write}; - -use crate::domain::{club::Club, Category, Tag}; - -fn autogen_commenter(file: &mut File, func: F) -> Result<(), Box> -where - F: FnOnce(&mut File) -> Result<(), Box>, -{ - writeln!(file, "-- AUTOGENERATED MOCK DATA, DO NOT MODIFY")?; - writeln!( - file, - "-- GENERATED AT {}", - Local::now().format("%Y-%m-%d %H:%M:%S") - )?; - func(file)?; - writeln!(file, "-- END AUTOGENERATED MOCK DATA")?; - Ok(()) -} - -pub fn dump_all( - categories: &[Category], - tags: &[&Tag], - clubs: Vec, - club_parent: uuid::Uuid, - file: &mut File, -) -> Result<(), Box> { - autogen_commenter(file, |file| { - writeln!(file, "BEGIN;")?; - crate::dumper::category::dump(categories, file)?; - crate::dumper::tag::dump(tags, file)?; - crate::dumper::club::dump(clubs, file, club_parent)?; - writeln!(file, "COMMIT;")?; - Ok(()) - })?; - - Ok(()) -} diff --git a/mock_data/src/dumper/mod.rs b/mock_data/src/dumper/mod.rs deleted file mode 100644 index 844485b68..000000000 --- a/mock_data/src/dumper/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod category; -pub mod club; -pub mod dump; -pub mod tag; diff --git a/mock_data/src/dumper/tag.rs b/mock_data/src/dumper/tag.rs deleted file mode 100644 index e6d431e48..000000000 --- a/mock_data/src/dumper/tag.rs +++ /dev/null @@ -1,15 +0,0 @@ -use std::{error::Error, fs::File, io::Write}; - -use crate::domain::tag::Tag; - -pub fn dump(tags: &[&Tag], file: &mut File) -> Result<(), Box> { - for tag in tags { - writeln!( - file, - r#"INSERT INTO "tags" ("id", "name", "category_id") VALUES ('{}', '{}', '{}');"#, - tag.id, tag.name, tag.category_id - )?; - } - - Ok(()) -} diff --git a/mock_data/src/lib.rs b/mock_data/src/lib.rs deleted file mode 100644 index 8a9b6d544..000000000 --- a/mock_data/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod cli; -pub mod domain; -pub mod dumper; -pub mod scraper; diff --git a/mock_data/src/main.rs b/mock_data/src/main.rs deleted file mode 100644 index 2751648a0..000000000 --- a/mock_data/src/main.rs +++ /dev/null @@ -1,42 +0,0 @@ -use std::error::Error; -use std::ops::Deref; -use std::{fs::OpenOptions, process::exit}; - -use clap::Parser; -use sac_club_scraper::domain::category::CATEGORIES; -use sac_club_scraper::domain::tag::TAGS; -use sac_club_scraper::dumper::dump::dump_all; -use sac_club_scraper::{cli::Args, domain::club::Club}; - -use sac_club_scraper::scraper::ClubsResponse; - -#[tokio::main] -async fn main() -> Result<(), Box> { - let args = Args::parse(); - - let response = reqwest::get(format!("https://neu.campuslabs.com/engage/api/discovery/search/organizations?orderBy[0]=UpperName%20asc&top={}&skip=0", args.top_n)).await?; - - if !response.status().is_success() { - println!("Request failed with status: {}", response.status()); - exit(1); - } - - let body = response.text().await?; - - let response: ClubsResponse = serde_json::from_str(&body).expect("Failed to deserialize"); - - let mut file = OpenOptions::new() - .create(true) - .append(true) - .open(args.output)?; - - dump_all( - CATEGORIES.deref(), - TAGS.deref(), - response.scraped_clubs.iter().map(Club::from).collect(), - args.parent, - &mut file, - )?; - - Ok(()) -} diff --git a/mock_data/src/scraper/mod.rs b/mock_data/src/scraper/mod.rs deleted file mode 100644 index 63dd30715..000000000 --- a/mock_data/src/scraper/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod scraped_club; - -pub use scraped_club::{ClubsResponse, ScrapedClub}; diff --git a/mock_data/src/scraper/scraped_club.rs b/mock_data/src/scraper/scraped_club.rs deleted file mode 100644 index a9e9eccce..000000000 --- a/mock_data/src/scraper/scraped_club.rs +++ /dev/null @@ -1,58 +0,0 @@ -use std::fmt; - -use rand::{thread_rng, Rng}; -use serde::{ - de::{self, Visitor}, - Deserializer, -}; - -use lipsum::lipsum; - -#[derive(Debug, serde::Deserialize)] -pub struct ClubsResponse { - #[serde(rename = "value")] - pub scraped_clubs: Vec, -} - -#[derive(Debug, serde::Deserialize)] -pub struct ScrapedClub { - #[serde(rename = "Name", deserialize_with = "deserialize_with_lipsum")] - pub name: String, - #[serde(rename = "Summary", deserialize_with = "deserialize_with_lipsum")] - pub preview: String, - #[serde(rename = "Description", deserialize_with = "deserialize_with_lipsum")] - pub description: String, -} - -fn deserialize_with_lipsum<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - struct StringOrLipsum; - - impl<'de> Visitor<'de> for StringOrLipsum { - type Value = String; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a string or null for a lipsum replacement") - } - - fn visit_str(self, value: &str) -> Result - where - E: de::Error, - { - Ok(value.to_owned()) - } - - fn visit_unit(self) -> Result - where - E: de::Error, - { - let mut rng = thread_rng(); - - Ok(lipsum(rng.gen_range(16..128))) - } - } - - deserializer.deserialize_any(StringOrLipsum) -}