├── .env.example ├── .commitlintrc.json ├── herald ├── utils.go ├── join_responses.go ├── role_responses.go ├── handlers.go ├── join_commands.go ├── join_modals.go ├── role_modals.go ├── join_utils.go ├── role_commands.go ├── herald.go ├── role_utils.go ├── models.go ├── join_components.go └── role_components.go ├── .husky └── commit-msg ├── docker-compose.yml ├── interactor ├── constants.go ├── interactor.go ├── utils.go ├── structs.go ├── modal.go ├── context.go ├── modal_utils.go ├── applicationcommand.go ├── messagecomponent.go ├── modal_options.go ├── applicationcommand_structs.go ├── modal_structs.go ├── messagecomponent_structs.ts.go ├── messagecomponent_options.go ├── handlers.go ├── applicationcommand_utils.go └── applicationcommand_options.go ├── .changeset ├── config.json └── README.md ├── .dockerignore ├── CHANGELOG.md ├── package.json ├── Dockerfile ├── go.mod ├── db └── db.go ├── .github └── workflows │ ├── test.yml │ ├── changesets.yml │ └── docker.yml ├── main.go ├── .gitignore ├── discord ├── discord.go └── sync.go ├── LICENSE ├── config └── config.go ├── core └── core.go ├── README.md ├── go.sum └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | DISCORD_TOKEN= -------------------------------------------------------------------------------- /.commitlintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@commitlint/config-conventional"] 3 | } -------------------------------------------------------------------------------- /herald/utils.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | func ptr[T any](v T) *T { 4 | return &v 5 | } 6 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | yarn commitlint --edit $1 5 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | digbot: 5 | build: . 6 | environment: 7 | - DISCORD_TOKEN 8 | volumes: 9 | - ./data:/data -------------------------------------------------------------------------------- /interactor/constants.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | const idDelimiter = ":" 4 | 5 | const ( 6 | ColorPrimary = 52421 7 | ColorSecondary = 7895160 8 | ColorError = 12845056 9 | ColorWarning = 13936130 10 | ColorSuccess = 4434775 11 | ) 12 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", 3 | "changelog": [ 4 | "@changesets/changelog-github", 5 | { 6 | "repo": "dignityofwar/digbot" 7 | } 8 | ], 9 | "commit": false, 10 | "access": "public", 11 | "baseBranch": "main" 12 | } 13 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore local npm modules and logs 2 | node_modules/ 3 | npm-debug.log 4 | 5 | # Ignore all md files 6 | *.md 7 | 8 | # Ignore all hidden files (git, travis, docker, etc) 9 | .* 10 | 11 | # Ignore all docker files 12 | Dockerfile 13 | docker-compose.yml 14 | 15 | dist/ 16 | data/ 17 | temp/ 18 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # digbot 2 | 3 | ## 4.0.0 4 | 5 | ### Major Changes 6 | 7 | - [#127](https://github.com/dignityofwar/digbot/pull/127) [`1141ebf`](https://github.com/dignityofwar/digbot/commit/1141ebf3fed28da1ecbd545fdcb92b456e335a40) Thanks [@microwavekonijn](https://github.com/microwavekonijn)! - refactor: switched to go 8 | -------------------------------------------------------------------------------- /interactor/interactor.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "github.com/dignityofwar/digbot/core" 5 | "github.com/dignityofwar/digbot/discord" 6 | "log" 7 | ) 8 | 9 | var Module = core.Module{ 10 | Name: "Interactor", 11 | OnInit: func() { 12 | log.Println("Setting up Interactor") 13 | 14 | discord.Discord.AddHandler(interactionHandler) 15 | }, 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "digbot", 3 | "private": true, 4 | "version": "4.0.0", 5 | "scripts": { 6 | "prepare": "husky install" 7 | }, 8 | "dependencies": { 9 | "@changesets/changelog-github": "^0.4.8", 10 | "@changesets/cli": "^2.26.2", 11 | "@commitlint/cli": "^17.7.1", 12 | "@commitlint/config-conventional": "^17.7.0", 13 | "husky": "^8.0.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM golang:1.21 AS build 3 | 4 | WORKDIR /app 5 | 6 | COPY go.mod go.sum ./ 7 | RUN go mod download 8 | 9 | COPY . . 10 | 11 | RUN CGO_ENABLED=1 GOOS=linux go build -o /digbot 12 | 13 | 14 | FROM gcr.io/distroless/base-debian12 AS release 15 | 16 | WORKDIR / 17 | 18 | COPY --from=build /digbot /digbot 19 | 20 | VOLUME /data 21 | 22 | USER nonroot:nonroot 23 | 24 | ENTRYPOINT ["/digbot"] 25 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/dignityofwar/digbot 2 | 3 | go 1.21 4 | 5 | require ( 6 | github.com/bwmarrin/discordgo v0.27.1 7 | github.com/joho/godotenv v1.5.1 8 | gorm.io/driver/sqlite v1.5.3 9 | gorm.io/gorm v1.25.4 10 | ) 11 | 12 | require ( 13 | github.com/gorilla/websocket v1.5.0 // indirect 14 | github.com/jinzhu/inflection v1.0.0 // indirect 15 | github.com/jinzhu/now v1.1.5 // indirect 16 | github.com/mattn/go-sqlite3 v1.14.17 // indirect 17 | golang.org/x/crypto v0.12.0 // indirect 18 | golang.org/x/sys v0.11.0 // indirect 19 | ) 20 | -------------------------------------------------------------------------------- /db/db.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | import ( 4 | "github.com/dignityofwar/digbot/config" 5 | "github.com/dignityofwar/digbot/core" 6 | "gorm.io/driver/sqlite" 7 | "gorm.io/gorm" 8 | "gorm.io/gorm/logger" 9 | ) 10 | 11 | var Connection *gorm.DB 12 | 13 | var Module = core.Module{ 14 | Name: "DB", 15 | OnInit: func() { 16 | var err error 17 | 18 | Connection, err = gorm.Open(sqlite.Open(config.DB.FilePath), &gorm.Config{ 19 | Logger: logger.Default.LogMode(logger.Silent), 20 | }) 21 | 22 | if err != nil { 23 | panic(err) 24 | } 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | jobs: 10 | compile-test: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | golang-version: [ '1.21' ] 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | 20 | - name: Setup Go ${{ matrix.golang-version }} 21 | uses: actions/setup-go@v4 22 | with: 23 | go-version: ${{ matrix.golang-version }} 24 | 25 | - name: Compile 26 | run: go build -v ./... 27 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/dignityofwar/digbot/config" 5 | "github.com/dignityofwar/digbot/core" 6 | "github.com/dignityofwar/digbot/db" 7 | "github.com/dignityofwar/digbot/discord" 8 | "github.com/dignityofwar/digbot/herald" 9 | "github.com/dignityofwar/digbot/interactor" 10 | "log" 11 | ) 12 | 13 | func main() { 14 | app := core.CreateApp([]core.Module{ 15 | config.Module, 16 | db.Module, 17 | discord.Module, 18 | interactor.Module, 19 | herald.Module, 20 | }) 21 | app.Start() 22 | 23 | app.AwaitExit() 24 | 25 | log.Println("Goodbye :)") 26 | } 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # If you prefer the allow list template instead of the deny list, see community template: 2 | # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore 3 | # 4 | # Binaries for programs and plugins 5 | *.exe 6 | *.exe~ 7 | *.dll 8 | *.so 9 | *.dylib 10 | 11 | # Test binary, built with `go test -c` 12 | *.test 13 | 14 | # Output of the go coverage tool, specifically when used with LiteIDE 15 | *.out 16 | 17 | # Dependency directories (remove the comment below to include it) 18 | vendor/ 19 | 20 | # Go workspace file 21 | go.work 22 | 23 | node_modules/ 24 | data/ 25 | .env -------------------------------------------------------------------------------- /interactor/utils.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import "reflect" 4 | 5 | func captureError(values []reflect.Value) error { 6 | if l := len(values); l > 0 { 7 | if err := values[l-1]; !err.IsZero() { 8 | if err, ok := err.Interface().(error); ok { 9 | return err 10 | } 11 | } 12 | } 13 | 14 | return nil 15 | } 16 | 17 | func mapToArray[T any](m map[string]T) []T { 18 | s := make([]T, 0, len(m)) 19 | 20 | for _, v := range m { 21 | s = append(s, v) 22 | } 23 | 24 | return s 25 | } 26 | 27 | func mapArray[T any, S any](s []T, m func(T) S) []S { 28 | a := make([]S, len(s)) 29 | 30 | for i, v := range s { 31 | a[i] = m(v) 32 | } 33 | 34 | return a 35 | } 36 | -------------------------------------------------------------------------------- /interactor/structs.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import "github.com/bwmarrin/discordgo" 4 | 5 | type Mentionable struct { 6 | id string 7 | resolvedUsers map[string]*discordgo.User 8 | resolvedMembers map[string]*discordgo.Member 9 | resolvedRoles map[string]*discordgo.Role 10 | } 11 | 12 | func (m *Mentionable) User() (*discordgo.User, bool) { 13 | user, ok := m.resolvedUsers[m.id] 14 | return user, ok 15 | } 16 | 17 | func (m *Mentionable) Member() (*discordgo.Member, bool) { 18 | member, ok := m.resolvedMembers[m.id] 19 | return member, ok 20 | } 21 | 22 | func (m *Mentionable) Role() (*discordgo.Role, bool) { 23 | role, ok := m.resolvedRoles[m.id] 24 | return role, ok 25 | } 26 | -------------------------------------------------------------------------------- /herald/join_responses.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/interactor" 6 | ) 7 | 8 | var joinResponseNotFound = &discordgo.InteractionResponseData{ 9 | Embeds: []*discordgo.MessageEmbed{{ 10 | Description: "Could not update message as it does not exist", 11 | Color: interactor.ColorError, 12 | }}, 13 | Flags: discordgo.MessageFlagsEphemeral, 14 | } 15 | 16 | var joinResponseNotificationUpdated = &discordgo.MessageEmbed{ 17 | Description: "Join message updated", 18 | Color: interactor.ColorSuccess, 19 | } 20 | 21 | var joinResponseNotificationFailed = &discordgo.MessageEmbed{ 22 | Description: "Update failed as there already exist an message for this join + channel combination", 23 | Color: interactor.ColorError, 24 | } 25 | -------------------------------------------------------------------------------- /herald/role_responses.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/interactor" 6 | ) 7 | 8 | var roleResponseNotFound = &discordgo.InteractionResponseData{ 9 | Embeds: []*discordgo.MessageEmbed{{ 10 | Description: "Could not update message as it does not exist", 11 | Color: interactor.ColorError, 12 | }}, 13 | Flags: discordgo.MessageFlagsEphemeral, 14 | } 15 | 16 | var roleResponseNotificationUpdated = &discordgo.MessageEmbed{ 17 | Description: "Role message updated", 18 | Color: interactor.ColorSuccess, 19 | } 20 | 21 | var roleResponseNotificationFailed = &discordgo.MessageEmbed{ 22 | Description: "Update failed as there already exist an message for this role + channel combination", 23 | Color: interactor.ColorError, 24 | } 25 | -------------------------------------------------------------------------------- /discord/discord.go: -------------------------------------------------------------------------------- 1 | package discord 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/config" 6 | "github.com/dignityofwar/digbot/core" 7 | "log" 8 | ) 9 | 10 | var Discord *discordgo.Session 11 | 12 | var Module = core.Module{ 13 | Name: "Discord", 14 | OnInit: func() { 15 | log.Println("Setting up Discord") 16 | 17 | var err error 18 | Discord, err = discordgo.New("Bot " + config.Discord.Token) 19 | Discord.Identify.Intents = 14219 20 | 21 | if err != nil { 22 | log.Fatalf("Invalid bot parameters: %v", err) 23 | } 24 | 25 | initSync() 26 | }, 27 | OnBoot: func() { 28 | log.Println("Connecting to Discord") 29 | 30 | if err := Discord.Open(); err != nil { 31 | log.Fatalf("Failed to open Discord session: %v", err) 32 | } 33 | }, 34 | OnDestroy: func() { 35 | Discord.Close() 36 | }, 37 | } 38 | -------------------------------------------------------------------------------- /.github/workflows/changesets.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | concurrency: ${{ github.workflow }}-${{ github.ref }} 9 | 10 | jobs: 11 | release: 12 | name: Release 13 | if: github.repository == 'dignityofwar/digbot' 14 | runs-on: ubuntu-latest 15 | environment: changesets 16 | steps: 17 | - uses: actions/checkout@v3 18 | with: 19 | ssh-key: "${{ secrets.COMMIT_KEY }}" 20 | - uses: actions/setup-node@v3 21 | with: 22 | node-version: 20.x 23 | cache: 'yarn' 24 | - run: yarn --frozen-lockfile 25 | - name: Create PR or release 26 | uses: changesets/action@v1 27 | with: 28 | commit: 'chore: release' 29 | title: 'Release Candidate' 30 | env: 31 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 32 | -------------------------------------------------------------------------------- /interactor/modal.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/bwmarrin/discordgo" 6 | "log" 7 | ) 8 | 9 | var modalHandlers = make(map[string]*modalDescriptor) 10 | 11 | func RegisterModal(options *ModalOptions) error { 12 | if _, found := modalHandlers[options.ModalID]; found { 13 | return errors.New("modalID needs to be unique") 14 | } 15 | 16 | if modal, err := options.convert(); err == nil { 17 | modalHandlers[options.ModalID] = modal 18 | } else { 19 | return err 20 | } 21 | 22 | log.Println("Registered modal: " + options.ModalID) 23 | 24 | return nil 25 | } 26 | 27 | func RegisterModals(options ...*ModalOptions) error { 28 | for _, option := range options { 29 | if err := RegisterModal(option); err != nil { 30 | return err 31 | } 32 | } 33 | 34 | return nil 35 | } 36 | 37 | func MakeModal(modal *Modal) *discordgo.InteractionResponse { 38 | return modalHandlers[modal.ModalID].make(modal) 39 | } 40 | -------------------------------------------------------------------------------- /interactor/context.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import "github.com/bwmarrin/discordgo" 4 | 5 | type Context struct { 6 | Session *discordgo.Session 7 | Interaction *discordgo.Interaction 8 | } 9 | 10 | func (c *Context) Respond(resp *discordgo.InteractionResponse) error { 11 | return c.Session.InteractionRespond(c.Interaction, resp) 12 | } 13 | 14 | func (c *Context) UpsertRespond(data *discordgo.InteractionResponseData) error { 15 | if c.Interaction.Message == nil { 16 | return c.Session.InteractionRespond(c.Interaction, &discordgo.InteractionResponse{ 17 | Type: discordgo.InteractionResponseChannelMessageWithSource, 18 | Data: data, 19 | }) 20 | } else { 21 | return c.Session.InteractionRespond(c.Interaction, &discordgo.InteractionResponse{ 22 | Type: discordgo.InteractionResponseUpdateMessage, 23 | Data: data, 24 | }) 25 | } 26 | } 27 | 28 | func (c *Context) ModalRespond(modal *Modal) error { 29 | return c.Session.InteractionRespond(c.Interaction, MakeModal(modal)) 30 | } 31 | -------------------------------------------------------------------------------- /interactor/modal_utils.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "reflect" 6 | "strconv" 7 | ) 8 | 9 | func resolveTextInputLabel(t reflect.StructField) string { 10 | if label, has := t.Tag.Lookup("label"); has { 11 | return label 12 | } 13 | 14 | return t.Name 15 | } 16 | 17 | func resolveTextInputStyle(t reflect.StructField) discordgo.TextInputStyle { 18 | switch t.Tag.Get("style") { 19 | case "": 20 | return discordgo.TextInputShort 21 | case "short": 22 | return discordgo.TextInputShort 23 | case "paragraph": 24 | return discordgo.TextInputParagraph 25 | } 26 | 27 | panic("nope nope nope") 28 | } 29 | 30 | func resolveTextInputMinLength(t reflect.StructField) int { 31 | if min, err := strconv.Atoi(t.Tag.Get("min")); err != nil { 32 | return min 33 | } 34 | 35 | return 0 36 | } 37 | 38 | func resolveTextInputMaxLength(t reflect.StructField) int { 39 | if max, err := strconv.Atoi(t.Tag.Get("max")); err != nil { 40 | return max 41 | } 42 | 43 | return 0 44 | } 45 | -------------------------------------------------------------------------------- /herald/handlers.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/db" 6 | ) 7 | 8 | func handleRoleAssign(s *discordgo.Session, m *discordgo.GuildMemberUpdate) { 9 | thisOne: 10 | for _, role := range m.Roles { 11 | for _, prev := range m.BeforeUpdate.Roles { 12 | if role == prev { 13 | continue thisOne 14 | } 15 | } 16 | 17 | var messages []RoleMessageEntity 18 | 19 | db.Connection.Where(&RoleMessageEntity{ 20 | MessageEntity: MessageEntity{GuildID: m.GuildID}, 21 | RoleID: role, 22 | }).Find(&messages) 23 | 24 | for _, message := range messages { 25 | 26 | message.send(s, m.Member) 27 | } 28 | } 29 | } 30 | 31 | func handleJoin(s *discordgo.Session, m *discordgo.GuildMemberAdd) { 32 | var messages []JoinMessageEntity 33 | 34 | db.Connection.Where(&JoinMessageEntity{ 35 | MessageEntity: MessageEntity{GuildID: m.GuildID}, 36 | }).Find(&messages) 37 | 38 | for _, message := range messages { 39 | message.send(s, m.Member) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /interactor/applicationcommand.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/dignityofwar/digbot/discord" 6 | "log" 7 | ) 8 | 9 | // TODO: split when CommandType is supported by discordgo 10 | var ( 11 | commandHandlers = make(map[string]commandExecuteDescriptor) 12 | ) 13 | 14 | func RegisterCommand(cmd Command, perms *CommandPermissions) (err error) { 15 | if discord.Discord.State.User == nil { 16 | return errors.New("cannot register command as Discord is not ready") 17 | } 18 | 19 | if perms == nil { 20 | perms = &CommandPermissions{} 21 | } 22 | 23 | ac, desc, err := cmd.compileCommand(perms) 24 | 25 | if _, found := commandHandlers[ac.Name]; found { 26 | return errors.New("command name needs to be unique") 27 | } 28 | 29 | if err != nil { 30 | return 31 | } 32 | 33 | res, err := discord.Discord.ApplicationCommandCreate(discord.Discord.State.User.ID, "", ac) 34 | 35 | if err != nil { 36 | return 37 | } 38 | 39 | log.Println("Registered command: " + ac.Name + "(" + res.Version + ")") 40 | 41 | commandHandlers[ac.Name] = desc 42 | 43 | return 44 | } 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 DIG Development Team 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "github.com/dignityofwar/digbot/core" 5 | "github.com/joho/godotenv" 6 | "log" 7 | "os" 8 | "reflect" 9 | ) 10 | 11 | var ( 12 | Discord struct { 13 | Token string `env:"DISCORD_TOKEN"` 14 | } 15 | 16 | DB struct { 17 | FilePath string `env:"DB_PATH" default:"./data/db.sqlite"` 18 | } 19 | ) 20 | 21 | var Module = core.Module{ 22 | Name: "Config", 23 | OnInit: func() { 24 | log.Println("Loading config") 25 | 26 | godotenv.Load() 27 | 28 | initConfigStruct(&Discord) 29 | initConfigStruct(&DB) 30 | }, 31 | } 32 | 33 | func initConfigStruct(config any) { 34 | configValue := reflect.ValueOf(config).Elem() 35 | configType := configValue.Type() 36 | 37 | for i := 0; i < configType.NumField(); i++ { 38 | fieldValue := configValue.Field(i) 39 | fieldType := configType.Field(i) 40 | 41 | // TODO: Add parsing to support int, float, bool, arrays 42 | fieldValue.SetString(fieldType.Tag.Get("default")) 43 | 44 | if key, ok := fieldType.Tag.Lookup("env"); ok { 45 | if value := os.Getenv(key); value != "" { 46 | fieldValue.SetString(value) 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /interactor/messagecomponent.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/bwmarrin/discordgo" 6 | "log" 7 | "reflect" 8 | ) 9 | 10 | // TODO: components per type questionmark? 11 | var messageComponentHandlers = make(map[string]*messageComponentDescriptor) 12 | 13 | func RegisterMessageComponent(cmp MessageComponent) error { 14 | cmpValue := reflect.ValueOf(cmp).Elem() 15 | cmpID := cmpValue.FieldByName("ComponentID").String() 16 | 17 | if _, found := messageComponentHandlers[cmpID]; found { 18 | return errors.New("componentID needs to be unique") 19 | } 20 | 21 | if desc, err := cmp.compileMessageComponent(); err == nil { 22 | messageComponentHandlers[cmpID] = desc 23 | } else { 24 | return err 25 | } 26 | 27 | log.Println("Registered component: " + cmpID) 28 | 29 | return nil 30 | } 31 | 32 | func RegisterMessageComponents(cmps ...MessageComponent) error { 33 | for _, cmp := range cmps { 34 | if err := RegisterMessageComponent(cmp); err != nil { 35 | return err 36 | } 37 | } 38 | 39 | return nil 40 | } 41 | 42 | func MakeMessageComponent(cmp *MessageComponentOptions) discordgo.MessageComponent { 43 | return messageComponentHandlers[cmp.ComponentID].ComponentGenerator(cmp) 44 | } 45 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | jobs: 9 | build: 10 | name: Release Docker image 11 | if: github.repository == 'dignityofwar/digbot' 12 | runs-on: ubuntu-latest 13 | environment: docker 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: Set up QEMU 18 | uses: docker/setup-qemu-action@v2 19 | 20 | - name: Set up Docker Buildx 21 | uses: docker/setup-buildx-action@v2 22 | 23 | - name: Login to Docker Hub 24 | uses: docker/login-action@v2 25 | with: 26 | username: ${{ secrets.DOCKER_HUB_USERNAME }} 27 | password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} 28 | 29 | - name: Docker meta 30 | id: meta 31 | uses: docker/metadata-action@v4 32 | with: 33 | images: dignityofwar/digbot 34 | tags: | 35 | type=semver,pattern={{version}} 36 | type=semver,pattern={{major}}.{{minor}} 37 | type=semver,pattern={{major}} 38 | 39 | - name: Build and push 40 | id: docker_build 41 | uses: docker/build-push-action@v4 42 | with: 43 | push: true 44 | platforms: linux/amd64,linux/arm64 45 | tags: ${{ steps.meta.outputs.tags }} 46 | labels: ${{ steps.meta.outputs.labels }} 47 | cache-from: type=gha 48 | cache-to: type=gha,mode=max 49 | 50 | - name: Image digest 51 | run: echo ${{ steps.docker_build.outputs.digest }} 52 | -------------------------------------------------------------------------------- /core/core.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | import ( 4 | "os" 5 | "os/signal" 6 | ) 7 | 8 | type Module struct { 9 | Name string 10 | OnInit func() 11 | OnBoot func() 12 | OnDestroy func() 13 | OnShutdown func() 14 | } 15 | 16 | type App struct { 17 | modules []Module 18 | initHooks []func() 19 | bootBooks []func() 20 | destroyHooks []func() 21 | shutdownHooks []func() 22 | } 23 | 24 | func CreateApp(modules []Module) (a *App) { 25 | a = &App{ 26 | modules: modules, 27 | } 28 | 29 | for _, module := range modules { 30 | if module.OnInit != nil { 31 | a.initHooks = append(a.initHooks, module.OnInit) 32 | } 33 | 34 | if module.OnBoot != nil { 35 | a.bootBooks = append(a.bootBooks, module.OnBoot) 36 | } 37 | 38 | if module.OnDestroy != nil { 39 | a.destroyHooks = append(a.destroyHooks, module.OnDestroy) 40 | } 41 | 42 | if module.OnShutdown != nil { 43 | a.shutdownHooks = append(a.shutdownHooks, module.OnShutdown) 44 | } 45 | } 46 | 47 | return 48 | } 49 | 50 | func (a *App) Start() { 51 | for _, initHook := range a.initHooks { 52 | initHook() 53 | } 54 | 55 | for _, bootHook := range a.bootBooks { 56 | bootHook() 57 | } 58 | } 59 | 60 | func (a *App) Close() { 61 | for _, destroyHook := range a.destroyHooks { 62 | destroyHook() 63 | } 64 | 65 | for _, shutdownHook := range a.shutdownHooks { 66 | shutdownHook() 67 | } 68 | } 69 | 70 | func (a *App) AwaitExit() { 71 | defer a.Close() 72 | 73 | stop := make(chan os.Signal, 1) 74 | signal.Notify(stop, os.Interrupt) 75 | <-stop 76 | } 77 | -------------------------------------------------------------------------------- /herald/join_commands.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/db" 6 | "github.com/dignityofwar/digbot/interactor" 7 | ) 8 | 9 | type JoinMessageParams struct { 10 | Channel *discordgo.Channel `description:"Send message to" channels:"GuildText"` 11 | } 12 | 13 | var joinCommands = &interactor.SlashCommandGroup{ 14 | Name: "join", 15 | Description: "Manage messages send when a new member joins the server", 16 | SubCommands: []interactor.CommandOptions{ 17 | &interactor.SlashCommand{ 18 | Name: "find", 19 | Description: "Find join message", 20 | Callback: func(ctx *interactor.CommandContext, params *JoinMessageParams) error { 21 | channelID := "" 22 | if params.Channel != nil { 23 | channelID = params.Channel.ID 24 | } 25 | 26 | var message JoinMessageEntity 27 | 28 | res := db.Connection.Where(JoinMessageEntity{ 29 | MessageEntity: MessageEntity{ 30 | GuildID: ctx.Interaction.GuildID, 31 | ChannelID: &channelID, 32 | }, 33 | }).First(&message) 34 | 35 | if res.Error == nil { 36 | return ctx.Respond(&discordgo.InteractionResponse{ 37 | Type: discordgo.InteractionResponseChannelMessageWithSource, 38 | Data: formatJoinMessageResponse(&ctx.Context, &message), 39 | }) 40 | 41 | } else { 42 | return ctx.ModalRespond(&interactor.Modal{ 43 | ModalID: createJoinMessageModalID, 44 | Title: "Create message", 45 | ID: channelID, 46 | }) 47 | } 48 | }, 49 | }, 50 | }, 51 | } 52 | -------------------------------------------------------------------------------- /herald/join_modals.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/dignityofwar/digbot/db" 5 | "github.com/dignityofwar/digbot/interactor" 6 | ) 7 | 8 | type EditJoinMessageParams struct { 9 | Message string `style:"paragraph" min:"1" max:"3500"` 10 | } 11 | 12 | const createJoinMessageModalID = "herald_join_create" 13 | 14 | var createJoinMessageModal = &interactor.ModalOptions{ 15 | ModalID: createJoinMessageModalID, 16 | Callback: func(ctx *interactor.ModalContext, params *EditJoinMessageParams) error { 17 | message := JoinMessageEntity{ 18 | MessageEntity: MessageEntity{ 19 | GuildID: ctx.Interaction.GuildID, 20 | ChannelID: &ctx.ID, 21 | Content: params.Message, 22 | }, 23 | } 24 | 25 | if err := db.Connection.Save(&message).Error; err != nil { 26 | return err 27 | } 28 | 29 | return ctx.UpsertRespond(formatJoinMessageResponse(&ctx.Context, &message)) 30 | }, 31 | } 32 | 33 | const editJoinMessageModalID = "herald_join_edit" 34 | 35 | var editJoinMessageModal = &interactor.ModalOptions{ 36 | ModalID: editJoinMessageModalID, 37 | Callback: func(ctx *interactor.ModalContext, params *EditJoinMessageParams) error { 38 | var message JoinMessageEntity 39 | 40 | if db.Connection.First(&message, ctx.ID).Error != nil { 41 | return ctx.UpsertRespond(joinResponseNotFound) 42 | } 43 | 44 | message.Content = params.Message 45 | 46 | if err := db.Connection.Save(&message).Error; err != nil { 47 | return err 48 | } 49 | 50 | return ctx.UpsertRespond(formatJoinMessageResponse(&ctx.Context, &message, joinResponseNotificationUpdated)) 51 | }, 52 | } 53 | -------------------------------------------------------------------------------- /interactor/modal_options.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/bwmarrin/discordgo" 6 | "reflect" 7 | ) 8 | 9 | type ModalOptions struct { 10 | ModalID string 11 | Title string 12 | Callback any 13 | } 14 | 15 | func (o *ModalOptions) convert() (modal *modalDescriptor, err error) { 16 | callbackValue := reflect.ValueOf(o.Callback) 17 | callbackType := callbackValue.Type() 18 | 19 | fields := reflect.VisibleFields(callbackType.In(1).Elem()) 20 | 21 | modal = &modalDescriptor{ 22 | Title: o.Title, 23 | Callback: callbackValue, 24 | ParamFieldMap: make(map[string]modalParamField, len(fields)), 25 | } 26 | 27 | for _, field := range fields { 28 | if field.Anonymous { 29 | continue 30 | } else if field.Type.Kind() != reflect.String { 31 | err = errors.New("") 32 | return 33 | } 34 | 35 | modal.ParamFieldMap[field.Name] = modalParamField{ 36 | ComponentPrototype: discordgo.TextInput{ 37 | CustomID: field.Name, 38 | Label: resolveTextInputLabel(field), 39 | Style: resolveTextInputStyle(field), 40 | Placeholder: field.Tag.Get("placeholder"), 41 | Required: field.Tag.Get("required") == "true", 42 | MinLength: resolveTextInputMinLength(field), 43 | MaxLength: resolveTextInputMaxLength(field), 44 | }, 45 | } 46 | } 47 | 48 | return 49 | } 50 | 51 | // 52 | // 53 | // 54 | 55 | type Modal struct { 56 | ModalID string 57 | ID string 58 | Title string 59 | Values any 60 | } 61 | 62 | func (m Modal) customID() string { 63 | return m.ModalID + idDelimiter + m.ID 64 | } 65 | -------------------------------------------------------------------------------- /herald/role_modals.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/dignityofwar/digbot/db" 5 | "github.com/dignityofwar/digbot/interactor" 6 | "strings" 7 | ) 8 | 9 | type EditRoleMessageParams struct { 10 | Message string `style:"paragraph" min:"1" max:"3500"` 11 | } 12 | 13 | const createRoleMessageModalID = "herald_role_create" 14 | 15 | var createRoleMessageModal = &interactor.ModalOptions{ 16 | ModalID: createRoleMessageModalID, 17 | Callback: func(ctx *interactor.ModalContext, params *EditRoleMessageParams) error { 18 | ids := strings.SplitN(ctx.ID, ":", 2) 19 | 20 | message := RoleMessageEntity{ 21 | MessageEntity: MessageEntity{ 22 | GuildID: ctx.Interaction.GuildID, 23 | ChannelID: &ids[1], 24 | Content: params.Message, 25 | }, 26 | RoleID: ids[0], 27 | } 28 | 29 | if err := db.Connection.Save(&message).Error; err != nil { 30 | return err 31 | } 32 | 33 | return ctx.UpsertRespond(formatRoleMessageResponse(&ctx.Context, &message)) 34 | }, 35 | } 36 | 37 | const editRoleMessageModalID = "herald_role_edit" 38 | 39 | var editRoleMessageModal = &interactor.ModalOptions{ 40 | ModalID: editRoleMessageModalID, 41 | Callback: func(ctx *interactor.ModalContext, params *EditRoleMessageParams) error { 42 | var message RoleMessageEntity 43 | 44 | if db.Connection.First(&message, ctx.ID).Error != nil { 45 | return ctx.UpsertRespond(roleResponseNotFound) 46 | } 47 | 48 | message.Content = params.Message 49 | 50 | if err := db.Connection.Save(&message).Error; err != nil { 51 | return err 52 | } 53 | 54 | return ctx.UpsertRespond(formatRoleMessageResponse(&ctx.Context, &message, roleResponseNotificationUpdated)) 55 | }, 56 | } 57 | -------------------------------------------------------------------------------- /herald/join_utils.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/interactor" 6 | "strconv" 7 | ) 8 | 9 | func formatJoinMessageResponse(ctx *interactor.Context, joinMessage *JoinMessageEntity, embeds ...*discordgo.MessageEmbed) *discordgo.InteractionResponseData { 10 | id := strconv.Itoa(int(joinMessage.ID)) 11 | channel := "DM" 12 | if *joinMessage.ChannelID != "" { 13 | channel = "<#" + *joinMessage.ChannelID + ">" 14 | } 15 | 16 | embeds = append(embeds, &discordgo.MessageEmbed{ 17 | Description: joinMessage.compile(ctx.Interaction.Member), 18 | Color: interactor.ColorPrimary, 19 | Fields: []*discordgo.MessageEmbedField{ 20 | { 21 | Name: "Channel", 22 | Value: channel, 23 | Inline: true, 24 | }, 25 | }, 26 | }) 27 | 28 | return &discordgo.InteractionResponseData{ 29 | Flags: discordgo.MessageFlagsEphemeral, 30 | Embeds: embeds, 31 | Components: []discordgo.MessageComponent{ 32 | discordgo.ActionsRow{ 33 | Components: []discordgo.MessageComponent{ 34 | interactor.MakeMessageComponent(&interactor.MessageComponentOptions{ 35 | ComponentID: joinMessageChannelSelectID, 36 | ID: id, 37 | }), 38 | }, 39 | }, 40 | discordgo.ActionsRow{ 41 | Components: []discordgo.MessageComponent{ 42 | interactor.MakeMessageComponent(&interactor.MessageComponentOptions{ 43 | ComponentID: editJoinMessageButtonID, 44 | ID: id, 45 | }), 46 | interactor.MakeMessageComponent(&interactor.MessageComponentOptions{ 47 | ComponentID: deleteJoinMessageButtonID, 48 | ID: id, 49 | }), 50 | }, 51 | }, 52 | }, 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /herald/role_commands.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/db" 6 | "github.com/dignityofwar/digbot/interactor" 7 | ) 8 | 9 | type RoleMessageParams struct { 10 | Role *discordgo.Role `description:"Trigger on assignment of" required:"true"` 11 | Channel *discordgo.Channel `description:"Send message to" channels:"GuildText"` 12 | } 13 | 14 | var roleCommands = &interactor.SlashCommandGroup{ 15 | Name: "role", 16 | Description: "Manage messages send when a member receives a role", 17 | SubCommands: []interactor.CommandOptions{ 18 | &interactor.SlashCommand{ 19 | Name: "find", 20 | Description: "Find role message", 21 | Callback: func(ctx *interactor.CommandContext, params *RoleMessageParams) error { 22 | channelID := "" 23 | if params.Channel != nil { 24 | channelID = params.Channel.ID 25 | } 26 | 27 | var message RoleMessageEntity 28 | 29 | res := db.Connection.Where(RoleMessageEntity{ 30 | MessageEntity: MessageEntity{ 31 | GuildID: ctx.Interaction.GuildID, 32 | ChannelID: &channelID, 33 | }, 34 | RoleID: params.Role.ID, 35 | }).First(&message) 36 | 37 | if res.Error == nil { 38 | return ctx.Respond(&discordgo.InteractionResponse{ 39 | Type: discordgo.InteractionResponseChannelMessageWithSource, 40 | Data: formatRoleMessageResponse(&ctx.Context, &message), 41 | }) 42 | 43 | } else { 44 | return ctx.ModalRespond(&interactor.Modal{ 45 | ModalID: createRoleMessageModalID, 46 | Title: "Create message", 47 | ID: params.Role.ID + ":" + channelID, 48 | }) 49 | } 50 | }, 51 | }, 52 | }, 53 | } 54 | -------------------------------------------------------------------------------- /herald/herald.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/core" 6 | "github.com/dignityofwar/digbot/db" 7 | "github.com/dignityofwar/digbot/discord" 8 | "github.com/dignityofwar/digbot/interactor" 9 | "log" 10 | ) 11 | 12 | var Module = core.Module{ 13 | Name: "Herald", 14 | OnInit: func() { 15 | if err := db.Connection.AutoMigrate(&RoleMessageEntity{}, &JoinMessageEntity{}); err != nil { 16 | log.Fatalf("Unable to migrate messenger entities: %v", err) 17 | } 18 | 19 | discord.Discord.AddHandler(func(s *discordgo.Session, m *discordgo.GuildMemberUpdate) { 20 | handleRoleAssign(s, m) 21 | }) 22 | 23 | discord.Discord.AddHandler(func(s *discordgo.Session, m *discordgo.GuildMemberAdd) { 24 | handleJoin(s, m) 25 | }) 26 | }, 27 | OnBoot: func() { 28 | err := interactor.RegisterCommand(&interactor.SlashCommandGroup{ 29 | Name: "herald", 30 | Description: "Manage automated messages send by the bot", 31 | SubCommands: []interactor.CommandOptions{ 32 | roleCommands, 33 | joinCommands, 34 | }, 35 | }, &interactor.CommandPermissions{ 36 | DefaultMemberPermissions: ptr[int64](0), 37 | DMPermission: ptr(false), 38 | }) 39 | 40 | if err != nil { 41 | log.Fatalf(err.Error()) 42 | } 43 | 44 | if err := interactor.RegisterMessageComponents( 45 | editRoleMessageButton, 46 | deleteRoleMessageButton, 47 | roleMessageRoleSelect, 48 | roleMessageChannelSelect, 49 | editJoinMessageButton, 50 | deleteJoinMessageButton, 51 | joinMessageChannelSelect, 52 | ); err != nil { 53 | log.Fatalf(err.Error()) 54 | } 55 | 56 | if err := interactor.RegisterModals( 57 | createRoleMessageModal, 58 | editRoleMessageModal, 59 | createJoinMessageModal, 60 | editJoinMessageModal, 61 | ); err != nil { 62 | log.Fatalf(err.Error()) 63 | } 64 | }, 65 | } 66 | -------------------------------------------------------------------------------- /interactor/applicationcommand_structs.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/bwmarrin/discordgo" 6 | "reflect" 7 | ) 8 | 9 | type CommandContext struct { 10 | Context 11 | Data *discordgo.ApplicationCommandInteractionData 12 | } 13 | 14 | type commandExecuteDescriptor interface { 15 | execute(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) error 16 | } 17 | 18 | // 19 | // 20 | // 21 | 22 | type versionedCommandDescriptor struct { 23 | commandDescriptor 24 | Version int 25 | } 26 | 27 | func (d *versionedCommandDescriptor) execute(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) error { 28 | if d.Version != ctx.Interaction.Version { 29 | return errors.New("command version mismatch") 30 | } 31 | 32 | return d.commandDescriptor.execute(ctx, options) 33 | } 34 | 35 | // 36 | // 37 | // 38 | 39 | type commandParamGenerator func(*CommandContext, []*discordgo.ApplicationCommandInteractionDataOption) reflect.Value 40 | 41 | type commandDescriptor struct { 42 | Callback reflect.Value 43 | ParamGenerator commandParamGenerator 44 | } 45 | 46 | func (d *commandDescriptor) execute(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) error { 47 | args := []reflect.Value{ 48 | reflect.ValueOf(ctx), 49 | } 50 | if d.ParamGenerator != nil { 51 | args = append(args, d.ParamGenerator(ctx, options)) 52 | } 53 | 54 | if err := captureError(d.Callback.Call(args)); err != nil { 55 | return err 56 | } 57 | 58 | return nil 59 | } 60 | 61 | // 62 | // 63 | // 64 | 65 | type commandGroupDescriptor struct { 66 | SubCommands map[string]commandExecuteDescriptor 67 | } 68 | 69 | func (d *commandGroupDescriptor) execute(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) error { 70 | return d.SubCommands[options[0].Name].execute(ctx, options[0].Options) 71 | } 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | # DigBot 5 | 6 | [![GitHub release (latest by date)](https://img.shields.io/github/v/release/dignityofwar/digbot?label=version)](https://github.com/dignityofwar/digbot/releases) 7 | [![GitHub](https://img.shields.io/github/license/dignityofwar/digbot)](https://github.com/dignityofwar/digbot/blob/main/LICENSE) 8 |
9 | 10 | ## About 11 | 12 | DigBot is a custom discord bot ran on the [DIG community's discord server](https://discord.gg/cjQBNpc), it was 13 | originally created to fulfil all the functionality of the current bots that were on the server and allow the community 14 | to implement any feature's they desired. 15 | 16 | ## Usage 17 | 18 | DigBot is releases as a Docker image on [Docker Hub](https://hub.docker.com/r/dignityofwar/digbot). Pull the latest 19 | version using `docker pull dignityofwar/digbot:latest`. 20 | 21 | To configure DigBot the following environment variables: 22 | 23 | - `DISCORD_TOKEN`: a Discord Bot application token, which can be created in 24 | the [Discord developer portal](https://discord.com/developers/applications); 25 | - `DB_PATH`: path to the Sqlite database file. 26 | 27 | ## Code Usage 28 | 29 | The project is open-sourced under the [MIT license](LICENSE). 30 | 31 | ## Acknowledgements 32 | 33 | This repository was created from 34 | an [existing private codebase](https://github.com/JamesLongman/DIGBot/releases/tag/0.0.1). The previous project was 35 | headed by Maelstromeous who was ultimately responsible for code review, design decisions and deployment. 36 | 37 | File contributions were as follows 38 | Maelstromeous: 510 commits, 7,623 additions, 6,378 deletions 39 | JamesLongman: 459 commits, 30,076 additions, 18,144 deletions 40 | Euwas: 37 commits, 1,982 additions, 1040 deletions 41 | CptCannonFodder: 10 commits, 22 additions, 16 deletions 42 | Blacky704: 3 commits, 29 additions, 8 deletions 43 | -------------------------------------------------------------------------------- /interactor/modal_structs.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "reflect" 6 | ) 7 | 8 | type ModalContext struct { 9 | Context 10 | Data *discordgo.ModalSubmitInteractionData 11 | ID string 12 | } 13 | 14 | type modalDescriptor struct { 15 | Title string 16 | Callback reflect.Value 17 | ParamFieldMap map[string]modalParamField 18 | } 19 | 20 | func (m *modalDescriptor) handle(ctx *ModalContext) error { 21 | paramsValue := reflect.New(m.Callback.Type().In(1).Elem()) 22 | 23 | for _, component := range ctx.Data.Components { 24 | input := component.(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) 25 | 26 | paramsValue.Elem().FieldByName(input.CustomID).SetString(input.Value) 27 | } 28 | 29 | args := []reflect.Value{reflect.ValueOf(ctx), paramsValue} 30 | 31 | if err := captureError(m.Callback.Call(args)); err != nil { 32 | return err 33 | } 34 | 35 | return nil 36 | } 37 | 38 | func (m *modalDescriptor) make(modal *Modal) *discordgo.InteractionResponse { 39 | components := make([]discordgo.MessageComponent, 0, len(m.ParamFieldMap)) 40 | values := reflect.ValueOf(modal.Values) 41 | hasValues := values.Kind() == reflect.Struct 42 | 43 | for fieldName, field := range m.ParamFieldMap { 44 | value := "" 45 | if hasValues { 46 | value = values.FieldByName(fieldName).String() 47 | } 48 | 49 | components = append(components, discordgo.ActionsRow{ 50 | Components: []discordgo.MessageComponent{field.make(value)}, 51 | }) 52 | } 53 | 54 | return &discordgo.InteractionResponse{ 55 | Type: discordgo.InteractionResponseModal, 56 | Data: &discordgo.InteractionResponseData{ 57 | CustomID: modal.customID(), 58 | Title: modal.Title, 59 | Components: components, 60 | }, 61 | } 62 | } 63 | 64 | type modalParamField struct { 65 | ComponentPrototype discordgo.TextInput 66 | } 67 | 68 | func (f *modalParamField) make(value string) discordgo.TextInput { 69 | input := f.ComponentPrototype 70 | 71 | input.Value = value 72 | 73 | return input 74 | } 75 | -------------------------------------------------------------------------------- /herald/role_utils.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/interactor" 6 | "strconv" 7 | ) 8 | 9 | func formatRoleMessageResponse(ctx *interactor.Context, roleMessage *RoleMessageEntity, embeds ...*discordgo.MessageEmbed) *discordgo.InteractionResponseData { 10 | id := strconv.Itoa(int(roleMessage.ID)) 11 | channel := "DM" 12 | if *roleMessage.ChannelID != "" { 13 | channel = "<#" + *roleMessage.ChannelID + ">" 14 | } 15 | 16 | embeds = append(embeds, &discordgo.MessageEmbed{ 17 | Description: roleMessage.compile(ctx.Interaction.Member), 18 | Color: interactor.ColorPrimary, 19 | Fields: []*discordgo.MessageEmbedField{ 20 | { 21 | Name: "Role", 22 | Value: "<@&" + roleMessage.RoleID + ">", 23 | Inline: true, 24 | }, 25 | { 26 | Name: "Channel", 27 | Value: channel, 28 | Inline: true, 29 | }, 30 | }, 31 | }) 32 | 33 | return &discordgo.InteractionResponseData{ 34 | Flags: discordgo.MessageFlagsEphemeral, 35 | Embeds: embeds, 36 | Components: []discordgo.MessageComponent{ 37 | discordgo.ActionsRow{ 38 | Components: []discordgo.MessageComponent{ 39 | interactor.MakeMessageComponent(&interactor.MessageComponentOptions{ 40 | ComponentID: roleMessageRoleSelectID, 41 | ID: id, 42 | }), 43 | }, 44 | }, 45 | discordgo.ActionsRow{ 46 | Components: []discordgo.MessageComponent{ 47 | interactor.MakeMessageComponent(&interactor.MessageComponentOptions{ 48 | ComponentID: roleMessageChannelSelectID, 49 | ID: id, 50 | }), 51 | }, 52 | }, 53 | discordgo.ActionsRow{ 54 | Components: []discordgo.MessageComponent{ 55 | interactor.MakeMessageComponent(&interactor.MessageComponentOptions{ 56 | ComponentID: editRoleMessageButtonID, 57 | ID: id, 58 | }), 59 | interactor.MakeMessageComponent(&interactor.MessageComponentOptions{ 60 | ComponentID: deleteRoleMessageButtonID, 61 | ID: id, 62 | }), 63 | }, 64 | }, 65 | }, 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /interactor/messagecomponent_structs.ts.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "fmt" 5 | "github.com/bwmarrin/discordgo" 6 | "reflect" 7 | ) 8 | 9 | type MessageComponentContext struct { 10 | Context 11 | Data *discordgo.MessageComponentInteractionData 12 | ID string 13 | } 14 | 15 | type messageComponentDescriptor struct { 16 | Callback reflect.Value 17 | ComponentGenerator func(cmp *MessageComponentOptions) discordgo.MessageComponent 18 | } 19 | 20 | func (c *messageComponentDescriptor) handle(ctx *MessageComponentContext) error { 21 | args := []reflect.Value{reflect.ValueOf(ctx)} 22 | 23 | if ctx.Data.Values != nil { 24 | value, err := c.resolveValues(ctx) 25 | if err != nil { 26 | return err 27 | } 28 | 29 | args = append(args, value) 30 | } 31 | 32 | if err := captureError(c.Callback.Call(args)); err != nil { 33 | return err 34 | } 35 | 36 | return nil 37 | } 38 | 39 | func (c *messageComponentDescriptor) resolveValues(ctx *MessageComponentContext) (reflect.Value, error) { 40 | switch ctx.Data.ComponentType { 41 | //case discordgo.ActionsRowComponent: 42 | //case discordgo.ButtonComponent: 43 | case discordgo.SelectMenuComponent: 44 | return reflect.ValueOf(ctx.Data.Values), nil 45 | //case discordgo.TextInputComponent: 46 | case discordgo.UserSelectMenuComponent: 47 | return reflect.ValueOf(mapToArray(ctx.Data.Resolved.Users)), nil 48 | case discordgo.RoleSelectMenuComponent: 49 | return reflect.ValueOf(mapToArray(ctx.Data.Resolved.Roles)), nil 50 | case discordgo.MentionableSelectMenuComponent: 51 | mentionables := make([]Mentionable, len(ctx.Data.Values)) 52 | 53 | for i, id := range ctx.Data.Values { 54 | mentionables[i] = Mentionable{ 55 | id: id, 56 | resolvedUsers: ctx.Data.Resolved.Users, 57 | resolvedMembers: ctx.Data.Resolved.Members, 58 | resolvedRoles: ctx.Data.Resolved.Roles, 59 | } 60 | } 61 | 62 | return reflect.ValueOf(mentionables), nil 63 | case discordgo.ChannelSelectMenuComponent: 64 | return reflect.ValueOf(mapToArray(ctx.Data.Resolved.Channels)), nil 65 | } 66 | 67 | return reflect.Value{}, fmt.Errorf("unable to resolveValue values due to unsupported component type %d", ctx.Data.ComponentType) 68 | } 69 | -------------------------------------------------------------------------------- /herald/models.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "fmt" 5 | "github.com/bwmarrin/discordgo" 6 | "github.com/dignityofwar/digbot/discord" 7 | "log" 8 | "strings" 9 | "time" 10 | ) 11 | 12 | type MessageEntity struct { 13 | ID uint `gorm:"primaryKey"` 14 | GuildID string `gorm:"not null;index:,unique,composite:umc"` 15 | GuildRef *discord.GuildRef `gorm:"foreignKey:GuildID"` 16 | ChannelID *string `gorm:"index:,unique,composite:umc"` 17 | ChannelRef *discord.ChannelRef `gorm:"foreignKey:ChannelID"` 18 | Content string `gorm:"not null"` 19 | 20 | CreatedAt time.Time 21 | UpdatedAt time.Time 22 | } 23 | 24 | type RoleMessageEntity struct { 25 | MessageEntity `gorm:"embedded"` 26 | 27 | RoleID string `gorm:"not null;index:,unique,composite:umc"` 28 | RoleRef discord.RoleRef `gorm:"foreignKey:RoleID"` 29 | } 30 | 31 | type JoinMessageEntity struct { 32 | MessageEntity `gorm:"embedded"` 33 | } 34 | 35 | func (msg *MessageEntity) compile(member *discordgo.Member) string { 36 | compiledMessage := strings.ReplaceAll(msg.Content, "@member", member.Mention()) 37 | compiledMessage = strings.ReplaceAll(compiledMessage, "@username", member.User.Username) 38 | if member.Nick == "" { 39 | compiledMessage = strings.ReplaceAll(compiledMessage, "@name", member.User.Username) 40 | } else { 41 | compiledMessage = strings.ReplaceAll(compiledMessage, "@name", member.Nick) 42 | } 43 | 44 | return compiledMessage 45 | } 46 | 47 | func (msg *MessageEntity) send(s *discordgo.Session, member *discordgo.Member) { 48 | embed := &discordgo.MessageEmbed{ 49 | Description: msg.compile(member), 50 | } 51 | 52 | channelID := "" 53 | if *msg.ChannelID == "" { 54 | userChannel, err := s.UserChannelCreate(member.User.ID) 55 | if err != nil { 56 | log.Fatalf("Failed to create user channel: %v", err) 57 | } 58 | 59 | guild, _ := s.State.Guild(member.GuildID) 60 | 61 | channelID = userChannel.ID 62 | embed.Footer = &discordgo.MessageEmbedFooter{ 63 | Text: fmt.Sprintf("Welcome message from %s", guild.Name), 64 | IconURL: guild.IconURL("128"), 65 | } 66 | } else { 67 | channelID = *msg.ChannelID 68 | } 69 | 70 | _, err := s.ChannelMessageSendComplex(channelID, &discordgo.MessageSend{ 71 | Embed: embed, 72 | }) 73 | 74 | if err != nil { 75 | log.Fatalf("Failed to send message: %v", err) 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= 2 | github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= 3 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 4 | github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= 5 | github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 6 | github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= 7 | github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= 8 | github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= 9 | github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 10 | github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= 11 | github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= 12 | github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= 13 | github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= 14 | golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 15 | golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= 16 | golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 17 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 18 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 19 | golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= 20 | golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 21 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 22 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 23 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 24 | gorm.io/driver/sqlite v1.5.3 h1:7/0dUgX28KAcopdfbRWWl68Rflh6osa4rDh+m51KL2g= 25 | gorm.io/driver/sqlite v1.5.3/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4= 26 | gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= 27 | gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= 28 | -------------------------------------------------------------------------------- /herald/join_components.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/db" 6 | "github.com/dignityofwar/digbot/interactor" 7 | "github.com/mattn/go-sqlite3" 8 | ) 9 | 10 | const editJoinMessageButtonID = "herald_join_edit" 11 | 12 | var editJoinMessageButton = &interactor.ButtonOptions{ 13 | ComponentID: editJoinMessageButtonID, 14 | Style: discordgo.PrimaryButton, 15 | Label: "Edit", 16 | Callback: func(ctx *interactor.MessageComponentContext) error { 17 | return ctx.ModalRespond(&interactor.Modal{ 18 | ModalID: editJoinMessageModalID, 19 | ID: ctx.ID, 20 | Title: "Create message", 21 | }) 22 | }, 23 | } 24 | 25 | // 26 | // 27 | // 28 | 29 | const deleteJoinMessageButtonID = "herald_join_delete" 30 | 31 | var deleteJoinMessageButton = &interactor.ButtonOptions{ 32 | ComponentID: deleteJoinMessageButtonID, 33 | Style: discordgo.DangerButton, 34 | Label: "Delete", 35 | Callback: func(ctx *interactor.MessageComponentContext) error { 36 | db.Connection.Delete(&JoinMessageEntity{}, ctx.ID) 37 | 38 | return ctx.Respond(&discordgo.InteractionResponse{ 39 | Type: discordgo.InteractionResponseUpdateMessage, 40 | Data: &discordgo.InteractionResponseData{ 41 | Embeds: []*discordgo.MessageEmbed{ 42 | { 43 | Color: interactor.ColorSuccess, 44 | Description: "Message deleted", 45 | }, 46 | }, 47 | }, 48 | }) 49 | }, 50 | } 51 | 52 | // 53 | // 54 | // 55 | 56 | const joinMessageChannelSelectID = "herald_join_channel" 57 | 58 | var joinMessageChannelSelect = &interactor.SelectMenuOptions{ 59 | ComponentID: joinMessageChannelSelectID, 60 | Placeholder: "Change channel", 61 | MinValues: ptr(0), 62 | MaxValues: 1, 63 | ChannelTypes: []discordgo.ChannelType{ 64 | discordgo.ChannelTypeGuildText, 65 | }, 66 | Callback: func(ctx *interactor.MessageComponentContext, values []*discordgo.Channel) error { 67 | var message JoinMessageEntity 68 | if db.Connection.First(&message, ctx.ID).Error != nil { 69 | return ctx.UpsertRespond(joinResponseNotFound) 70 | } 71 | 72 | updatedMessage := message 73 | 74 | if len(values) == 0 { 75 | updatedMessage.ChannelID = ptr("") 76 | } else { 77 | updatedMessage.ChannelID = &values[0].ID 78 | } 79 | 80 | if err := db.Connection.Save(updatedMessage).Error; err != nil { 81 | switch err.(sqlite3.Error).ExtendedCode { 82 | case sqlite3.ErrConstraintUnique: 83 | return ctx.Respond(&discordgo.InteractionResponse{ 84 | Type: discordgo.InteractionResponseUpdateMessage, 85 | Data: formatJoinMessageResponse(&ctx.Context, &message, joinResponseNotificationFailed), 86 | }) 87 | } 88 | 89 | return err 90 | } 91 | 92 | return ctx.Respond(&discordgo.InteractionResponse{ 93 | Type: discordgo.InteractionResponseUpdateMessage, 94 | Data: formatJoinMessageResponse(&ctx.Context, &updatedMessage, joinResponseNotificationUpdated), 95 | }) 96 | }, 97 | } 98 | -------------------------------------------------------------------------------- /discord/sync.go: -------------------------------------------------------------------------------- 1 | package discord 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/db" 6 | "gorm.io/gorm/clause" 7 | "log" 8 | "time" 9 | ) 10 | 11 | type GuildRef struct { 12 | ID string `gorm:"primaryKey"` 13 | InactiveSince *time.Time 14 | } 15 | 16 | type ChannelRef struct { 17 | ID string `gorm:"primaryKey"` 18 | GuildID string `gorm:"primaryKey"` 19 | Available bool 20 | Guild GuildRef `gorm:"constraint:OnDelete:CASCADE"` 21 | } 22 | 23 | type RoleRef struct { 24 | ID string `gorm:"primaryKey"` 25 | GuildID string `gorm:"primaryKey"` 26 | Available bool 27 | Guild GuildRef `gorm:"constraint:OnDelete:CASCADE"` 28 | } 29 | 30 | func initSync() { 31 | if err := db.Connection.AutoMigrate(&GuildRef{}, &ChannelRef{}, &RoleRef{}); err != nil { 32 | log.Fatalf("Failed to migrate sync to db: %v", err) 33 | } 34 | 35 | now := time.Now() 36 | 37 | db.Connection.Where(&GuildRef{InactiveSince: &time.Time{}}).Updates(&GuildRef{ 38 | InactiveSince: &now, 39 | }) 40 | 41 | Discord.AddHandler(func(s *discordgo.Session, g *discordgo.GuildCreate) { 42 | log.Printf("Guild became available: %s(%s) %t\n", g.Name, g.ID, g.Unavailable) 43 | 44 | db.Connection.Clauses(clause.OnConflict{ 45 | UpdateAll: true, 46 | }).Create(&GuildRef{ 47 | ID: g.ID, 48 | InactiveSince: nil, 49 | }) 50 | 51 | { 52 | db.Connection.Where(&ChannelRef{GuildID: g.ID}).Updates(&ChannelRef{Available: false}) 53 | 54 | channels := make([]ChannelRef, len(g.Channels)) 55 | for i, c := range g.Channels { 56 | channels[i] = ChannelRef{ 57 | ID: c.ID, 58 | GuildID: g.ID, 59 | Available: true, 60 | } 61 | } 62 | 63 | db.Connection.Clauses(clause.OnConflict{ 64 | UpdateAll: true, 65 | }).Create(&channels) 66 | } 67 | { 68 | db.Connection.Where(&RoleRef{GuildID: g.ID}).Update("available", false) 69 | 70 | roles := make([]RoleRef, len(g.Roles)) 71 | for i, r := range g.Roles { 72 | roles[i] = RoleRef{ 73 | ID: r.ID, 74 | GuildID: g.ID, 75 | Available: true, 76 | } 77 | } 78 | 79 | db.Connection.Clauses(clause.OnConflict{ 80 | UpdateAll: true, 81 | }).Create(&roles) 82 | } 83 | }) 84 | 85 | Discord.AddHandler(func(s *discordgo.Session, g *discordgo.GuildDelete) { 86 | if g.Unavailable { 87 | now := time.Now() 88 | 89 | db.Connection.Save(&GuildRef{ 90 | ID: g.ID, 91 | InactiveSince: &now, 92 | }) 93 | } else { 94 | db.Connection.Delete(GuildRef{}, g.ID) 95 | } 96 | }) 97 | 98 | Discord.AddHandler(func(s *discordgo.Session, c *discordgo.ChannelCreate) { 99 | db.Connection.Save(&ChannelRef{ 100 | ID: c.ID, 101 | GuildID: c.GuildID, 102 | Available: true, 103 | }) 104 | }) 105 | 106 | Discord.AddHandler(func(s *discordgo.Session, c *discordgo.ChannelDelete) { 107 | db.Connection.Delete(&ChannelRef{ 108 | ID: c.ID, 109 | GuildID: c.GuildID, 110 | }) 111 | }) 112 | 113 | Discord.AddHandler(func(s *discordgo.Session, r *discordgo.GuildRoleCreate) { 114 | db.Connection.Save(&RoleRef{ 115 | ID: r.Role.ID, 116 | GuildID: r.GuildID, 117 | }) 118 | }) 119 | 120 | Discord.AddHandler(func(s *discordgo.Session, r *discordgo.GuildRoleDelete) { 121 | db.Connection.Delete(&RoleRef{ 122 | ID: r.RoleID, 123 | GuildID: r.GuildID, 124 | }) 125 | }) 126 | 127 | } 128 | -------------------------------------------------------------------------------- /interactor/messagecomponent_options.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/bwmarrin/discordgo" 6 | "reflect" 7 | ) 8 | 9 | type MessageComponent interface { 10 | compileMessageComponent() (*messageComponentDescriptor, error) 11 | } 12 | 13 | // 14 | // 15 | // 16 | 17 | type ButtonOptions struct { 18 | ComponentID string 19 | Callback any 20 | 21 | Label string 22 | Style discordgo.ButtonStyle 23 | Emoji discordgo.ComponentEmoji 24 | } 25 | 26 | func (o *ButtonOptions) compileMessageComponent() (cmp *messageComponentDescriptor, err error) { 27 | callbackValue := reflect.ValueOf(o.Callback) 28 | callbackType := callbackValue.Type() 29 | 30 | if callbackValue.Kind() != reflect.Func { 31 | err = errors.New("callback needs to be of kind func") 32 | return 33 | } else if callbackType.NumIn() > 1 { 34 | err = errors.New("too many arguments") 35 | return 36 | } else if callbackType.NumIn() < 1 || callbackType.In(0) != reflect.TypeOf((*MessageComponentContext)(nil)) { 37 | err = errors.New("first argument need to be an a pointer to the component context") 38 | return 39 | } 40 | 41 | cmp = &messageComponentDescriptor{ 42 | ComponentGenerator: func(cmp *MessageComponentOptions) discordgo.MessageComponent { 43 | return discordgo.Button{ 44 | CustomID: cmp.customID(), 45 | Disabled: cmp.Disabled, 46 | Label: o.Label, 47 | Style: o.Style, 48 | Emoji: o.Emoji, 49 | } 50 | }, 51 | Callback: callbackValue, 52 | } 53 | 54 | return 55 | } 56 | 57 | // 58 | // 59 | // 60 | 61 | type SelectMenuOptions struct { 62 | ComponentID string 63 | Callback any 64 | 65 | Placeholder string 66 | MinValues *int 67 | MaxValues int 68 | Options []discordgo.SelectMenuOption 69 | ChannelTypes []discordgo.ChannelType 70 | } 71 | 72 | func (o *SelectMenuOptions) compileMessageComponent() (cmp *messageComponentDescriptor, err error) { 73 | callbackValue := reflect.ValueOf(o.Callback) 74 | callbackType := callbackValue.Type() 75 | 76 | componentType, err := o.resolveType(callbackType.In(1).Elem()) 77 | if err != nil { 78 | return 79 | } 80 | 81 | cmp = &messageComponentDescriptor{ 82 | ComponentGenerator: func(cmp *MessageComponentOptions) discordgo.MessageComponent { 83 | return discordgo.SelectMenu{ 84 | MenuType: componentType, 85 | CustomID: cmp.customID(), 86 | Disabled: cmp.Disabled, 87 | Placeholder: o.Placeholder, 88 | MinValues: o.MinValues, 89 | MaxValues: o.MaxValues, 90 | Options: o.Options, 91 | ChannelTypes: o.ChannelTypes, 92 | } 93 | }, 94 | Callback: callbackValue, 95 | } 96 | 97 | return 98 | } 99 | 100 | func (o *SelectMenuOptions) resolveType(i reflect.Type) (discordgo.SelectMenuType, error) { 101 | switch i { 102 | case reflect.TypeOf(""): 103 | return discordgo.StringSelectMenu, nil 104 | case reflect.TypeOf((*discordgo.User)(nil)): 105 | return discordgo.UserSelectMenu, nil 106 | case reflect.TypeOf((*discordgo.Role)(nil)): 107 | return discordgo.RoleSelectMenu, nil 108 | case reflect.TypeOf(Mentionable{}): 109 | return discordgo.MentionableSelectMenu, nil 110 | case reflect.TypeOf((*discordgo.Channel)(nil)): 111 | return discordgo.ChannelSelectMenu, nil 112 | } 113 | 114 | return 0, errors.New("") 115 | } 116 | 117 | // 118 | // 119 | // 120 | 121 | type MessageComponentOptions struct { 122 | ComponentID string 123 | ID string 124 | Disabled bool 125 | } 126 | 127 | func (o MessageComponentOptions) customID() string { 128 | return o.ComponentID + idDelimiter + o.ID 129 | } 130 | -------------------------------------------------------------------------------- /herald/role_components.go: -------------------------------------------------------------------------------- 1 | package herald 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "github.com/dignityofwar/digbot/db" 6 | "github.com/dignityofwar/digbot/interactor" 7 | "github.com/mattn/go-sqlite3" 8 | ) 9 | 10 | const editRoleMessageButtonID = "herald_role_edit" 11 | 12 | var editRoleMessageButton = &interactor.ButtonOptions{ 13 | ComponentID: editRoleMessageButtonID, 14 | Style: discordgo.PrimaryButton, 15 | Label: "Edit", 16 | Callback: func(ctx *interactor.MessageComponentContext) error { 17 | return ctx.ModalRespond(&interactor.Modal{ 18 | ModalID: editRoleMessageModalID, 19 | ID: ctx.ID, 20 | Title: "Create message", 21 | }) 22 | }, 23 | } 24 | 25 | // 26 | // 27 | // 28 | 29 | const deleteRoleMessageButtonID = "herald_role_delete" 30 | 31 | var deleteRoleMessageButton = &interactor.ButtonOptions{ 32 | ComponentID: deleteRoleMessageButtonID, 33 | Style: discordgo.DangerButton, 34 | Label: "Delete", 35 | Callback: func(ctx *interactor.MessageComponentContext) error { 36 | db.Connection.Delete(&RoleMessageEntity{}, ctx.ID) 37 | 38 | return ctx.Respond(&discordgo.InteractionResponse{ 39 | Type: discordgo.InteractionResponseUpdateMessage, 40 | Data: &discordgo.InteractionResponseData{ 41 | Embeds: []*discordgo.MessageEmbed{ 42 | { 43 | Color: interactor.ColorSuccess, 44 | Description: "Message deleted", 45 | }, 46 | }, 47 | }, 48 | }) 49 | }, 50 | } 51 | 52 | // 53 | // 54 | // 55 | 56 | const roleMessageRoleSelectID = "herald_role_role" 57 | 58 | var roleMessageRoleSelect = &interactor.SelectMenuOptions{ 59 | ComponentID: roleMessageRoleSelectID, 60 | Placeholder: "Change role", 61 | MinValues: ptr(1), 62 | MaxValues: 1, 63 | Callback: func(ctx *interactor.MessageComponentContext, values []*discordgo.Role) error { 64 | var message RoleMessageEntity 65 | if db.Connection.First(&message, ctx.ID).Error != nil { 66 | return ctx.UpsertRespond(roleResponseNotFound) 67 | } 68 | 69 | updatedMessage := message 70 | 71 | updatedMessage.RoleID = values[0].ID 72 | 73 | if err := db.Connection.Save(updatedMessage).Error; err != nil { 74 | switch err.(sqlite3.Error).ExtendedCode { 75 | case sqlite3.ErrConstraintUnique: 76 | return ctx.Respond(&discordgo.InteractionResponse{ 77 | Type: discordgo.InteractionResponseUpdateMessage, 78 | Data: formatRoleMessageResponse(&ctx.Context, &message, roleResponseNotificationFailed), 79 | }) 80 | } 81 | 82 | return err 83 | } 84 | 85 | return ctx.Respond(&discordgo.InteractionResponse{ 86 | Type: discordgo.InteractionResponseUpdateMessage, 87 | Data: formatRoleMessageResponse(&ctx.Context, &updatedMessage, roleResponseNotificationUpdated), 88 | }) 89 | }, 90 | } 91 | 92 | // 93 | // 94 | // 95 | 96 | const roleMessageChannelSelectID = "herald_role_channel" 97 | 98 | var roleMessageChannelSelect = &interactor.SelectMenuOptions{ 99 | ComponentID: roleMessageChannelSelectID, 100 | Placeholder: "Change channel", 101 | MinValues: ptr(0), 102 | MaxValues: 1, 103 | ChannelTypes: []discordgo.ChannelType{ 104 | discordgo.ChannelTypeGuildText, 105 | }, 106 | Callback: func(ctx *interactor.MessageComponentContext, values []*discordgo.Channel) error { 107 | var message RoleMessageEntity 108 | if db.Connection.First(&message, ctx.ID).Error != nil { 109 | return ctx.UpsertRespond(roleResponseNotFound) 110 | } 111 | 112 | updatedMessage := message 113 | 114 | if len(values) == 0 { 115 | updatedMessage.ChannelID = ptr("") 116 | } else { 117 | updatedMessage.ChannelID = &values[0].ID 118 | } 119 | 120 | if err := db.Connection.Save(updatedMessage).Error; err != nil { 121 | switch err.(sqlite3.Error).ExtendedCode { 122 | case sqlite3.ErrConstraintUnique: 123 | return ctx.Respond(&discordgo.InteractionResponse{ 124 | Type: discordgo.InteractionResponseUpdateMessage, 125 | Data: formatRoleMessageResponse(&ctx.Context, &message, roleResponseNotificationFailed), 126 | }) 127 | } 128 | 129 | return err 130 | } 131 | 132 | return ctx.Respond(&discordgo.InteractionResponse{ 133 | Type: discordgo.InteractionResponseUpdateMessage, 134 | Data: formatRoleMessageResponse(&ctx.Context, &updatedMessage, roleResponseNotificationUpdated), 135 | }) 136 | }, 137 | } 138 | -------------------------------------------------------------------------------- /interactor/handlers.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "github.com/bwmarrin/discordgo" 5 | "strings" 6 | ) 7 | 8 | func interactionHandler(s *discordgo.Session, i *discordgo.InteractionCreate) { 9 | context := Context{ 10 | Session: s, 11 | Interaction: i.Interaction, 12 | } 13 | 14 | switch i.Type { 15 | case discordgo.InteractionApplicationCommand: 16 | data := i.ApplicationCommandData() 17 | 18 | if command, ok := commandHandlers[data.Name]; ok { 19 | ctx := &CommandContext{ 20 | Context: context, 21 | Data: &data, 22 | } 23 | 24 | if err := command.execute(ctx, data.Options); err != nil { 25 | println(err.Error()) 26 | 27 | if err := ctx.Respond(&discordgo.InteractionResponse{ 28 | Type: discordgo.InteractionResponseChannelMessageWithSource, 29 | Data: &discordgo.InteractionResponseData{ 30 | Embeds: []*discordgo.MessageEmbed{ 31 | { 32 | Description: "Something went wrong", 33 | Color: ColorError, 34 | }, 35 | }, 36 | Flags: discordgo.MessageFlagsEphemeral, 37 | }, 38 | }); err != nil { 39 | panic(err) 40 | } 41 | } 42 | } else { 43 | if err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ 44 | Type: discordgo.InteractionResponseChannelMessageWithSource, 45 | Data: &discordgo.InteractionResponseData{ 46 | Embeds: []*discordgo.MessageEmbed{ 47 | { 48 | Description: "Command not found", 49 | Color: ColorError, 50 | }, 51 | }, 52 | Flags: discordgo.MessageFlagsEphemeral, 53 | }, 54 | }); err != nil { 55 | panic(err) 56 | } 57 | } 58 | 59 | /// 60 | case discordgo.InteractionMessageComponent: 61 | data := i.MessageComponentData() 62 | componentID, id := splitCustomID(data.CustomID) 63 | 64 | if cmp, ok := messageComponentHandlers[componentID]; ok { 65 | ctx := &MessageComponentContext{ 66 | Context: context, 67 | Data: &data, 68 | ID: id, 69 | } 70 | 71 | if err := cmp.handle(ctx); err != nil { 72 | println(err.Error()) 73 | 74 | if err := ctx.Respond(&discordgo.InteractionResponse{ 75 | Type: discordgo.InteractionResponseChannelMessageWithSource, 76 | Data: &discordgo.InteractionResponseData{ 77 | Embeds: []*discordgo.MessageEmbed{ 78 | { 79 | Description: "Something went wrong", 80 | Color: ColorError, 81 | }, 82 | }, 83 | Flags: discordgo.MessageFlagsEphemeral, 84 | }, 85 | }); err != nil { 86 | panic(err) 87 | } 88 | } 89 | } else { 90 | if err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ 91 | Type: discordgo.InteractionResponseChannelMessageWithSource, 92 | Data: &discordgo.InteractionResponseData{ 93 | Content: "Something went wrong", 94 | Flags: discordgo.MessageFlagsEphemeral, 95 | }, 96 | }); err != nil { 97 | panic(err) 98 | } 99 | } 100 | 101 | //case discordgo.InteractionApplicationCommandAutocomplete: 102 | // TODO: Support autocomplete 103 | case discordgo.InteractionModalSubmit: 104 | data := i.ModalSubmitData() 105 | componentID, id := splitCustomID(data.CustomID) 106 | 107 | if modal, ok := modalHandlers[componentID]; ok { 108 | ctx := &ModalContext{ 109 | Context: context, 110 | Data: &data, 111 | ID: id, 112 | } 113 | 114 | if err := modal.handle(ctx); err != nil { 115 | println(err.Error()) 116 | 117 | if err := ctx.Respond(&discordgo.InteractionResponse{ 118 | Type: discordgo.InteractionResponseChannelMessageWithSource, 119 | Data: &discordgo.InteractionResponseData{ 120 | Embeds: []*discordgo.MessageEmbed{ 121 | { 122 | Description: "Something went wrong", 123 | Color: ColorError, 124 | }, 125 | }, 126 | Flags: discordgo.MessageFlagsEphemeral, 127 | }, 128 | }); err != nil { 129 | panic(err) 130 | } 131 | } 132 | } else { 133 | if err := s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ 134 | Type: discordgo.InteractionResponseChannelMessageWithSource, 135 | Data: &discordgo.InteractionResponseData{ 136 | Content: "Something went wrong", 137 | Flags: discordgo.MessageFlagsEphemeral, 138 | }, 139 | }); err != nil { 140 | panic(err) 141 | } 142 | } 143 | } 144 | } 145 | 146 | func splitCustomID(customID string) (string, string) { 147 | pieces := strings.SplitN(customID, idDelimiter, 2) 148 | 149 | return pieces[0], pieces[1] 150 | } 151 | -------------------------------------------------------------------------------- /interactor/applicationcommand_utils.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/bwmarrin/discordgo" 6 | "reflect" 7 | "strconv" 8 | "strings" 9 | ) 10 | 11 | func resolveCommandOptionType(i reflect.Type) (optionType discordgo.ApplicationCommandOptionType, err error) { 12 | if i.Kind() == reflect.String { 13 | optionType = discordgo.ApplicationCommandOptionString 14 | return 15 | } 16 | 17 | //TODO: Support user and members 18 | switch i { 19 | case reflect.TypeOf(""): 20 | optionType = discordgo.ApplicationCommandOptionString 21 | case reflect.TypeOf(int64(0)): 22 | optionType = discordgo.ApplicationCommandOptionInteger 23 | case reflect.TypeOf(true): 24 | optionType = discordgo.ApplicationCommandOptionBoolean 25 | case reflect.TypeOf((*discordgo.Member)(nil)): 26 | optionType = discordgo.ApplicationCommandOptionUser 27 | case reflect.TypeOf((*discordgo.Channel)(nil)): 28 | optionType = discordgo.ApplicationCommandOptionChannel 29 | case reflect.TypeOf((*discordgo.Role)(nil)): 30 | optionType = discordgo.ApplicationCommandOptionRole 31 | case reflect.TypeOf((*Mentionable)(nil)): 32 | optionType = discordgo.ApplicationCommandOptionMentionable 33 | case reflect.TypeOf(float64(0)): 34 | optionType = discordgo.ApplicationCommandOptionNumber 35 | case reflect.TypeOf((*discordgo.MessageAttachment)(nil)): 36 | optionType = discordgo.ApplicationCommandOptionAttachment 37 | default: 38 | err = errors.New("nope") 39 | } 40 | 41 | return 42 | } 43 | 44 | func resolveOptionsChannelTypes(f reflect.StructField) []discordgo.ChannelType { 45 | if tag, ok := f.Tag.Lookup("channels"); ok { 46 | list := strings.Split(tag, ",") 47 | channelTypes := make([]discordgo.ChannelType, len(list)) 48 | 49 | for i, channelType := range list { 50 | switch channelType { 51 | case "GuildText": 52 | channelTypes[i] = discordgo.ChannelTypeGuildText 53 | case "DM": 54 | channelTypes[i] = discordgo.ChannelTypeDM 55 | case "GuildVoice": 56 | channelTypes[i] = discordgo.ChannelTypeGuildVoice 57 | case "GroupDM": 58 | channelTypes[i] = discordgo.ChannelTypeGroupDM 59 | case "GuildCategory": 60 | channelTypes[i] = discordgo.ChannelTypeGuildCategory 61 | case "GuildNews": 62 | channelTypes[i] = discordgo.ChannelTypeGuildNews 63 | case "GuildStore": 64 | channelTypes[i] = discordgo.ChannelTypeGuildStore 65 | case "GuildNewsThread": 66 | channelTypes[i] = discordgo.ChannelTypeGuildNewsThread 67 | case "GuildPublicThread": 68 | channelTypes[i] = discordgo.ChannelTypeGuildPublicThread 69 | case "GuildPrivateThread": 70 | channelTypes[i] = discordgo.ChannelTypeGuildPrivateThread 71 | case "GuildStageVoice": 72 | channelTypes[i] = discordgo.ChannelTypeGuildStageVoice 73 | case "GuildForum": 74 | channelTypes[i] = discordgo.ChannelTypeGuildForum 75 | default: 76 | // TODO: Can't be arsed to do this properly for now 77 | panic("No clue what you want from me") 78 | } 79 | } 80 | 81 | return channelTypes 82 | } 83 | 84 | return nil 85 | } 86 | 87 | func setCommandOption(v reflect.Value, o *discordgo.ApplicationCommandInteractionDataOption, r *discordgo.ApplicationCommandInteractionDataResolved) { 88 | switch o.Type { 89 | case discordgo.ApplicationCommandOptionString: 90 | v.SetString(o.Value.(string)) 91 | case discordgo.ApplicationCommandOptionInteger: 92 | v.SetInt(int64(o.Value.(float64))) 93 | case discordgo.ApplicationCommandOptionBoolean: 94 | v.SetBool(o.Value.(bool)) 95 | case discordgo.ApplicationCommandOptionNumber: 96 | v.SetFloat(o.Value.(float64)) 97 | case discordgo.ApplicationCommandOptionUser: 98 | v.Set(reflect.ValueOf(r.Members[o.Value.(string)])) 99 | case discordgo.ApplicationCommandOptionChannel: 100 | v.Set(reflect.ValueOf(r.Channels[o.Value.(string)])) 101 | case discordgo.ApplicationCommandOptionRole: 102 | v.Set(reflect.ValueOf(r.Roles[o.Value.(string)])) 103 | case discordgo.ApplicationCommandOptionMentionable: 104 | v.Set(reflect.ValueOf(&Mentionable{ 105 | id: o.Value.(string), 106 | resolvedUsers: r.Users, 107 | resolvedMembers: r.Members, 108 | resolvedRoles: r.Roles, 109 | })) 110 | case discordgo.ApplicationCommandOptionAttachment: 111 | v.Set(reflect.ValueOf(r.Attachments[o.Value.(string)])) 112 | } 113 | 114 | panic("No idea what I am suppose to do with that type: " + o.Name) 115 | } 116 | 117 | func resolveOptionMinValue(t reflect.StructField, optionType discordgo.ApplicationCommandOptionType) *float64 { 118 | if optionType == discordgo.ApplicationCommandOptionInteger || optionType == discordgo.ApplicationCommandOptionNumber { 119 | if min, err := strconv.ParseFloat(t.Tag.Get("min"), 64); err != nil { 120 | return &min 121 | } 122 | } 123 | 124 | return nil 125 | } 126 | 127 | func resolveOptionMaxValue(t reflect.StructField, optionType discordgo.ApplicationCommandOptionType) float64 { 128 | if optionType == discordgo.ApplicationCommandOptionInteger || optionType == discordgo.ApplicationCommandOptionNumber { 129 | if max, err := strconv.ParseFloat(t.Tag.Get("max"), 64); err != nil { 130 | return max 131 | } 132 | } 133 | 134 | return 0 135 | } 136 | 137 | func resolveOptionMinLength(t reflect.StructField, optionType discordgo.ApplicationCommandOptionType) *int { 138 | if optionType == discordgo.ApplicationCommandOptionString { 139 | if min, err := strconv.Atoi(t.Tag.Get("min")); err != nil { 140 | return &min 141 | } 142 | } 143 | 144 | return nil 145 | } 146 | 147 | func resolveOptionMaxLength(t reflect.StructField, optionType discordgo.ApplicationCommandOptionType) int { 148 | if optionType == discordgo.ApplicationCommandOptionString { 149 | if max, err := strconv.Atoi(t.Tag.Get("max")); err != nil { 150 | return max 151 | } 152 | } 153 | 154 | return 0 155 | } 156 | 157 | func resolveOptionChoices(t reflect.StructField) []*discordgo.ApplicationCommandOptionChoice { 158 | if t.Type.Implements(reflect.TypeOf((*choiceParam)(nil)).Elem()) { 159 | gen, _ := t.Type.MethodByName("Choices") 160 | 161 | return gen.Func.Call(nil)[0].Interface().([]*discordgo.ApplicationCommandOptionChoice) 162 | } 163 | 164 | return nil 165 | } 166 | -------------------------------------------------------------------------------- /interactor/applicationcommand_options.go: -------------------------------------------------------------------------------- 1 | package interactor 2 | 3 | import ( 4 | "errors" 5 | "github.com/bwmarrin/discordgo" 6 | "reflect" 7 | "strings" 8 | ) 9 | 10 | type CommandPermissions struct { 11 | DefaultMemberPermissions *int64 12 | DMPermission *bool 13 | NSFW *bool 14 | } 15 | 16 | type Command interface { 17 | compileCommand(perms *CommandPermissions) (*discordgo.ApplicationCommand, commandExecuteDescriptor, error) 18 | } 19 | 20 | type CommandOptions interface { 21 | compileOption() (*discordgo.ApplicationCommandOption, commandExecuteDescriptor, error) 22 | } 23 | 24 | // 25 | // 26 | // 27 | 28 | type MemberCommand struct { 29 | Name string 30 | NameLocalizations *map[discordgo.Locale]string 31 | Callback any 32 | } 33 | 34 | func (c *MemberCommand) compileCommand(perms *CommandPermissions) (*discordgo.ApplicationCommand, commandExecuteDescriptor, error) { 35 | cmd := &discordgo.ApplicationCommand{ 36 | Type: discordgo.UserApplicationCommand, 37 | Name: c.Name, 38 | NameLocalizations: c.NameLocalizations, 39 | DefaultMemberPermissions: perms.DefaultMemberPermissions, 40 | DMPermission: perms.DMPermission, 41 | NSFW: perms.NSFW, 42 | } 43 | 44 | callbackValue := reflect.ValueOf(c.Callback) 45 | paramType := callbackValue.Type().In(1) 46 | desc := &commandDescriptor{ 47 | Callback: callbackValue, 48 | } 49 | 50 | if paramType == reflect.TypeOf((*discordgo.Member)(nil)) { 51 | desc.ParamGenerator = func(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) reflect.Value { 52 | for _, value := range ctx.Data.Resolved.Members { 53 | return reflect.ValueOf(value) 54 | } 55 | panic("uuuggggghhhhhh") 56 | } 57 | } else if paramType == reflect.TypeOf((*discordgo.User)(nil)) { 58 | desc.ParamGenerator = func(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) reflect.Value { 59 | for _, value := range ctx.Data.Resolved.Users { 60 | return reflect.ValueOf(value) 61 | } 62 | panic("uuuugggghhhhhhhhhhh") 63 | } 64 | } else { 65 | return nil, nil, errors.New("invalid second parameter for function") 66 | } 67 | 68 | return cmd, desc, nil 69 | } 70 | 71 | // 72 | // 73 | // 74 | 75 | type MessageCommand struct { 76 | Name string 77 | NameLocalizations *map[discordgo.Locale]string 78 | Callback any 79 | } 80 | 81 | func (c *MessageCommand) compileCommand(perms *CommandPermissions) (*discordgo.ApplicationCommand, commandExecuteDescriptor, error) { 82 | cmd := &discordgo.ApplicationCommand{ 83 | Type: discordgo.MessageApplicationCommand, 84 | Name: c.Name, 85 | NameLocalizations: c.NameLocalizations, 86 | DefaultMemberPermissions: perms.DefaultMemberPermissions, 87 | DMPermission: perms.DMPermission, 88 | NSFW: perms.NSFW, 89 | } 90 | 91 | callbackValue := reflect.ValueOf(c.Callback) 92 | desc := &commandDescriptor{ 93 | Callback: callbackValue, 94 | ParamGenerator: func(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) reflect.Value { 95 | for _, value := range ctx.Data.Resolved.Messages { 96 | return reflect.ValueOf(value) 97 | } 98 | panic("uggghhhh") 99 | }, 100 | } 101 | 102 | return cmd, desc, nil 103 | } 104 | 105 | // 106 | // 107 | // 108 | 109 | type SlashCommand struct { 110 | Name string 111 | NameLocalizations *map[discordgo.Locale]string 112 | Description string 113 | DescriptionLocalizations *map[discordgo.Locale]string 114 | Callback any 115 | } 116 | 117 | func (c *SlashCommand) compileCommand(perms *CommandPermissions) (*discordgo.ApplicationCommand, commandExecuteDescriptor, error) { 118 | option, desc, err := c.compileOption() 119 | 120 | if err != nil { 121 | return nil, nil, err 122 | } 123 | 124 | cmd := &discordgo.ApplicationCommand{ 125 | Type: discordgo.ChatApplicationCommand, 126 | Name: option.Name, 127 | NameLocalizations: c.NameLocalizations, 128 | Description: option.Description, 129 | DescriptionLocalizations: c.DescriptionLocalizations, 130 | DefaultMemberPermissions: perms.DefaultMemberPermissions, 131 | DMPermission: perms.DMPermission, 132 | NSFW: perms.NSFW, 133 | } 134 | 135 | return cmd, desc, nil 136 | } 137 | 138 | func (c *SlashCommand) compileOption() (*discordgo.ApplicationCommandOption, commandExecuteDescriptor, error) { 139 | option := &discordgo.ApplicationCommandOption{ 140 | Type: discordgo.ApplicationCommandOptionSubCommand, 141 | Name: c.Name, 142 | Description: c.Description, 143 | } 144 | 145 | callbackValue := reflect.ValueOf(c.Callback) 146 | desc := &commandDescriptor{ 147 | Callback: callbackValue, 148 | } 149 | 150 | if callbackType := callbackValue.Type(); callbackType.NumIn() > 1 { 151 | var err error 152 | option.Options, desc.ParamGenerator, err = c.inferParams(callbackType.In(1).Elem()) 153 | 154 | if err != nil { 155 | return nil, nil, err 156 | } 157 | } 158 | 159 | return option, desc, nil 160 | } 161 | 162 | func (c *SlashCommand) inferParams(param reflect.Type) (options []*discordgo.ApplicationCommandOption, gen commandParamGenerator, err error) { 163 | nameToFieldMap := make(map[string][]int) 164 | 165 | for _, field := range reflect.VisibleFields(param) { 166 | if field.Anonymous { 167 | continue 168 | } 169 | 170 | option, errField := c.inferFieldOption(field) 171 | err = errField 172 | if err != nil { 173 | return 174 | } 175 | 176 | options = append(options, option) 177 | nameToFieldMap[option.Name] = field.Index 178 | } 179 | 180 | gen = func(ctx *CommandContext, options []*discordgo.ApplicationCommandInteractionDataOption) (value reflect.Value) { 181 | value = reflect.New(param) 182 | elemValue := value.Elem() 183 | 184 | for _, option := range options { 185 | setCommandOption(elemValue.FieldByIndex(nameToFieldMap[option.Name]), option, ctx.Data.Resolved) 186 | } 187 | 188 | return 189 | } 190 | 191 | return 192 | } 193 | 194 | func (c *SlashCommand) inferFieldOption(field reflect.StructField) (*discordgo.ApplicationCommandOption, error) { 195 | optionType, err := resolveCommandOptionType(field.Type) 196 | if err != nil { 197 | return nil, err 198 | } 199 | 200 | option := &discordgo.ApplicationCommandOption{ 201 | Type: optionType, 202 | Name: strings.ToLower(field.Name), 203 | NameLocalizations: nil, 204 | Description: field.Tag.Get("description"), 205 | DescriptionLocalizations: nil, 206 | Required: field.Tag.Get("required") == "true", 207 | ChannelTypes: resolveOptionsChannelTypes(field), 208 | Choices: resolveOptionChoices(field), 209 | MinValue: resolveOptionMinValue(field, optionType), 210 | MaxValue: resolveOptionMaxValue(field, optionType), 211 | MinLength: resolveOptionMinLength(field, optionType), 212 | MaxLength: resolveOptionMaxLength(field, optionType), 213 | } 214 | 215 | return option, err 216 | } 217 | 218 | // 219 | // 220 | // 221 | 222 | type SlashCommandGroup struct { 223 | Name string 224 | NameLocalizations *map[discordgo.Locale]string 225 | Description string 226 | DescriptionLocalizations *map[discordgo.Locale]string 227 | SubCommands []CommandOptions 228 | } 229 | 230 | func (c *SlashCommandGroup) compileCommand(perms *CommandPermissions) (*discordgo.ApplicationCommand, commandExecuteDescriptor, error) { 231 | option, desc, err := c.compileOption() 232 | 233 | cmd := &discordgo.ApplicationCommand{ 234 | Type: discordgo.ChatApplicationCommand, 235 | Name: option.Name, 236 | NameLocalizations: c.NameLocalizations, 237 | Description: option.Description, 238 | DescriptionLocalizations: c.DescriptionLocalizations, 239 | Options: option.Options, 240 | DefaultMemberPermissions: perms.DefaultMemberPermissions, 241 | DMPermission: perms.DMPermission, 242 | NSFW: perms.NSFW, 243 | } 244 | 245 | return cmd, desc, err 246 | } 247 | 248 | func (c *SlashCommandGroup) compileOption() (*discordgo.ApplicationCommandOption, commandExecuteDescriptor, error) { 249 | options := make([]*discordgo.ApplicationCommandOption, len(c.SubCommands)) 250 | subCommands := make(map[string]commandExecuteDescriptor, len(c.SubCommands)) 251 | 252 | for i, sub := range c.SubCommands { 253 | option, subDesc, err := sub.compileOption() 254 | 255 | if err != nil { 256 | return nil, nil, err 257 | } 258 | 259 | options[i] = option 260 | subCommands[option.Name] = subDesc 261 | } 262 | 263 | option := &discordgo.ApplicationCommandOption{ 264 | Type: discordgo.ApplicationCommandOptionSubCommandGroup, 265 | Name: c.Name, 266 | Description: c.Description, 267 | Options: options, 268 | } 269 | 270 | desc := &commandGroupDescriptor{ 271 | SubCommands: subCommands, 272 | } 273 | 274 | return option, desc, nil 275 | } 276 | 277 | // 278 | // 279 | // 280 | 281 | type choiceParam interface { 282 | Choices() []*discordgo.ApplicationCommandOptionChoice 283 | } 284 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.22.10" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" 8 | integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== 9 | dependencies: 10 | "@babel/highlight" "^7.22.10" 11 | chalk "^2.4.2" 12 | 13 | "@babel/helper-validator-identifier@^7.22.5": 14 | version "7.22.5" 15 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" 16 | integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== 17 | 18 | "@babel/highlight@^7.22.10": 19 | version "7.22.10" 20 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" 21 | integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== 22 | dependencies: 23 | "@babel/helper-validator-identifier" "^7.22.5" 24 | chalk "^2.4.2" 25 | js-tokens "^4.0.0" 26 | 27 | "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5": 28 | version "7.22.10" 29 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" 30 | integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== 31 | dependencies: 32 | regenerator-runtime "^0.14.0" 33 | 34 | "@changesets/apply-release-plan@^6.1.4": 35 | version "6.1.4" 36 | resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-6.1.4.tgz#09293256090737ecd2f683842d6d732034a5e3c8" 37 | integrity sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew== 38 | dependencies: 39 | "@babel/runtime" "^7.20.1" 40 | "@changesets/config" "^2.3.1" 41 | "@changesets/get-version-range-type" "^0.3.2" 42 | "@changesets/git" "^2.0.0" 43 | "@changesets/types" "^5.2.1" 44 | "@manypkg/get-packages" "^1.1.3" 45 | detect-indent "^6.0.0" 46 | fs-extra "^7.0.1" 47 | lodash.startcase "^4.4.0" 48 | outdent "^0.5.0" 49 | prettier "^2.7.1" 50 | resolve-from "^5.0.0" 51 | semver "^7.5.3" 52 | 53 | "@changesets/assemble-release-plan@^5.2.4": 54 | version "5.2.4" 55 | resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.4.tgz#d42fd63f4297a2e630e8e0a49f07d4ff5f5ef7bc" 56 | integrity sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg== 57 | dependencies: 58 | "@babel/runtime" "^7.20.1" 59 | "@changesets/errors" "^0.1.4" 60 | "@changesets/get-dependents-graph" "^1.3.6" 61 | "@changesets/types" "^5.2.1" 62 | "@manypkg/get-packages" "^1.1.3" 63 | semver "^7.5.3" 64 | 65 | "@changesets/changelog-git@^0.1.14": 66 | version "0.1.14" 67 | resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.1.14.tgz#852caa7727dcf91497c131d05bc2cd6248532ada" 68 | integrity sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA== 69 | dependencies: 70 | "@changesets/types" "^5.2.1" 71 | 72 | "@changesets/changelog-github@^0.4.8": 73 | version "0.4.8" 74 | resolved "https://registry.yarnpkg.com/@changesets/changelog-github/-/changelog-github-0.4.8.tgz#b7f8ae85d0c0ff08028d924c5e59a1cbd3742634" 75 | integrity sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw== 76 | dependencies: 77 | "@changesets/get-github-info" "^0.5.2" 78 | "@changesets/types" "^5.2.1" 79 | dotenv "^8.1.0" 80 | 81 | "@changesets/cli@^2.26.2": 82 | version "2.26.2" 83 | resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.26.2.tgz#8914dd6ef3ea425a7d5935f6c35a8b7ccde54e45" 84 | integrity sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig== 85 | dependencies: 86 | "@babel/runtime" "^7.20.1" 87 | "@changesets/apply-release-plan" "^6.1.4" 88 | "@changesets/assemble-release-plan" "^5.2.4" 89 | "@changesets/changelog-git" "^0.1.14" 90 | "@changesets/config" "^2.3.1" 91 | "@changesets/errors" "^0.1.4" 92 | "@changesets/get-dependents-graph" "^1.3.6" 93 | "@changesets/get-release-plan" "^3.0.17" 94 | "@changesets/git" "^2.0.0" 95 | "@changesets/logger" "^0.0.5" 96 | "@changesets/pre" "^1.0.14" 97 | "@changesets/read" "^0.5.9" 98 | "@changesets/types" "^5.2.1" 99 | "@changesets/write" "^0.2.3" 100 | "@manypkg/get-packages" "^1.1.3" 101 | "@types/is-ci" "^3.0.0" 102 | "@types/semver" "^7.5.0" 103 | ansi-colors "^4.1.3" 104 | chalk "^2.1.0" 105 | enquirer "^2.3.0" 106 | external-editor "^3.1.0" 107 | fs-extra "^7.0.1" 108 | human-id "^1.0.2" 109 | is-ci "^3.0.1" 110 | meow "^6.0.0" 111 | outdent "^0.5.0" 112 | p-limit "^2.2.0" 113 | preferred-pm "^3.0.0" 114 | resolve-from "^5.0.0" 115 | semver "^7.5.3" 116 | spawndamnit "^2.0.0" 117 | term-size "^2.1.0" 118 | tty-table "^4.1.5" 119 | 120 | "@changesets/config@^2.3.1": 121 | version "2.3.1" 122 | resolved "https://registry.yarnpkg.com/@changesets/config/-/config-2.3.1.tgz#3d4a1dc866c3623375180b30f69fccdf0e3efebf" 123 | integrity sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w== 124 | dependencies: 125 | "@changesets/errors" "^0.1.4" 126 | "@changesets/get-dependents-graph" "^1.3.6" 127 | "@changesets/logger" "^0.0.5" 128 | "@changesets/types" "^5.2.1" 129 | "@manypkg/get-packages" "^1.1.3" 130 | fs-extra "^7.0.1" 131 | micromatch "^4.0.2" 132 | 133 | "@changesets/errors@^0.1.4": 134 | version "0.1.4" 135 | resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.1.4.tgz#f79851746c43679a66b383fdff4c012f480f480d" 136 | integrity sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q== 137 | dependencies: 138 | extendable-error "^0.1.5" 139 | 140 | "@changesets/get-dependents-graph@^1.3.6": 141 | version "1.3.6" 142 | resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.6.tgz#5e19e7b0bfbc7dc38e1986eaaa7016ff377ed888" 143 | integrity sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q== 144 | dependencies: 145 | "@changesets/types" "^5.2.1" 146 | "@manypkg/get-packages" "^1.1.3" 147 | chalk "^2.1.0" 148 | fs-extra "^7.0.1" 149 | semver "^7.5.3" 150 | 151 | "@changesets/get-github-info@^0.5.2": 152 | version "0.5.2" 153 | resolved "https://registry.yarnpkg.com/@changesets/get-github-info/-/get-github-info-0.5.2.tgz#0cde2cadba57db85c714dc303c077da919a574e5" 154 | integrity sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg== 155 | dependencies: 156 | dataloader "^1.4.0" 157 | node-fetch "^2.5.0" 158 | 159 | "@changesets/get-release-plan@^3.0.17": 160 | version "3.0.17" 161 | resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-3.0.17.tgz#8aabced2795ffeae864696b60ee3031f8a94c5f3" 162 | integrity sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw== 163 | dependencies: 164 | "@babel/runtime" "^7.20.1" 165 | "@changesets/assemble-release-plan" "^5.2.4" 166 | "@changesets/config" "^2.3.1" 167 | "@changesets/pre" "^1.0.14" 168 | "@changesets/read" "^0.5.9" 169 | "@changesets/types" "^5.2.1" 170 | "@manypkg/get-packages" "^1.1.3" 171 | 172 | "@changesets/get-version-range-type@^0.3.2": 173 | version "0.3.2" 174 | resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.3.2.tgz#8131a99035edd11aa7a44c341cbb05e668618c67" 175 | integrity sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg== 176 | 177 | "@changesets/git@^2.0.0": 178 | version "2.0.0" 179 | resolved "https://registry.yarnpkg.com/@changesets/git/-/git-2.0.0.tgz#8de57649baf13a86eb669a25fa51bcad5cea517f" 180 | integrity sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A== 181 | dependencies: 182 | "@babel/runtime" "^7.20.1" 183 | "@changesets/errors" "^0.1.4" 184 | "@changesets/types" "^5.2.1" 185 | "@manypkg/get-packages" "^1.1.3" 186 | is-subdir "^1.1.1" 187 | micromatch "^4.0.2" 188 | spawndamnit "^2.0.0" 189 | 190 | "@changesets/logger@^0.0.5": 191 | version "0.0.5" 192 | resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.0.5.tgz#68305dd5a643e336be16a2369cb17cdd8ed37d4c" 193 | integrity sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw== 194 | dependencies: 195 | chalk "^2.1.0" 196 | 197 | "@changesets/parse@^0.3.16": 198 | version "0.3.16" 199 | resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.3.16.tgz#f8337b70aeb476dc81745ab3294022909bc4a84a" 200 | integrity sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg== 201 | dependencies: 202 | "@changesets/types" "^5.2.1" 203 | js-yaml "^3.13.1" 204 | 205 | "@changesets/pre@^1.0.14": 206 | version "1.0.14" 207 | resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-1.0.14.tgz#9df73999a4d15804da7381358d77bb37b00ddf0f" 208 | integrity sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ== 209 | dependencies: 210 | "@babel/runtime" "^7.20.1" 211 | "@changesets/errors" "^0.1.4" 212 | "@changesets/types" "^5.2.1" 213 | "@manypkg/get-packages" "^1.1.3" 214 | fs-extra "^7.0.1" 215 | 216 | "@changesets/read@^0.5.9": 217 | version "0.5.9" 218 | resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.5.9.tgz#a1b63a82b8e9409738d7a0f9cc39b6d7c28cbab0" 219 | integrity sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ== 220 | dependencies: 221 | "@babel/runtime" "^7.20.1" 222 | "@changesets/git" "^2.0.0" 223 | "@changesets/logger" "^0.0.5" 224 | "@changesets/parse" "^0.3.16" 225 | "@changesets/types" "^5.2.1" 226 | chalk "^2.1.0" 227 | fs-extra "^7.0.1" 228 | p-filter "^2.1.0" 229 | 230 | "@changesets/types@^4.0.1": 231 | version "4.1.0" 232 | resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" 233 | integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== 234 | 235 | "@changesets/types@^5.2.1": 236 | version "5.2.1" 237 | resolved "https://registry.yarnpkg.com/@changesets/types/-/types-5.2.1.tgz#a228c48004aa8a93bce4be2d1d31527ef3bf21f6" 238 | integrity sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg== 239 | 240 | "@changesets/write@^0.2.3": 241 | version "0.2.3" 242 | resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.2.3.tgz#baf6be8ada2a67b9aba608e251bfea4fdc40bc63" 243 | integrity sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw== 244 | dependencies: 245 | "@babel/runtime" "^7.20.1" 246 | "@changesets/types" "^5.2.1" 247 | fs-extra "^7.0.1" 248 | human-id "^1.0.2" 249 | prettier "^2.7.1" 250 | 251 | "@commitlint/cli@^17.7.1": 252 | version "17.7.1" 253 | resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.7.1.tgz#f3ab35bd38d82fcd4ab03ec5a1e9db26d57fe1b0" 254 | integrity sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g== 255 | dependencies: 256 | "@commitlint/format" "^17.4.4" 257 | "@commitlint/lint" "^17.7.0" 258 | "@commitlint/load" "^17.7.1" 259 | "@commitlint/read" "^17.5.1" 260 | "@commitlint/types" "^17.4.4" 261 | execa "^5.0.0" 262 | lodash.isfunction "^3.0.9" 263 | resolve-from "5.0.0" 264 | resolve-global "1.0.0" 265 | yargs "^17.0.0" 266 | 267 | "@commitlint/config-conventional@^17.7.0": 268 | version "17.7.0" 269 | resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-17.7.0.tgz#1bbf2bce7851db63c1a8aa8d924277ad4938247e" 270 | integrity sha512-iicqh2o6et+9kWaqsQiEYZzfLbtoWv9uZl8kbI8EGfnc0HeGafQBF7AJ0ylN9D/2kj6txltsdyQs8+2fTMwWEw== 271 | dependencies: 272 | conventional-changelog-conventionalcommits "^6.1.0" 273 | 274 | "@commitlint/config-validator@^17.6.7": 275 | version "17.6.7" 276 | resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.6.7.tgz#c664d42a1ecf5040a3bb0843845150f55734df41" 277 | integrity sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ== 278 | dependencies: 279 | "@commitlint/types" "^17.4.4" 280 | ajv "^8.11.0" 281 | 282 | "@commitlint/ensure@^17.6.7": 283 | version "17.6.7" 284 | resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.6.7.tgz#77a77a0c05e6a1c34589f59e82e6cb937101fc4b" 285 | integrity sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw== 286 | dependencies: 287 | "@commitlint/types" "^17.4.4" 288 | lodash.camelcase "^4.3.0" 289 | lodash.kebabcase "^4.1.1" 290 | lodash.snakecase "^4.1.1" 291 | lodash.startcase "^4.4.0" 292 | lodash.upperfirst "^4.3.1" 293 | 294 | "@commitlint/execute-rule@^17.4.0": 295 | version "17.4.0" 296 | resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" 297 | integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== 298 | 299 | "@commitlint/format@^17.4.4": 300 | version "17.4.4" 301 | resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.4.4.tgz#0f6e1b4d7a301c7b1dfd4b6334edd97fc050b9f5" 302 | integrity sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ== 303 | dependencies: 304 | "@commitlint/types" "^17.4.4" 305 | chalk "^4.1.0" 306 | 307 | "@commitlint/is-ignored@^17.7.0": 308 | version "17.7.0" 309 | resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz#df9b284420bdb1aed5fdb2be44f4e98cc4826014" 310 | integrity sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw== 311 | dependencies: 312 | "@commitlint/types" "^17.4.4" 313 | semver "7.5.4" 314 | 315 | "@commitlint/lint@^17.7.0": 316 | version "17.7.0" 317 | resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.7.0.tgz#33f831298dc43679e4de6b088aea63d1f884c7e7" 318 | integrity sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA== 319 | dependencies: 320 | "@commitlint/is-ignored" "^17.7.0" 321 | "@commitlint/parse" "^17.7.0" 322 | "@commitlint/rules" "^17.7.0" 323 | "@commitlint/types" "^17.4.4" 324 | 325 | "@commitlint/load@^17.7.1": 326 | version "17.7.1" 327 | resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.7.1.tgz#0723b11723a20043a304a74960602dead89b5cdd" 328 | integrity sha512-S/QSOjE1ztdogYj61p6n3UbkUvweR17FQ0zDbNtoTLc+Hz7vvfS7ehoTMQ27hPSjVBpp7SzEcOQu081RLjKHJQ== 329 | dependencies: 330 | "@commitlint/config-validator" "^17.6.7" 331 | "@commitlint/execute-rule" "^17.4.0" 332 | "@commitlint/resolve-extends" "^17.6.7" 333 | "@commitlint/types" "^17.4.4" 334 | "@types/node" "20.4.7" 335 | chalk "^4.1.0" 336 | cosmiconfig "^8.0.0" 337 | cosmiconfig-typescript-loader "^4.0.0" 338 | lodash.isplainobject "^4.0.6" 339 | lodash.merge "^4.6.2" 340 | lodash.uniq "^4.5.0" 341 | resolve-from "^5.0.0" 342 | ts-node "^10.8.1" 343 | typescript "^4.6.4 || ^5.0.0" 344 | 345 | "@commitlint/message@^17.4.2": 346 | version "17.4.2" 347 | resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.4.2.tgz#f4753a79701ad6db6db21f69076e34de6580e22c" 348 | integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q== 349 | 350 | "@commitlint/parse@^17.7.0": 351 | version "17.7.0" 352 | resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.7.0.tgz#aacb2d189e50ab8454154b1df150aaf20478ae47" 353 | integrity sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag== 354 | dependencies: 355 | "@commitlint/types" "^17.4.4" 356 | conventional-changelog-angular "^6.0.0" 357 | conventional-commits-parser "^4.0.0" 358 | 359 | "@commitlint/read@^17.5.1": 360 | version "17.5.1" 361 | resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.5.1.tgz#fec903b766e2c41e3cefa80630040fcaba4f786c" 362 | integrity sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg== 363 | dependencies: 364 | "@commitlint/top-level" "^17.4.0" 365 | "@commitlint/types" "^17.4.4" 366 | fs-extra "^11.0.0" 367 | git-raw-commits "^2.0.11" 368 | minimist "^1.2.6" 369 | 370 | "@commitlint/resolve-extends@^17.6.7": 371 | version "17.6.7" 372 | resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz#9c53a4601c96ab2dd20b90fb35c988639307735d" 373 | integrity sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg== 374 | dependencies: 375 | "@commitlint/config-validator" "^17.6.7" 376 | "@commitlint/types" "^17.4.4" 377 | import-fresh "^3.0.0" 378 | lodash.mergewith "^4.6.2" 379 | resolve-from "^5.0.0" 380 | resolve-global "^1.0.0" 381 | 382 | "@commitlint/rules@^17.7.0": 383 | version "17.7.0" 384 | resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.7.0.tgz#b97a4933c5cba11a659a19ee467f6f000f31533e" 385 | integrity sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA== 386 | dependencies: 387 | "@commitlint/ensure" "^17.6.7" 388 | "@commitlint/message" "^17.4.2" 389 | "@commitlint/to-lines" "^17.4.0" 390 | "@commitlint/types" "^17.4.4" 391 | execa "^5.0.0" 392 | 393 | "@commitlint/to-lines@^17.4.0": 394 | version "17.4.0" 395 | resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.4.0.tgz#9bd02e911e7d4eab3fb4a50376c4c6d331e10d8d" 396 | integrity sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg== 397 | 398 | "@commitlint/top-level@^17.4.0": 399 | version "17.4.0" 400 | resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.4.0.tgz#540cac8290044cf846fbdd99f5cc51e8ac5f27d6" 401 | integrity sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g== 402 | dependencies: 403 | find-up "^5.0.0" 404 | 405 | "@commitlint/types@^17.4.4": 406 | version "17.4.4" 407 | resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.4.tgz#1416df936e9aad0d6a7bbc979ecc31e55dade662" 408 | integrity sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ== 409 | dependencies: 410 | chalk "^4.1.0" 411 | 412 | "@cspotcode/source-map-support@^0.8.0": 413 | version "0.8.1" 414 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 415 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 416 | dependencies: 417 | "@jridgewell/trace-mapping" "0.3.9" 418 | 419 | "@jridgewell/resolve-uri@^3.0.3": 420 | version "3.1.1" 421 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 422 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 423 | 424 | "@jridgewell/sourcemap-codec@^1.4.10": 425 | version "1.4.15" 426 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 427 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 428 | 429 | "@jridgewell/trace-mapping@0.3.9": 430 | version "0.3.9" 431 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 432 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 433 | dependencies: 434 | "@jridgewell/resolve-uri" "^3.0.3" 435 | "@jridgewell/sourcemap-codec" "^1.4.10" 436 | 437 | "@manypkg/find-root@^1.1.0": 438 | version "1.1.0" 439 | resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" 440 | integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== 441 | dependencies: 442 | "@babel/runtime" "^7.5.5" 443 | "@types/node" "^12.7.1" 444 | find-up "^4.1.0" 445 | fs-extra "^8.1.0" 446 | 447 | "@manypkg/get-packages@^1.1.3": 448 | version "1.1.3" 449 | resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" 450 | integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== 451 | dependencies: 452 | "@babel/runtime" "^7.5.5" 453 | "@changesets/types" "^4.0.1" 454 | "@manypkg/find-root" "^1.1.0" 455 | fs-extra "^8.1.0" 456 | globby "^11.0.0" 457 | read-yaml-file "^1.1.0" 458 | 459 | "@nodelib/fs.scandir@2.1.5": 460 | version "2.1.5" 461 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 462 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 463 | dependencies: 464 | "@nodelib/fs.stat" "2.0.5" 465 | run-parallel "^1.1.9" 466 | 467 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 468 | version "2.0.5" 469 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 470 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 471 | 472 | "@nodelib/fs.walk@^1.2.3": 473 | version "1.2.8" 474 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 475 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 476 | dependencies: 477 | "@nodelib/fs.scandir" "2.1.5" 478 | fastq "^1.6.0" 479 | 480 | "@tsconfig/node10@^1.0.7": 481 | version "1.0.9" 482 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 483 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 484 | 485 | "@tsconfig/node12@^1.0.7": 486 | version "1.0.11" 487 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 488 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 489 | 490 | "@tsconfig/node14@^1.0.0": 491 | version "1.0.3" 492 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 493 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 494 | 495 | "@tsconfig/node16@^1.0.2": 496 | version "1.0.4" 497 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" 498 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 499 | 500 | "@types/is-ci@^3.0.0": 501 | version "3.0.0" 502 | resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.0.tgz#7e8910af6857601315592436f030aaa3ed9783c3" 503 | integrity sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ== 504 | dependencies: 505 | ci-info "^3.1.0" 506 | 507 | "@types/minimist@^1.2.0": 508 | version "1.2.2" 509 | resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" 510 | integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== 511 | 512 | "@types/node@20.4.7": 513 | version "20.4.7" 514 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.7.tgz#74d323a93f1391a63477b27b9aec56669c98b2ab" 515 | integrity sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g== 516 | 517 | "@types/node@^12.7.1": 518 | version "12.20.55" 519 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" 520 | integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== 521 | 522 | "@types/normalize-package-data@^2.4.0": 523 | version "2.4.1" 524 | resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" 525 | integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== 526 | 527 | "@types/semver@^7.5.0": 528 | version "7.5.0" 529 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" 530 | integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== 531 | 532 | JSONStream@^1.3.5: 533 | version "1.3.5" 534 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 535 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 536 | dependencies: 537 | jsonparse "^1.2.0" 538 | through ">=2.2.7 <3" 539 | 540 | acorn-walk@^8.1.1: 541 | version "8.2.0" 542 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 543 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 544 | 545 | acorn@^8.4.1: 546 | version "8.10.0" 547 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" 548 | integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== 549 | 550 | ajv@^8.11.0: 551 | version "8.12.0" 552 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" 553 | integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== 554 | dependencies: 555 | fast-deep-equal "^3.1.1" 556 | json-schema-traverse "^1.0.0" 557 | require-from-string "^2.0.2" 558 | uri-js "^4.2.2" 559 | 560 | ansi-colors@^4.1.1, ansi-colors@^4.1.3: 561 | version "4.1.3" 562 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 563 | integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== 564 | 565 | ansi-regex@^5.0.1: 566 | version "5.0.1" 567 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 568 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 569 | 570 | ansi-styles@^3.2.1: 571 | version "3.2.1" 572 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 573 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 574 | dependencies: 575 | color-convert "^1.9.0" 576 | 577 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 578 | version "4.3.0" 579 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 580 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 581 | dependencies: 582 | color-convert "^2.0.1" 583 | 584 | arg@^4.1.0: 585 | version "4.1.3" 586 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 587 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 588 | 589 | argparse@^1.0.7: 590 | version "1.0.10" 591 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 592 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 593 | dependencies: 594 | sprintf-js "~1.0.2" 595 | 596 | argparse@^2.0.1: 597 | version "2.0.1" 598 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 599 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 600 | 601 | array-buffer-byte-length@^1.0.0: 602 | version "1.0.0" 603 | resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" 604 | integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== 605 | dependencies: 606 | call-bind "^1.0.2" 607 | is-array-buffer "^3.0.1" 608 | 609 | array-ify@^1.0.0: 610 | version "1.0.0" 611 | resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" 612 | integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== 613 | 614 | array-union@^2.1.0: 615 | version "2.1.0" 616 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 617 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 618 | 619 | array.prototype.flat@^1.2.3: 620 | version "1.3.1" 621 | resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" 622 | integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== 623 | dependencies: 624 | call-bind "^1.0.2" 625 | define-properties "^1.1.4" 626 | es-abstract "^1.20.4" 627 | es-shim-unscopables "^1.0.0" 628 | 629 | arraybuffer.prototype.slice@^1.0.1: 630 | version "1.0.1" 631 | resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" 632 | integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== 633 | dependencies: 634 | array-buffer-byte-length "^1.0.0" 635 | call-bind "^1.0.2" 636 | define-properties "^1.2.0" 637 | get-intrinsic "^1.2.1" 638 | is-array-buffer "^3.0.2" 639 | is-shared-array-buffer "^1.0.2" 640 | 641 | arrify@^1.0.1: 642 | version "1.0.1" 643 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 644 | integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== 645 | 646 | available-typed-arrays@^1.0.5: 647 | version "1.0.5" 648 | resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" 649 | integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== 650 | 651 | better-path-resolve@1.0.0: 652 | version "1.0.0" 653 | resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" 654 | integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== 655 | dependencies: 656 | is-windows "^1.0.0" 657 | 658 | braces@^3.0.2: 659 | version "3.0.2" 660 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 661 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 662 | dependencies: 663 | fill-range "^7.0.1" 664 | 665 | breakword@^1.0.5: 666 | version "1.0.6" 667 | resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.6.tgz#242506e7b871b7fad1bce8dc05cb0f2a129c12bd" 668 | integrity sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw== 669 | dependencies: 670 | wcwidth "^1.0.1" 671 | 672 | call-bind@^1.0.0, call-bind@^1.0.2: 673 | version "1.0.2" 674 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 675 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 676 | dependencies: 677 | function-bind "^1.1.1" 678 | get-intrinsic "^1.0.2" 679 | 680 | callsites@^3.0.0: 681 | version "3.1.0" 682 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 683 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 684 | 685 | camelcase-keys@^6.2.2: 686 | version "6.2.2" 687 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" 688 | integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== 689 | dependencies: 690 | camelcase "^5.3.1" 691 | map-obj "^4.0.0" 692 | quick-lru "^4.0.1" 693 | 694 | camelcase@^5.0.0, camelcase@^5.3.1: 695 | version "5.3.1" 696 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 697 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 698 | 699 | chalk@^2.1.0, chalk@^2.4.2: 700 | version "2.4.2" 701 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 702 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 703 | dependencies: 704 | ansi-styles "^3.2.1" 705 | escape-string-regexp "^1.0.5" 706 | supports-color "^5.3.0" 707 | 708 | chalk@^4.1.0, chalk@^4.1.2: 709 | version "4.1.2" 710 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 711 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 712 | dependencies: 713 | ansi-styles "^4.1.0" 714 | supports-color "^7.1.0" 715 | 716 | chardet@^0.7.0: 717 | version "0.7.0" 718 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 719 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 720 | 721 | ci-info@^3.1.0, ci-info@^3.2.0: 722 | version "3.8.0" 723 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" 724 | integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== 725 | 726 | cliui@^6.0.0: 727 | version "6.0.0" 728 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 729 | integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 730 | dependencies: 731 | string-width "^4.2.0" 732 | strip-ansi "^6.0.0" 733 | wrap-ansi "^6.2.0" 734 | 735 | cliui@^8.0.1: 736 | version "8.0.1" 737 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 738 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 739 | dependencies: 740 | string-width "^4.2.0" 741 | strip-ansi "^6.0.1" 742 | wrap-ansi "^7.0.0" 743 | 744 | clone@^1.0.2: 745 | version "1.0.4" 746 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 747 | integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== 748 | 749 | color-convert@^1.9.0: 750 | version "1.9.3" 751 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 752 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 753 | dependencies: 754 | color-name "1.1.3" 755 | 756 | color-convert@^2.0.1: 757 | version "2.0.1" 758 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 759 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 760 | dependencies: 761 | color-name "~1.1.4" 762 | 763 | color-name@1.1.3: 764 | version "1.1.3" 765 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 766 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 767 | 768 | color-name@~1.1.4: 769 | version "1.1.4" 770 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 771 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 772 | 773 | compare-func@^2.0.0: 774 | version "2.0.0" 775 | resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" 776 | integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== 777 | dependencies: 778 | array-ify "^1.0.0" 779 | dot-prop "^5.1.0" 780 | 781 | conventional-changelog-angular@^6.0.0: 782 | version "6.0.0" 783 | resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" 784 | integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== 785 | dependencies: 786 | compare-func "^2.0.0" 787 | 788 | conventional-changelog-conventionalcommits@^6.1.0: 789 | version "6.1.0" 790 | resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz#3bad05f4eea64e423d3d90fc50c17d2c8cf17652" 791 | integrity sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw== 792 | dependencies: 793 | compare-func "^2.0.0" 794 | 795 | conventional-commits-parser@^4.0.0: 796 | version "4.0.0" 797 | resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" 798 | integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== 799 | dependencies: 800 | JSONStream "^1.3.5" 801 | is-text-path "^1.0.1" 802 | meow "^8.1.2" 803 | split2 "^3.2.2" 804 | 805 | cosmiconfig-typescript-loader@^4.0.0: 806 | version "4.4.0" 807 | resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" 808 | integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== 809 | 810 | cosmiconfig@^8.0.0: 811 | version "8.2.0" 812 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" 813 | integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== 814 | dependencies: 815 | import-fresh "^3.2.1" 816 | js-yaml "^4.1.0" 817 | parse-json "^5.0.0" 818 | path-type "^4.0.0" 819 | 820 | create-require@^1.1.0: 821 | version "1.1.1" 822 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 823 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 824 | 825 | cross-spawn@^5.1.0: 826 | version "5.1.0" 827 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 828 | integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== 829 | dependencies: 830 | lru-cache "^4.0.1" 831 | shebang-command "^1.2.0" 832 | which "^1.2.9" 833 | 834 | cross-spawn@^7.0.3: 835 | version "7.0.3" 836 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 837 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 838 | dependencies: 839 | path-key "^3.1.0" 840 | shebang-command "^2.0.0" 841 | which "^2.0.1" 842 | 843 | csv-generate@^3.4.3: 844 | version "3.4.3" 845 | resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" 846 | integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== 847 | 848 | csv-parse@^4.16.3: 849 | version "4.16.3" 850 | resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" 851 | integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== 852 | 853 | csv-stringify@^5.6.5: 854 | version "5.6.5" 855 | resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" 856 | integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== 857 | 858 | csv@^5.5.3: 859 | version "5.5.3" 860 | resolved "https://registry.yarnpkg.com/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" 861 | integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== 862 | dependencies: 863 | csv-generate "^3.4.3" 864 | csv-parse "^4.16.3" 865 | csv-stringify "^5.6.5" 866 | stream-transform "^2.1.3" 867 | 868 | dargs@^7.0.0: 869 | version "7.0.0" 870 | resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" 871 | integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== 872 | 873 | dataloader@^1.4.0: 874 | version "1.4.0" 875 | resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" 876 | integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== 877 | 878 | decamelize-keys@^1.1.0: 879 | version "1.1.1" 880 | resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" 881 | integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== 882 | dependencies: 883 | decamelize "^1.1.0" 884 | map-obj "^1.0.0" 885 | 886 | decamelize@^1.1.0, decamelize@^1.2.0: 887 | version "1.2.0" 888 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 889 | integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== 890 | 891 | defaults@^1.0.3: 892 | version "1.0.4" 893 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" 894 | integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== 895 | dependencies: 896 | clone "^1.0.2" 897 | 898 | define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: 899 | version "1.2.0" 900 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" 901 | integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== 902 | dependencies: 903 | has-property-descriptors "^1.0.0" 904 | object-keys "^1.1.1" 905 | 906 | detect-indent@^6.0.0: 907 | version "6.1.0" 908 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" 909 | integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== 910 | 911 | diff@^4.0.1: 912 | version "4.0.2" 913 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 914 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 915 | 916 | dir-glob@^3.0.1: 917 | version "3.0.1" 918 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 919 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 920 | dependencies: 921 | path-type "^4.0.0" 922 | 923 | dot-prop@^5.1.0: 924 | version "5.3.0" 925 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 926 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 927 | dependencies: 928 | is-obj "^2.0.0" 929 | 930 | dotenv@^8.1.0: 931 | version "8.6.0" 932 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" 933 | integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== 934 | 935 | emoji-regex@^8.0.0: 936 | version "8.0.0" 937 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 938 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 939 | 940 | enquirer@^2.3.0: 941 | version "2.4.1" 942 | resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" 943 | integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== 944 | dependencies: 945 | ansi-colors "^4.1.1" 946 | strip-ansi "^6.0.1" 947 | 948 | error-ex@^1.3.1: 949 | version "1.3.2" 950 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 951 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 952 | dependencies: 953 | is-arrayish "^0.2.1" 954 | 955 | es-abstract@^1.19.0, es-abstract@^1.20.4: 956 | version "1.22.1" 957 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" 958 | integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== 959 | dependencies: 960 | array-buffer-byte-length "^1.0.0" 961 | arraybuffer.prototype.slice "^1.0.1" 962 | available-typed-arrays "^1.0.5" 963 | call-bind "^1.0.2" 964 | es-set-tostringtag "^2.0.1" 965 | es-to-primitive "^1.2.1" 966 | function.prototype.name "^1.1.5" 967 | get-intrinsic "^1.2.1" 968 | get-symbol-description "^1.0.0" 969 | globalthis "^1.0.3" 970 | gopd "^1.0.1" 971 | has "^1.0.3" 972 | has-property-descriptors "^1.0.0" 973 | has-proto "^1.0.1" 974 | has-symbols "^1.0.3" 975 | internal-slot "^1.0.5" 976 | is-array-buffer "^3.0.2" 977 | is-callable "^1.2.7" 978 | is-negative-zero "^2.0.2" 979 | is-regex "^1.1.4" 980 | is-shared-array-buffer "^1.0.2" 981 | is-string "^1.0.7" 982 | is-typed-array "^1.1.10" 983 | is-weakref "^1.0.2" 984 | object-inspect "^1.12.3" 985 | object-keys "^1.1.1" 986 | object.assign "^4.1.4" 987 | regexp.prototype.flags "^1.5.0" 988 | safe-array-concat "^1.0.0" 989 | safe-regex-test "^1.0.0" 990 | string.prototype.trim "^1.2.7" 991 | string.prototype.trimend "^1.0.6" 992 | string.prototype.trimstart "^1.0.6" 993 | typed-array-buffer "^1.0.0" 994 | typed-array-byte-length "^1.0.0" 995 | typed-array-byte-offset "^1.0.0" 996 | typed-array-length "^1.0.4" 997 | unbox-primitive "^1.0.2" 998 | which-typed-array "^1.1.10" 999 | 1000 | es-set-tostringtag@^2.0.1: 1001 | version "2.0.1" 1002 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" 1003 | integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== 1004 | dependencies: 1005 | get-intrinsic "^1.1.3" 1006 | has "^1.0.3" 1007 | has-tostringtag "^1.0.0" 1008 | 1009 | es-shim-unscopables@^1.0.0: 1010 | version "1.0.0" 1011 | resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" 1012 | integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== 1013 | dependencies: 1014 | has "^1.0.3" 1015 | 1016 | es-to-primitive@^1.2.1: 1017 | version "1.2.1" 1018 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 1019 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 1020 | dependencies: 1021 | is-callable "^1.1.4" 1022 | is-date-object "^1.0.1" 1023 | is-symbol "^1.0.2" 1024 | 1025 | escalade@^3.1.1: 1026 | version "3.1.1" 1027 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 1028 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1029 | 1030 | escape-string-regexp@^1.0.5: 1031 | version "1.0.5" 1032 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1033 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 1034 | 1035 | esprima@^4.0.0: 1036 | version "4.0.1" 1037 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 1038 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 1039 | 1040 | execa@^5.0.0: 1041 | version "5.1.1" 1042 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 1043 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 1044 | dependencies: 1045 | cross-spawn "^7.0.3" 1046 | get-stream "^6.0.0" 1047 | human-signals "^2.1.0" 1048 | is-stream "^2.0.0" 1049 | merge-stream "^2.0.0" 1050 | npm-run-path "^4.0.1" 1051 | onetime "^5.1.2" 1052 | signal-exit "^3.0.3" 1053 | strip-final-newline "^2.0.0" 1054 | 1055 | extendable-error@^0.1.5: 1056 | version "0.1.7" 1057 | resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" 1058 | integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== 1059 | 1060 | external-editor@^3.1.0: 1061 | version "3.1.0" 1062 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 1063 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 1064 | dependencies: 1065 | chardet "^0.7.0" 1066 | iconv-lite "^0.4.24" 1067 | tmp "^0.0.33" 1068 | 1069 | fast-deep-equal@^3.1.1: 1070 | version "3.1.3" 1071 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1072 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1073 | 1074 | fast-glob@^3.2.9: 1075 | version "3.3.1" 1076 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" 1077 | integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== 1078 | dependencies: 1079 | "@nodelib/fs.stat" "^2.0.2" 1080 | "@nodelib/fs.walk" "^1.2.3" 1081 | glob-parent "^5.1.2" 1082 | merge2 "^1.3.0" 1083 | micromatch "^4.0.4" 1084 | 1085 | fastq@^1.6.0: 1086 | version "1.15.0" 1087 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 1088 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 1089 | dependencies: 1090 | reusify "^1.0.4" 1091 | 1092 | fill-range@^7.0.1: 1093 | version "7.0.1" 1094 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1095 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1096 | dependencies: 1097 | to-regex-range "^5.0.1" 1098 | 1099 | find-up@^4.0.0, find-up@^4.1.0: 1100 | version "4.1.0" 1101 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 1102 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 1103 | dependencies: 1104 | locate-path "^5.0.0" 1105 | path-exists "^4.0.0" 1106 | 1107 | find-up@^5.0.0: 1108 | version "5.0.0" 1109 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1110 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1111 | dependencies: 1112 | locate-path "^6.0.0" 1113 | path-exists "^4.0.0" 1114 | 1115 | find-yarn-workspace-root2@1.2.16: 1116 | version "1.2.16" 1117 | resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" 1118 | integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== 1119 | dependencies: 1120 | micromatch "^4.0.2" 1121 | pkg-dir "^4.2.0" 1122 | 1123 | for-each@^0.3.3: 1124 | version "0.3.3" 1125 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 1126 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 1127 | dependencies: 1128 | is-callable "^1.1.3" 1129 | 1130 | fs-extra@^11.0.0: 1131 | version "11.1.1" 1132 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" 1133 | integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== 1134 | dependencies: 1135 | graceful-fs "^4.2.0" 1136 | jsonfile "^6.0.1" 1137 | universalify "^2.0.0" 1138 | 1139 | fs-extra@^7.0.1: 1140 | version "7.0.1" 1141 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 1142 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 1143 | dependencies: 1144 | graceful-fs "^4.1.2" 1145 | jsonfile "^4.0.0" 1146 | universalify "^0.1.0" 1147 | 1148 | fs-extra@^8.1.0: 1149 | version "8.1.0" 1150 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 1151 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 1152 | dependencies: 1153 | graceful-fs "^4.2.0" 1154 | jsonfile "^4.0.0" 1155 | universalify "^0.1.0" 1156 | 1157 | function-bind@^1.1.1: 1158 | version "1.1.1" 1159 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1160 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1161 | 1162 | function.prototype.name@^1.1.5: 1163 | version "1.1.5" 1164 | resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" 1165 | integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== 1166 | dependencies: 1167 | call-bind "^1.0.2" 1168 | define-properties "^1.1.3" 1169 | es-abstract "^1.19.0" 1170 | functions-have-names "^1.2.2" 1171 | 1172 | functions-have-names@^1.2.2, functions-have-names@^1.2.3: 1173 | version "1.2.3" 1174 | resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" 1175 | integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== 1176 | 1177 | get-caller-file@^2.0.1, get-caller-file@^2.0.5: 1178 | version "2.0.5" 1179 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1180 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1181 | 1182 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: 1183 | version "1.2.1" 1184 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" 1185 | integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== 1186 | dependencies: 1187 | function-bind "^1.1.1" 1188 | has "^1.0.3" 1189 | has-proto "^1.0.1" 1190 | has-symbols "^1.0.3" 1191 | 1192 | get-stream@^6.0.0: 1193 | version "6.0.1" 1194 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 1195 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 1196 | 1197 | get-symbol-description@^1.0.0: 1198 | version "1.0.0" 1199 | resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" 1200 | integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== 1201 | dependencies: 1202 | call-bind "^1.0.2" 1203 | get-intrinsic "^1.1.1" 1204 | 1205 | git-raw-commits@^2.0.11: 1206 | version "2.0.11" 1207 | resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" 1208 | integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== 1209 | dependencies: 1210 | dargs "^7.0.0" 1211 | lodash "^4.17.15" 1212 | meow "^8.0.0" 1213 | split2 "^3.0.0" 1214 | through2 "^4.0.0" 1215 | 1216 | glob-parent@^5.1.2: 1217 | version "5.1.2" 1218 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1219 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1220 | dependencies: 1221 | is-glob "^4.0.1" 1222 | 1223 | global-dirs@^0.1.1: 1224 | version "0.1.1" 1225 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" 1226 | integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== 1227 | dependencies: 1228 | ini "^1.3.4" 1229 | 1230 | globalthis@^1.0.3: 1231 | version "1.0.3" 1232 | resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" 1233 | integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== 1234 | dependencies: 1235 | define-properties "^1.1.3" 1236 | 1237 | globby@^11.0.0: 1238 | version "11.1.0" 1239 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1240 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1241 | dependencies: 1242 | array-union "^2.1.0" 1243 | dir-glob "^3.0.1" 1244 | fast-glob "^3.2.9" 1245 | ignore "^5.2.0" 1246 | merge2 "^1.4.1" 1247 | slash "^3.0.0" 1248 | 1249 | gopd@^1.0.1: 1250 | version "1.0.1" 1251 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 1252 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 1253 | dependencies: 1254 | get-intrinsic "^1.1.3" 1255 | 1256 | graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 1257 | version "4.2.11" 1258 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1259 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1260 | 1261 | grapheme-splitter@^1.0.4: 1262 | version "1.0.4" 1263 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 1264 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 1265 | 1266 | hard-rejection@^2.1.0: 1267 | version "2.1.0" 1268 | resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" 1269 | integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== 1270 | 1271 | has-bigints@^1.0.1, has-bigints@^1.0.2: 1272 | version "1.0.2" 1273 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" 1274 | integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== 1275 | 1276 | has-flag@^3.0.0: 1277 | version "3.0.0" 1278 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1279 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1280 | 1281 | has-flag@^4.0.0: 1282 | version "4.0.0" 1283 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1284 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1285 | 1286 | has-property-descriptors@^1.0.0: 1287 | version "1.0.0" 1288 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" 1289 | integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== 1290 | dependencies: 1291 | get-intrinsic "^1.1.1" 1292 | 1293 | has-proto@^1.0.1: 1294 | version "1.0.1" 1295 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" 1296 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== 1297 | 1298 | has-symbols@^1.0.2, has-symbols@^1.0.3: 1299 | version "1.0.3" 1300 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1301 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1302 | 1303 | has-tostringtag@^1.0.0: 1304 | version "1.0.0" 1305 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 1306 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 1307 | dependencies: 1308 | has-symbols "^1.0.2" 1309 | 1310 | has@^1.0.3: 1311 | version "1.0.3" 1312 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1313 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1314 | dependencies: 1315 | function-bind "^1.1.1" 1316 | 1317 | hosted-git-info@^2.1.4: 1318 | version "2.8.9" 1319 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 1320 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 1321 | 1322 | hosted-git-info@^4.0.1: 1323 | version "4.1.0" 1324 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" 1325 | integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== 1326 | dependencies: 1327 | lru-cache "^6.0.0" 1328 | 1329 | human-id@^1.0.2: 1330 | version "1.0.2" 1331 | resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" 1332 | integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== 1333 | 1334 | human-signals@^2.1.0: 1335 | version "2.1.0" 1336 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 1337 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 1338 | 1339 | husky@^8.0.3: 1340 | version "8.0.3" 1341 | resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" 1342 | integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== 1343 | 1344 | iconv-lite@^0.4.24: 1345 | version "0.4.24" 1346 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1347 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1348 | dependencies: 1349 | safer-buffer ">= 2.1.2 < 3" 1350 | 1351 | ignore@^5.2.0: 1352 | version "5.2.4" 1353 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" 1354 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== 1355 | 1356 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1357 | version "3.3.0" 1358 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1359 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1360 | dependencies: 1361 | parent-module "^1.0.0" 1362 | resolve-from "^4.0.0" 1363 | 1364 | indent-string@^4.0.0: 1365 | version "4.0.0" 1366 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 1367 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 1368 | 1369 | inherits@^2.0.3: 1370 | version "2.0.4" 1371 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1372 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1373 | 1374 | ini@^1.3.4: 1375 | version "1.3.8" 1376 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 1377 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1378 | 1379 | internal-slot@^1.0.5: 1380 | version "1.0.5" 1381 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" 1382 | integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== 1383 | dependencies: 1384 | get-intrinsic "^1.2.0" 1385 | has "^1.0.3" 1386 | side-channel "^1.0.4" 1387 | 1388 | is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: 1389 | version "3.0.2" 1390 | resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" 1391 | integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== 1392 | dependencies: 1393 | call-bind "^1.0.2" 1394 | get-intrinsic "^1.2.0" 1395 | is-typed-array "^1.1.10" 1396 | 1397 | is-arrayish@^0.2.1: 1398 | version "0.2.1" 1399 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1400 | integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== 1401 | 1402 | is-bigint@^1.0.1: 1403 | version "1.0.4" 1404 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" 1405 | integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== 1406 | dependencies: 1407 | has-bigints "^1.0.1" 1408 | 1409 | is-boolean-object@^1.1.0: 1410 | version "1.1.2" 1411 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" 1412 | integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== 1413 | dependencies: 1414 | call-bind "^1.0.2" 1415 | has-tostringtag "^1.0.0" 1416 | 1417 | is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: 1418 | version "1.2.7" 1419 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 1420 | integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 1421 | 1422 | is-ci@^3.0.1: 1423 | version "3.0.1" 1424 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" 1425 | integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== 1426 | dependencies: 1427 | ci-info "^3.2.0" 1428 | 1429 | is-core-module@^2.13.0, is-core-module@^2.5.0: 1430 | version "2.13.0" 1431 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" 1432 | integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== 1433 | dependencies: 1434 | has "^1.0.3" 1435 | 1436 | is-date-object@^1.0.1: 1437 | version "1.0.5" 1438 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" 1439 | integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== 1440 | dependencies: 1441 | has-tostringtag "^1.0.0" 1442 | 1443 | is-extglob@^2.1.1: 1444 | version "2.1.1" 1445 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1446 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1447 | 1448 | is-fullwidth-code-point@^3.0.0: 1449 | version "3.0.0" 1450 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1451 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1452 | 1453 | is-glob@^4.0.1: 1454 | version "4.0.3" 1455 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1456 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1457 | dependencies: 1458 | is-extglob "^2.1.1" 1459 | 1460 | is-negative-zero@^2.0.2: 1461 | version "2.0.2" 1462 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" 1463 | integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== 1464 | 1465 | is-number-object@^1.0.4: 1466 | version "1.0.7" 1467 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" 1468 | integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== 1469 | dependencies: 1470 | has-tostringtag "^1.0.0" 1471 | 1472 | is-number@^7.0.0: 1473 | version "7.0.0" 1474 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1475 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1476 | 1477 | is-obj@^2.0.0: 1478 | version "2.0.0" 1479 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 1480 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 1481 | 1482 | is-plain-obj@^1.1.0: 1483 | version "1.1.0" 1484 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 1485 | integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== 1486 | 1487 | is-regex@^1.1.4: 1488 | version "1.1.4" 1489 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 1490 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 1491 | dependencies: 1492 | call-bind "^1.0.2" 1493 | has-tostringtag "^1.0.0" 1494 | 1495 | is-shared-array-buffer@^1.0.2: 1496 | version "1.0.2" 1497 | resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" 1498 | integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== 1499 | dependencies: 1500 | call-bind "^1.0.2" 1501 | 1502 | is-stream@^2.0.0: 1503 | version "2.0.1" 1504 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1505 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1506 | 1507 | is-string@^1.0.5, is-string@^1.0.7: 1508 | version "1.0.7" 1509 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" 1510 | integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== 1511 | dependencies: 1512 | has-tostringtag "^1.0.0" 1513 | 1514 | is-subdir@^1.1.1: 1515 | version "1.2.0" 1516 | resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" 1517 | integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== 1518 | dependencies: 1519 | better-path-resolve "1.0.0" 1520 | 1521 | is-symbol@^1.0.2, is-symbol@^1.0.3: 1522 | version "1.0.4" 1523 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 1524 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 1525 | dependencies: 1526 | has-symbols "^1.0.2" 1527 | 1528 | is-text-path@^1.0.1: 1529 | version "1.0.1" 1530 | resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" 1531 | integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== 1532 | dependencies: 1533 | text-extensions "^1.0.0" 1534 | 1535 | is-typed-array@^1.1.10, is-typed-array@^1.1.9: 1536 | version "1.1.12" 1537 | resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" 1538 | integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== 1539 | dependencies: 1540 | which-typed-array "^1.1.11" 1541 | 1542 | is-weakref@^1.0.2: 1543 | version "1.0.2" 1544 | resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" 1545 | integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== 1546 | dependencies: 1547 | call-bind "^1.0.2" 1548 | 1549 | is-windows@^1.0.0: 1550 | version "1.0.2" 1551 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1552 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1553 | 1554 | isarray@^2.0.5: 1555 | version "2.0.5" 1556 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 1557 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 1558 | 1559 | isexe@^2.0.0: 1560 | version "2.0.0" 1561 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1562 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1563 | 1564 | js-tokens@^4.0.0: 1565 | version "4.0.0" 1566 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1567 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1568 | 1569 | js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: 1570 | version "3.14.1" 1571 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 1572 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 1573 | dependencies: 1574 | argparse "^1.0.7" 1575 | esprima "^4.0.0" 1576 | 1577 | js-yaml@^4.1.0: 1578 | version "4.1.0" 1579 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1580 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1581 | dependencies: 1582 | argparse "^2.0.1" 1583 | 1584 | json-parse-even-better-errors@^2.3.0: 1585 | version "2.3.1" 1586 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 1587 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 1588 | 1589 | json-schema-traverse@^1.0.0: 1590 | version "1.0.0" 1591 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 1592 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 1593 | 1594 | jsonfile@^4.0.0: 1595 | version "4.0.0" 1596 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1597 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 1598 | optionalDependencies: 1599 | graceful-fs "^4.1.6" 1600 | 1601 | jsonfile@^6.0.1: 1602 | version "6.1.0" 1603 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 1604 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 1605 | dependencies: 1606 | universalify "^2.0.0" 1607 | optionalDependencies: 1608 | graceful-fs "^4.1.6" 1609 | 1610 | jsonparse@^1.2.0: 1611 | version "1.3.1" 1612 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 1613 | integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== 1614 | 1615 | kind-of@^6.0.3: 1616 | version "6.0.3" 1617 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1618 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1619 | 1620 | kleur@^4.1.5: 1621 | version "4.1.5" 1622 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" 1623 | integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== 1624 | 1625 | lines-and-columns@^1.1.6: 1626 | version "1.2.4" 1627 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" 1628 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 1629 | 1630 | load-yaml-file@^0.2.0: 1631 | version "0.2.0" 1632 | resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" 1633 | integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== 1634 | dependencies: 1635 | graceful-fs "^4.1.5" 1636 | js-yaml "^3.13.0" 1637 | pify "^4.0.1" 1638 | strip-bom "^3.0.0" 1639 | 1640 | locate-path@^5.0.0: 1641 | version "5.0.0" 1642 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1643 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1644 | dependencies: 1645 | p-locate "^4.1.0" 1646 | 1647 | locate-path@^6.0.0: 1648 | version "6.0.0" 1649 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1650 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1651 | dependencies: 1652 | p-locate "^5.0.0" 1653 | 1654 | lodash.camelcase@^4.3.0: 1655 | version "4.3.0" 1656 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 1657 | integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== 1658 | 1659 | lodash.isfunction@^3.0.9: 1660 | version "3.0.9" 1661 | resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" 1662 | integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== 1663 | 1664 | lodash.isplainobject@^4.0.6: 1665 | version "4.0.6" 1666 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1667 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 1668 | 1669 | lodash.kebabcase@^4.1.1: 1670 | version "4.1.1" 1671 | resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" 1672 | integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== 1673 | 1674 | lodash.merge@^4.6.2: 1675 | version "4.6.2" 1676 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1677 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1678 | 1679 | lodash.mergewith@^4.6.2: 1680 | version "4.6.2" 1681 | resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" 1682 | integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== 1683 | 1684 | lodash.snakecase@^4.1.1: 1685 | version "4.1.1" 1686 | resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" 1687 | integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== 1688 | 1689 | lodash.startcase@^4.4.0: 1690 | version "4.4.0" 1691 | resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" 1692 | integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== 1693 | 1694 | lodash.uniq@^4.5.0: 1695 | version "4.5.0" 1696 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 1697 | integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== 1698 | 1699 | lodash.upperfirst@^4.3.1: 1700 | version "4.3.1" 1701 | resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" 1702 | integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== 1703 | 1704 | lodash@^4.17.15: 1705 | version "4.17.21" 1706 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1707 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1708 | 1709 | lru-cache@^4.0.1: 1710 | version "4.1.5" 1711 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 1712 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 1713 | dependencies: 1714 | pseudomap "^1.0.2" 1715 | yallist "^2.1.2" 1716 | 1717 | lru-cache@^6.0.0: 1718 | version "6.0.0" 1719 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1720 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1721 | dependencies: 1722 | yallist "^4.0.0" 1723 | 1724 | make-error@^1.1.1: 1725 | version "1.3.6" 1726 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1727 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1728 | 1729 | map-obj@^1.0.0: 1730 | version "1.0.1" 1731 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1732 | integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== 1733 | 1734 | map-obj@^4.0.0: 1735 | version "4.3.0" 1736 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" 1737 | integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== 1738 | 1739 | meow@^6.0.0: 1740 | version "6.1.1" 1741 | resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" 1742 | integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== 1743 | dependencies: 1744 | "@types/minimist" "^1.2.0" 1745 | camelcase-keys "^6.2.2" 1746 | decamelize-keys "^1.1.0" 1747 | hard-rejection "^2.1.0" 1748 | minimist-options "^4.0.2" 1749 | normalize-package-data "^2.5.0" 1750 | read-pkg-up "^7.0.1" 1751 | redent "^3.0.0" 1752 | trim-newlines "^3.0.0" 1753 | type-fest "^0.13.1" 1754 | yargs-parser "^18.1.3" 1755 | 1756 | meow@^8.0.0, meow@^8.1.2: 1757 | version "8.1.2" 1758 | resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" 1759 | integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== 1760 | dependencies: 1761 | "@types/minimist" "^1.2.0" 1762 | camelcase-keys "^6.2.2" 1763 | decamelize-keys "^1.1.0" 1764 | hard-rejection "^2.1.0" 1765 | minimist-options "4.1.0" 1766 | normalize-package-data "^3.0.0" 1767 | read-pkg-up "^7.0.1" 1768 | redent "^3.0.0" 1769 | trim-newlines "^3.0.0" 1770 | type-fest "^0.18.0" 1771 | yargs-parser "^20.2.3" 1772 | 1773 | merge-stream@^2.0.0: 1774 | version "2.0.0" 1775 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1776 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1777 | 1778 | merge2@^1.3.0, merge2@^1.4.1: 1779 | version "1.4.1" 1780 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1781 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1782 | 1783 | micromatch@^4.0.2, micromatch@^4.0.4: 1784 | version "4.0.5" 1785 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1786 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1787 | dependencies: 1788 | braces "^3.0.2" 1789 | picomatch "^2.3.1" 1790 | 1791 | mimic-fn@^2.1.0: 1792 | version "2.1.0" 1793 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1794 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1795 | 1796 | min-indent@^1.0.0: 1797 | version "1.0.1" 1798 | resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" 1799 | integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== 1800 | 1801 | minimist-options@4.1.0, minimist-options@^4.0.2: 1802 | version "4.1.0" 1803 | resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" 1804 | integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== 1805 | dependencies: 1806 | arrify "^1.0.1" 1807 | is-plain-obj "^1.1.0" 1808 | kind-of "^6.0.3" 1809 | 1810 | minimist@^1.2.6: 1811 | version "1.2.8" 1812 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 1813 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1814 | 1815 | mixme@^0.5.1: 1816 | version "0.5.9" 1817 | resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.9.tgz#a5a58e17354632179ff3ce5b0fc130899c8ba81c" 1818 | integrity sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw== 1819 | 1820 | node-fetch@^2.5.0: 1821 | version "2.6.12" 1822 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" 1823 | integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== 1824 | dependencies: 1825 | whatwg-url "^5.0.0" 1826 | 1827 | normalize-package-data@^2.5.0: 1828 | version "2.5.0" 1829 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1830 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1831 | dependencies: 1832 | hosted-git-info "^2.1.4" 1833 | resolve "^1.10.0" 1834 | semver "2 || 3 || 4 || 5" 1835 | validate-npm-package-license "^3.0.1" 1836 | 1837 | normalize-package-data@^3.0.0: 1838 | version "3.0.3" 1839 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" 1840 | integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== 1841 | dependencies: 1842 | hosted-git-info "^4.0.1" 1843 | is-core-module "^2.5.0" 1844 | semver "^7.3.4" 1845 | validate-npm-package-license "^3.0.1" 1846 | 1847 | npm-run-path@^4.0.1: 1848 | version "4.0.1" 1849 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1850 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1851 | dependencies: 1852 | path-key "^3.0.0" 1853 | 1854 | object-inspect@^1.12.3, object-inspect@^1.9.0: 1855 | version "1.12.3" 1856 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 1857 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 1858 | 1859 | object-keys@^1.1.1: 1860 | version "1.1.1" 1861 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1862 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1863 | 1864 | object.assign@^4.1.4: 1865 | version "4.1.4" 1866 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" 1867 | integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== 1868 | dependencies: 1869 | call-bind "^1.0.2" 1870 | define-properties "^1.1.4" 1871 | has-symbols "^1.0.3" 1872 | object-keys "^1.1.1" 1873 | 1874 | onetime@^5.1.2: 1875 | version "5.1.2" 1876 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1877 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1878 | dependencies: 1879 | mimic-fn "^2.1.0" 1880 | 1881 | os-tmpdir@~1.0.2: 1882 | version "1.0.2" 1883 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1884 | integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== 1885 | 1886 | outdent@^0.5.0: 1887 | version "0.5.0" 1888 | resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" 1889 | integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== 1890 | 1891 | p-filter@^2.1.0: 1892 | version "2.1.0" 1893 | resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" 1894 | integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== 1895 | dependencies: 1896 | p-map "^2.0.0" 1897 | 1898 | p-limit@^2.2.0: 1899 | version "2.3.0" 1900 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1901 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1902 | dependencies: 1903 | p-try "^2.0.0" 1904 | 1905 | p-limit@^3.0.2: 1906 | version "3.1.0" 1907 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1908 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1909 | dependencies: 1910 | yocto-queue "^0.1.0" 1911 | 1912 | p-locate@^4.1.0: 1913 | version "4.1.0" 1914 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1915 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1916 | dependencies: 1917 | p-limit "^2.2.0" 1918 | 1919 | p-locate@^5.0.0: 1920 | version "5.0.0" 1921 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1922 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1923 | dependencies: 1924 | p-limit "^3.0.2" 1925 | 1926 | p-map@^2.0.0: 1927 | version "2.1.0" 1928 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" 1929 | integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== 1930 | 1931 | p-try@^2.0.0: 1932 | version "2.2.0" 1933 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1934 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1935 | 1936 | parent-module@^1.0.0: 1937 | version "1.0.1" 1938 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1939 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1940 | dependencies: 1941 | callsites "^3.0.0" 1942 | 1943 | parse-json@^5.0.0: 1944 | version "5.2.0" 1945 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" 1946 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 1947 | dependencies: 1948 | "@babel/code-frame" "^7.0.0" 1949 | error-ex "^1.3.1" 1950 | json-parse-even-better-errors "^2.3.0" 1951 | lines-and-columns "^1.1.6" 1952 | 1953 | path-exists@^4.0.0: 1954 | version "4.0.0" 1955 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1956 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1957 | 1958 | path-key@^3.0.0, path-key@^3.1.0: 1959 | version "3.1.1" 1960 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1961 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1962 | 1963 | path-parse@^1.0.7: 1964 | version "1.0.7" 1965 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1966 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1967 | 1968 | path-type@^4.0.0: 1969 | version "4.0.0" 1970 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1971 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1972 | 1973 | picomatch@^2.3.1: 1974 | version "2.3.1" 1975 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1976 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1977 | 1978 | pify@^4.0.1: 1979 | version "4.0.1" 1980 | resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 1981 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1982 | 1983 | pkg-dir@^4.2.0: 1984 | version "4.2.0" 1985 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1986 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1987 | dependencies: 1988 | find-up "^4.0.0" 1989 | 1990 | preferred-pm@^3.0.0: 1991 | version "3.0.3" 1992 | resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.3.tgz#1b6338000371e3edbce52ef2e4f65eb2e73586d6" 1993 | integrity sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ== 1994 | dependencies: 1995 | find-up "^5.0.0" 1996 | find-yarn-workspace-root2 "1.2.16" 1997 | path-exists "^4.0.0" 1998 | which-pm "2.0.0" 1999 | 2000 | prettier@^2.7.1: 2001 | version "2.8.8" 2002 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" 2003 | integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== 2004 | 2005 | pseudomap@^1.0.2: 2006 | version "1.0.2" 2007 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 2008 | integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== 2009 | 2010 | punycode@^2.1.0: 2011 | version "2.3.0" 2012 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" 2013 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== 2014 | 2015 | queue-microtask@^1.2.2: 2016 | version "1.2.3" 2017 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 2018 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 2019 | 2020 | quick-lru@^4.0.1: 2021 | version "4.0.1" 2022 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" 2023 | integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== 2024 | 2025 | read-pkg-up@^7.0.1: 2026 | version "7.0.1" 2027 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" 2028 | integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== 2029 | dependencies: 2030 | find-up "^4.1.0" 2031 | read-pkg "^5.2.0" 2032 | type-fest "^0.8.1" 2033 | 2034 | read-pkg@^5.2.0: 2035 | version "5.2.0" 2036 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" 2037 | integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== 2038 | dependencies: 2039 | "@types/normalize-package-data" "^2.4.0" 2040 | normalize-package-data "^2.5.0" 2041 | parse-json "^5.0.0" 2042 | type-fest "^0.6.0" 2043 | 2044 | read-yaml-file@^1.1.0: 2045 | version "1.1.0" 2046 | resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" 2047 | integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== 2048 | dependencies: 2049 | graceful-fs "^4.1.5" 2050 | js-yaml "^3.6.1" 2051 | pify "^4.0.1" 2052 | strip-bom "^3.0.0" 2053 | 2054 | readable-stream@3, readable-stream@^3.0.0: 2055 | version "3.6.2" 2056 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" 2057 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 2058 | dependencies: 2059 | inherits "^2.0.3" 2060 | string_decoder "^1.1.1" 2061 | util-deprecate "^1.0.1" 2062 | 2063 | redent@^3.0.0: 2064 | version "3.0.0" 2065 | resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" 2066 | integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== 2067 | dependencies: 2068 | indent-string "^4.0.0" 2069 | strip-indent "^3.0.0" 2070 | 2071 | regenerator-runtime@^0.14.0: 2072 | version "0.14.0" 2073 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" 2074 | integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== 2075 | 2076 | regexp.prototype.flags@^1.5.0: 2077 | version "1.5.0" 2078 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" 2079 | integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== 2080 | dependencies: 2081 | call-bind "^1.0.2" 2082 | define-properties "^1.2.0" 2083 | functions-have-names "^1.2.3" 2084 | 2085 | require-directory@^2.1.1: 2086 | version "2.1.1" 2087 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2088 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 2089 | 2090 | require-from-string@^2.0.2: 2091 | version "2.0.2" 2092 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 2093 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 2094 | 2095 | require-main-filename@^2.0.0: 2096 | version "2.0.0" 2097 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 2098 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 2099 | 2100 | resolve-from@5.0.0, resolve-from@^5.0.0: 2101 | version "5.0.0" 2102 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 2103 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 2104 | 2105 | resolve-from@^4.0.0: 2106 | version "4.0.0" 2107 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 2108 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 2109 | 2110 | resolve-global@1.0.0, resolve-global@^1.0.0: 2111 | version "1.0.0" 2112 | resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" 2113 | integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== 2114 | dependencies: 2115 | global-dirs "^0.1.1" 2116 | 2117 | resolve@^1.10.0: 2118 | version "1.22.4" 2119 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" 2120 | integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== 2121 | dependencies: 2122 | is-core-module "^2.13.0" 2123 | path-parse "^1.0.7" 2124 | supports-preserve-symlinks-flag "^1.0.0" 2125 | 2126 | reusify@^1.0.4: 2127 | version "1.0.4" 2128 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 2129 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 2130 | 2131 | run-parallel@^1.1.9: 2132 | version "1.2.0" 2133 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 2134 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 2135 | dependencies: 2136 | queue-microtask "^1.2.2" 2137 | 2138 | safe-array-concat@^1.0.0: 2139 | version "1.0.0" 2140 | resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" 2141 | integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== 2142 | dependencies: 2143 | call-bind "^1.0.2" 2144 | get-intrinsic "^1.2.0" 2145 | has-symbols "^1.0.3" 2146 | isarray "^2.0.5" 2147 | 2148 | safe-buffer@~5.2.0: 2149 | version "5.2.1" 2150 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 2151 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 2152 | 2153 | safe-regex-test@^1.0.0: 2154 | version "1.0.0" 2155 | resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" 2156 | integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== 2157 | dependencies: 2158 | call-bind "^1.0.2" 2159 | get-intrinsic "^1.1.3" 2160 | is-regex "^1.1.4" 2161 | 2162 | "safer-buffer@>= 2.1.2 < 3": 2163 | version "2.1.2" 2164 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 2165 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 2166 | 2167 | "semver@2 || 3 || 4 || 5": 2168 | version "5.7.2" 2169 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" 2170 | integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 2171 | 2172 | semver@7.5.4, semver@^7.3.4, semver@^7.5.3: 2173 | version "7.5.4" 2174 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 2175 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 2176 | dependencies: 2177 | lru-cache "^6.0.0" 2178 | 2179 | set-blocking@^2.0.0: 2180 | version "2.0.0" 2181 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2182 | integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== 2183 | 2184 | shebang-command@^1.2.0: 2185 | version "1.2.0" 2186 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2187 | integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== 2188 | dependencies: 2189 | shebang-regex "^1.0.0" 2190 | 2191 | shebang-command@^2.0.0: 2192 | version "2.0.0" 2193 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2194 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2195 | dependencies: 2196 | shebang-regex "^3.0.0" 2197 | 2198 | shebang-regex@^1.0.0: 2199 | version "1.0.0" 2200 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2201 | integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== 2202 | 2203 | shebang-regex@^3.0.0: 2204 | version "3.0.0" 2205 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2206 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2207 | 2208 | side-channel@^1.0.4: 2209 | version "1.0.4" 2210 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 2211 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 2212 | dependencies: 2213 | call-bind "^1.0.0" 2214 | get-intrinsic "^1.0.2" 2215 | object-inspect "^1.9.0" 2216 | 2217 | signal-exit@^3.0.2, signal-exit@^3.0.3: 2218 | version "3.0.7" 2219 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 2220 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2221 | 2222 | slash@^3.0.0: 2223 | version "3.0.0" 2224 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2225 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2226 | 2227 | smartwrap@^2.0.2: 2228 | version "2.0.2" 2229 | resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" 2230 | integrity sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== 2231 | dependencies: 2232 | array.prototype.flat "^1.2.3" 2233 | breakword "^1.0.5" 2234 | grapheme-splitter "^1.0.4" 2235 | strip-ansi "^6.0.0" 2236 | wcwidth "^1.0.1" 2237 | yargs "^15.1.0" 2238 | 2239 | spawndamnit@^2.0.0: 2240 | version "2.0.0" 2241 | resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" 2242 | integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== 2243 | dependencies: 2244 | cross-spawn "^5.1.0" 2245 | signal-exit "^3.0.2" 2246 | 2247 | spdx-correct@^3.0.0: 2248 | version "3.2.0" 2249 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" 2250 | integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== 2251 | dependencies: 2252 | spdx-expression-parse "^3.0.0" 2253 | spdx-license-ids "^3.0.0" 2254 | 2255 | spdx-exceptions@^2.1.0: 2256 | version "2.3.0" 2257 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 2258 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 2259 | 2260 | spdx-expression-parse@^3.0.0: 2261 | version "3.0.1" 2262 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 2263 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 2264 | dependencies: 2265 | spdx-exceptions "^2.1.0" 2266 | spdx-license-ids "^3.0.0" 2267 | 2268 | spdx-license-ids@^3.0.0: 2269 | version "3.0.13" 2270 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" 2271 | integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== 2272 | 2273 | split2@^3.0.0, split2@^3.2.2: 2274 | version "3.2.2" 2275 | resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" 2276 | integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== 2277 | dependencies: 2278 | readable-stream "^3.0.0" 2279 | 2280 | sprintf-js@~1.0.2: 2281 | version "1.0.3" 2282 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2283 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 2284 | 2285 | stream-transform@^2.1.3: 2286 | version "2.1.3" 2287 | resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" 2288 | integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== 2289 | dependencies: 2290 | mixme "^0.5.1" 2291 | 2292 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 2293 | version "4.2.3" 2294 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2295 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2296 | dependencies: 2297 | emoji-regex "^8.0.0" 2298 | is-fullwidth-code-point "^3.0.0" 2299 | strip-ansi "^6.0.1" 2300 | 2301 | string.prototype.trim@^1.2.7: 2302 | version "1.2.7" 2303 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" 2304 | integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== 2305 | dependencies: 2306 | call-bind "^1.0.2" 2307 | define-properties "^1.1.4" 2308 | es-abstract "^1.20.4" 2309 | 2310 | string.prototype.trimend@^1.0.6: 2311 | version "1.0.6" 2312 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" 2313 | integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== 2314 | dependencies: 2315 | call-bind "^1.0.2" 2316 | define-properties "^1.1.4" 2317 | es-abstract "^1.20.4" 2318 | 2319 | string.prototype.trimstart@^1.0.6: 2320 | version "1.0.6" 2321 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" 2322 | integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== 2323 | dependencies: 2324 | call-bind "^1.0.2" 2325 | define-properties "^1.1.4" 2326 | es-abstract "^1.20.4" 2327 | 2328 | string_decoder@^1.1.1: 2329 | version "1.3.0" 2330 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 2331 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 2332 | dependencies: 2333 | safe-buffer "~5.2.0" 2334 | 2335 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2336 | version "6.0.1" 2337 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2338 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2339 | dependencies: 2340 | ansi-regex "^5.0.1" 2341 | 2342 | strip-bom@^3.0.0: 2343 | version "3.0.0" 2344 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2345 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 2346 | 2347 | strip-final-newline@^2.0.0: 2348 | version "2.0.0" 2349 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 2350 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 2351 | 2352 | strip-indent@^3.0.0: 2353 | version "3.0.0" 2354 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" 2355 | integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== 2356 | dependencies: 2357 | min-indent "^1.0.0" 2358 | 2359 | supports-color@^5.3.0: 2360 | version "5.5.0" 2361 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2362 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2363 | dependencies: 2364 | has-flag "^3.0.0" 2365 | 2366 | supports-color@^7.1.0: 2367 | version "7.2.0" 2368 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2369 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2370 | dependencies: 2371 | has-flag "^4.0.0" 2372 | 2373 | supports-preserve-symlinks-flag@^1.0.0: 2374 | version "1.0.0" 2375 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2376 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2377 | 2378 | term-size@^2.1.0: 2379 | version "2.2.1" 2380 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" 2381 | integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== 2382 | 2383 | text-extensions@^1.0.0: 2384 | version "1.9.0" 2385 | resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" 2386 | integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== 2387 | 2388 | through2@^4.0.0: 2389 | version "4.0.2" 2390 | resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" 2391 | integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== 2392 | dependencies: 2393 | readable-stream "3" 2394 | 2395 | "through@>=2.2.7 <3": 2396 | version "2.3.8" 2397 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2398 | integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== 2399 | 2400 | tmp@^0.0.33: 2401 | version "0.0.33" 2402 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 2403 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 2404 | dependencies: 2405 | os-tmpdir "~1.0.2" 2406 | 2407 | to-regex-range@^5.0.1: 2408 | version "5.0.1" 2409 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2410 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2411 | dependencies: 2412 | is-number "^7.0.0" 2413 | 2414 | tr46@~0.0.3: 2415 | version "0.0.3" 2416 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 2417 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 2418 | 2419 | trim-newlines@^3.0.0: 2420 | version "3.0.1" 2421 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" 2422 | integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== 2423 | 2424 | ts-node@^10.8.1: 2425 | version "10.9.1" 2426 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 2427 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 2428 | dependencies: 2429 | "@cspotcode/source-map-support" "^0.8.0" 2430 | "@tsconfig/node10" "^1.0.7" 2431 | "@tsconfig/node12" "^1.0.7" 2432 | "@tsconfig/node14" "^1.0.0" 2433 | "@tsconfig/node16" "^1.0.2" 2434 | acorn "^8.4.1" 2435 | acorn-walk "^8.1.1" 2436 | arg "^4.1.0" 2437 | create-require "^1.1.0" 2438 | diff "^4.0.1" 2439 | make-error "^1.1.1" 2440 | v8-compile-cache-lib "^3.0.1" 2441 | yn "3.1.1" 2442 | 2443 | tty-table@^4.1.5: 2444 | version "4.2.1" 2445 | resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.2.1.tgz#c06cd76c54542acf4e2b4a0e9a5802984b65cba6" 2446 | integrity sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g== 2447 | dependencies: 2448 | chalk "^4.1.2" 2449 | csv "^5.5.3" 2450 | kleur "^4.1.5" 2451 | smartwrap "^2.0.2" 2452 | strip-ansi "^6.0.1" 2453 | wcwidth "^1.0.1" 2454 | yargs "^17.7.1" 2455 | 2456 | type-fest@^0.13.1: 2457 | version "0.13.1" 2458 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" 2459 | integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== 2460 | 2461 | type-fest@^0.18.0: 2462 | version "0.18.1" 2463 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" 2464 | integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== 2465 | 2466 | type-fest@^0.6.0: 2467 | version "0.6.0" 2468 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" 2469 | integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== 2470 | 2471 | type-fest@^0.8.1: 2472 | version "0.8.1" 2473 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 2474 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 2475 | 2476 | typed-array-buffer@^1.0.0: 2477 | version "1.0.0" 2478 | resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" 2479 | integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== 2480 | dependencies: 2481 | call-bind "^1.0.2" 2482 | get-intrinsic "^1.2.1" 2483 | is-typed-array "^1.1.10" 2484 | 2485 | typed-array-byte-length@^1.0.0: 2486 | version "1.0.0" 2487 | resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" 2488 | integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== 2489 | dependencies: 2490 | call-bind "^1.0.2" 2491 | for-each "^0.3.3" 2492 | has-proto "^1.0.1" 2493 | is-typed-array "^1.1.10" 2494 | 2495 | typed-array-byte-offset@^1.0.0: 2496 | version "1.0.0" 2497 | resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" 2498 | integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== 2499 | dependencies: 2500 | available-typed-arrays "^1.0.5" 2501 | call-bind "^1.0.2" 2502 | for-each "^0.3.3" 2503 | has-proto "^1.0.1" 2504 | is-typed-array "^1.1.10" 2505 | 2506 | typed-array-length@^1.0.4: 2507 | version "1.0.4" 2508 | resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" 2509 | integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== 2510 | dependencies: 2511 | call-bind "^1.0.2" 2512 | for-each "^0.3.3" 2513 | is-typed-array "^1.1.9" 2514 | 2515 | "typescript@^4.6.4 || ^5.0.0": 2516 | version "5.1.6" 2517 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" 2518 | integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== 2519 | 2520 | unbox-primitive@^1.0.2: 2521 | version "1.0.2" 2522 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" 2523 | integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== 2524 | dependencies: 2525 | call-bind "^1.0.2" 2526 | has-bigints "^1.0.2" 2527 | has-symbols "^1.0.3" 2528 | which-boxed-primitive "^1.0.2" 2529 | 2530 | universalify@^0.1.0: 2531 | version "0.1.2" 2532 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 2533 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 2534 | 2535 | universalify@^2.0.0: 2536 | version "2.0.0" 2537 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 2538 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 2539 | 2540 | uri-js@^4.2.2: 2541 | version "4.4.1" 2542 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2543 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2544 | dependencies: 2545 | punycode "^2.1.0" 2546 | 2547 | util-deprecate@^1.0.1: 2548 | version "1.0.2" 2549 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2550 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 2551 | 2552 | v8-compile-cache-lib@^3.0.1: 2553 | version "3.0.1" 2554 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 2555 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 2556 | 2557 | validate-npm-package-license@^3.0.1: 2558 | version "3.0.4" 2559 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2560 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2561 | dependencies: 2562 | spdx-correct "^3.0.0" 2563 | spdx-expression-parse "^3.0.0" 2564 | 2565 | wcwidth@^1.0.1: 2566 | version "1.0.1" 2567 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 2568 | integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== 2569 | dependencies: 2570 | defaults "^1.0.3" 2571 | 2572 | webidl-conversions@^3.0.0: 2573 | version "3.0.1" 2574 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 2575 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 2576 | 2577 | whatwg-url@^5.0.0: 2578 | version "5.0.0" 2579 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 2580 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 2581 | dependencies: 2582 | tr46 "~0.0.3" 2583 | webidl-conversions "^3.0.0" 2584 | 2585 | which-boxed-primitive@^1.0.2: 2586 | version "1.0.2" 2587 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 2588 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 2589 | dependencies: 2590 | is-bigint "^1.0.1" 2591 | is-boolean-object "^1.1.0" 2592 | is-number-object "^1.0.4" 2593 | is-string "^1.0.5" 2594 | is-symbol "^1.0.3" 2595 | 2596 | which-module@^2.0.0: 2597 | version "2.0.1" 2598 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" 2599 | integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== 2600 | 2601 | which-pm@2.0.0: 2602 | version "2.0.0" 2603 | resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" 2604 | integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== 2605 | dependencies: 2606 | load-yaml-file "^0.2.0" 2607 | path-exists "^4.0.0" 2608 | 2609 | which-typed-array@^1.1.10, which-typed-array@^1.1.11: 2610 | version "1.1.11" 2611 | resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" 2612 | integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== 2613 | dependencies: 2614 | available-typed-arrays "^1.0.5" 2615 | call-bind "^1.0.2" 2616 | for-each "^0.3.3" 2617 | gopd "^1.0.1" 2618 | has-tostringtag "^1.0.0" 2619 | 2620 | which@^1.2.9: 2621 | version "1.3.1" 2622 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2623 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2624 | dependencies: 2625 | isexe "^2.0.0" 2626 | 2627 | which@^2.0.1: 2628 | version "2.0.2" 2629 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2630 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2631 | dependencies: 2632 | isexe "^2.0.0" 2633 | 2634 | wrap-ansi@^6.2.0: 2635 | version "6.2.0" 2636 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 2637 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 2638 | dependencies: 2639 | ansi-styles "^4.0.0" 2640 | string-width "^4.1.0" 2641 | strip-ansi "^6.0.0" 2642 | 2643 | wrap-ansi@^7.0.0: 2644 | version "7.0.0" 2645 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2646 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2647 | dependencies: 2648 | ansi-styles "^4.0.0" 2649 | string-width "^4.1.0" 2650 | strip-ansi "^6.0.0" 2651 | 2652 | y18n@^4.0.0: 2653 | version "4.0.3" 2654 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" 2655 | integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== 2656 | 2657 | y18n@^5.0.5: 2658 | version "5.0.8" 2659 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 2660 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 2661 | 2662 | yallist@^2.1.2: 2663 | version "2.1.2" 2664 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2665 | integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== 2666 | 2667 | yallist@^4.0.0: 2668 | version "4.0.0" 2669 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2670 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2671 | 2672 | yargs-parser@^18.1.2, yargs-parser@^18.1.3: 2673 | version "18.1.3" 2674 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" 2675 | integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== 2676 | dependencies: 2677 | camelcase "^5.0.0" 2678 | decamelize "^1.2.0" 2679 | 2680 | yargs-parser@^20.2.3: 2681 | version "20.2.9" 2682 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 2683 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 2684 | 2685 | yargs-parser@^21.1.1: 2686 | version "21.1.1" 2687 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 2688 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 2689 | 2690 | yargs@^15.1.0: 2691 | version "15.4.1" 2692 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" 2693 | integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== 2694 | dependencies: 2695 | cliui "^6.0.0" 2696 | decamelize "^1.2.0" 2697 | find-up "^4.1.0" 2698 | get-caller-file "^2.0.1" 2699 | require-directory "^2.1.1" 2700 | require-main-filename "^2.0.0" 2701 | set-blocking "^2.0.0" 2702 | string-width "^4.2.0" 2703 | which-module "^2.0.0" 2704 | y18n "^4.0.0" 2705 | yargs-parser "^18.1.2" 2706 | 2707 | yargs@^17.0.0, yargs@^17.7.1: 2708 | version "17.7.2" 2709 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 2710 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 2711 | dependencies: 2712 | cliui "^8.0.1" 2713 | escalade "^3.1.1" 2714 | get-caller-file "^2.0.5" 2715 | require-directory "^2.1.1" 2716 | string-width "^4.2.3" 2717 | y18n "^5.0.5" 2718 | yargs-parser "^21.1.1" 2719 | 2720 | yn@3.1.1: 2721 | version "3.1.1" 2722 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2723 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2724 | 2725 | yocto-queue@^0.1.0: 2726 | version "0.1.0" 2727 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2728 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2729 | --------------------------------------------------------------------------------