├── .github ├── ISSUE_TEMPLATE │ └── bug_report.md └── workflows │ ├── release.yml │ └── test.yml ├── .gitignore ├── .goreleaser.yml ├── .vscode └── settings.json ├── LICENSE ├── _config.yml ├── checker.go ├── ci.go ├── cli.go ├── config.go ├── deployReport.go ├── go.mod ├── go.sum ├── main.go ├── modules.go ├── package.json ├── pnpm-lock.yaml ├── readme.md ├── results.go ├── scripts └── postinstall.ts ├── serverless ├── .gitignore ├── api │ └── proxy │ │ ├── issueComments.go │ │ └── updateComment.go └── shared │ └── auth.go ├── static ├── htmlReport.html └── markdownReport.md ├── tsconfig.json ├── utils.go └── writer.go /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior or minium reproducible example: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Context** 24 | 1. `deep` version 25 | 2. `OS` 26 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Release CI 3 | 4 | on: 5 | push: 6 | tags: 7 | - '*' 8 | workflow_dispatch: 9 | 10 | 11 | jobs: 12 | release-go: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v2 17 | with: 18 | fetch-depth: 0 19 | - name: Set up Go 20 | uses: actions/setup-go@v2 21 | with: 22 | go-version: 1.17 23 | - name: Run GoReleaser 24 | uses: goreleaser/goreleaser-action@v2 25 | if: startsWith(github.ref, 'refs/tags/') 26 | with: 27 | version: latest 28 | args: release --rm-dist 29 | env: 30 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 31 | 32 | release-npm: 33 | runs-on: ubuntu-latest 34 | steps: 35 | - name: Checkout 36 | uses: actions/checkout@v2 37 | - name: Setup node 38 | uses: actions/setup-node@v2 39 | with: 40 | node-version: 14.x 41 | registry-url: 'https://registry.npmjs.org' 42 | - name: Cache pnpm modules 43 | uses: actions/cache@v2 44 | env: 45 | cache-name: cache-pnpm-modules 46 | with: 47 | path: ~/.pnpm-store 48 | key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}-${{ hashFiles('**/package.json') }} 49 | restore-keys: | 50 | ${{ runner.os }}-build-${{ env.cache-name }}-${{ matrix.node-version }}- 51 | - name: Install pnpm 52 | run: curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@6 53 | - run: pnpm install --ignore-scripts 54 | - run: pnpm publish --no-git-checks 55 | env: 56 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 57 | test-installer: 58 | if: ${{ always() }} # Will run even if one of the releases fails, This is really for testing purposes cause release-go can't release twice 59 | needs: [release-npm, release-go] 60 | runs-on: ${{ matrix.os }} 61 | strategy: 62 | matrix: 63 | os: [macos-latest, ubuntu-latest, windows-latest] 64 | steps: 65 | - name: Install Node.js, NPM and Yarn 66 | uses: actions/setup-node@v1 67 | with: 68 | node-version: 14 69 | - run: npm install -g depp-installer 70 | - run: depp --help 71 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test CI 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | test-installer: 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [macos-latest, ubuntu-latest, windows-latest] 12 | steps: 13 | - name: Install Node.js, NPM and Yarn 14 | uses: actions/setup-node@v1 15 | with: 16 | node-version: 14 17 | - run: npm install -g depp-installer 18 | - run: depp --help -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | test/ 2 | depCheckDist 3 | node_modules 4 | dist/ 5 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | # This is an example .goreleaser.yml file with some sensible defaults. 2 | # Make sure to check the documentation at https://goreleaser.com 3 | before: 4 | hooks: 5 | # You may remove this if you don't use go modules. 6 | - go mod tidy 7 | # you may remove this if you don't need go generate 8 | - go generate ./... 9 | builds: 10 | - env: 11 | - CGO_ENABLED=0 12 | goos: 13 | - linux 14 | - windows 15 | - darwin 16 | archives: 17 | - replacements: 18 | darwin: Darwin 19 | linux: Linux 20 | windows: Windows 21 | 386: i386 22 | amd64: x86_64 23 | checksum: 24 | name_template: 'checksums.txt' 25 | snapshot: 26 | name_template: "{{ incpatch .Version }}-next" 27 | changelog: 28 | sort: asc 29 | filters: 30 | exclude: 31 | - '^docs:' 32 | - '^test:' 33 | release: 34 | github: 35 | owner: cryogenicplanet 36 | name: depp 37 | project_name: depp -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "Deps", 4 | "gjson" 5 | ] 6 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Rahul Tarak 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.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal -------------------------------------------------------------------------------- /checker.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | 7 | "github.com/fatih/color" 8 | "github.com/tidwall/gjson" 9 | ) 10 | 11 | // This function will go through the MetaFile to double check any missed imports 12 | func checkMetaFile(metaFile string, rootPath string, sourcePaths []string) bool { 13 | 14 | metafile := gjson.Parse(metaFile).Value().(map[string]interface{}) 15 | 16 | inputs := metafile["inputs"].(map[string]interface{}) 17 | // fmt.Println("Inputs", inputs) 18 | newInputs := map[string]interface{}{} 19 | folders := strings.Split(rootPath, "/") 20 | lastFolder := folders[len(folders)-1] 21 | 22 | for key, val := range inputs { 23 | if strings.Contains(key, "node_modules") { 24 | continue 25 | } 26 | // Imported files 27 | // fmt.Println("Updating key", key, "using last folder", lastFolder) 28 | 29 | if index := strings.Index(key, lastFolder); index != -1 { 30 | newKey := key[index:] 31 | newInputs[newKey] = val 32 | } else { 33 | newKey := lastFolder + "/" + key 34 | newInputs[newKey] = val 35 | } 36 | 37 | } 38 | 39 | for _, source := range sourcePaths { 40 | 41 | index := strings.Index(source, lastFolder) 42 | 43 | trimmedSource := source[index:] 44 | 45 | if inputFileInter, ok := newInputs[trimmedSource]; ok { 46 | 47 | inputFile := inputFileInter.(map[string]interface{}) 48 | 49 | for _, importCallInt := range inputFile["imports"].([]interface{}) { 50 | importCall := importCallInt.(map[string]interface{}) 51 | 52 | // fmt.Println("Handling import call", importCall, "from source", trimmedSource) 53 | if importCall["kind"] == "import-statement" || importCall["kind"] == "require-call" { 54 | path := importCall["path"].(string) 55 | lastNM := strings.LastIndex(path, "node_module") 56 | 57 | if lastNM == -1 { 58 | // color.New(color.FgYellow).Println("[WARN] Error finding node_module in require call, skipping", path) 59 | break 60 | } 61 | 62 | str := path[lastNM:] 63 | 64 | splitBySlash := strings.Split(str, "/") 65 | // fmt.Println(importer, lastNM, str, splitBySlash) 66 | moduleName := splitBySlash[1] 67 | 68 | if strings.Contains(moduleName, "@") { 69 | // using a @x/y package 70 | // Example @babel/core 71 | moduleName += "/" + splitBySlash[2] 72 | } 73 | 74 | checkModule(moduleName) 75 | 76 | } 77 | } 78 | } 79 | } 80 | return true 81 | } 82 | 83 | // Check @types packages in the packagejson 84 | func checkAtTypesPackages() []string { 85 | 86 | unused := []string{} 87 | 88 | yellow := color.New(color.FgYellow) 89 | 90 | for packageName, _ := range deps { 91 | if checkTypePackage(packageName) { 92 | // This is a @type package 93 | originalName := strings.Split(packageName, "/")[1] 94 | if _, ok := deps[originalName]; !ok { 95 | unused = append(unused, packageName) 96 | } 97 | 98 | } 99 | } 100 | fmt.Print("The unused '@types' packages are ") 101 | yellow.Println(strings.Join(unused, ", ")) 102 | 103 | return unused 104 | 105 | } 106 | 107 | func unusedTypesPackagesMarkdownTable(unusedTypes []string) { 108 | if len(unusedTypes) > 0 { 109 | reportLog("## Unused `@types` packages") 110 | reportLog("| Type Package | Actual Package | Used By |") 111 | reportLog("| ----------- | ----------- | ----------- |") 112 | 113 | for _, val := range unusedTypes { 114 | originalName := strings.Split(val, "/")[1] 115 | reportLog("| ", val, " | ", originalName, " | `", strings.Join(depsName[val], ", "), "` | ") 116 | } 117 | reportLog("---") 118 | } 119 | } 120 | 121 | func checkTypePackage(name string) bool { 122 | return strings.Contains(name, "@types/") 123 | } 124 | -------------------------------------------------------------------------------- /ci.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "encoding/json" 6 | "fmt" 7 | "io/ioutil" 8 | "net/http" 9 | "net/url" 10 | "os" 11 | "strconv" 12 | "strings" 13 | 14 | "github.com/google/go-github/v39/github" 15 | "golang.org/x/oauth2" 16 | ) 17 | 18 | var githubToken string 19 | var ciMode bool 20 | var repo string = "cryogenicplanet.github.io" 21 | var owner string = "CryogenicPlanet" 22 | var issue int = 49 // ISSUE AND PR ARE THE SAME FOR GITHUB API PURPOSES 23 | var markdownString string 24 | 25 | type Issue struct { 26 | Number int `json:"number"` 27 | } 28 | 29 | // Type for this payload are defined here 30 | // https://github.com/actions/toolkit/blob/e2eeb0a784f4067a75f0c6cd2cc9703f3cbc7744/packages/github/src/interfaces.ts#L15 31 | type Payload struct { 32 | Issues Issue `json:"issues"` 33 | PullRequest Issue `json:"pull_request"` 34 | } 35 | 36 | type IssueComment struct { 37 | Body string `json:"body"` 38 | Id int64 `json:"id"` 39 | } 40 | 41 | const DEEP_REPORT_TITLE = "# Depp Report" 42 | 43 | func checkIfPublic() bool { 44 | isPublic := os.Getenv("IS_PUBLIC") 45 | if isPublic != "" { 46 | // Public repo no need to proxy 47 | 48 | return true 49 | } 50 | return false 51 | } 52 | 53 | func checkPrComments() int64 { 54 | 55 | client := github.NewClient(nil) 56 | ctx := context.Background() 57 | 58 | var response *http.Response 59 | 60 | if checkIfPublic() { 61 | // Public repo no need to proxy 62 | 63 | issueData, _, err := client.Issues.Get(ctx, owner, repo, issue) 64 | 65 | check(err) 66 | 67 | issueUrl := issueData.GetCommentsURL() 68 | 69 | link, err := url.Parse(issueUrl) 70 | 71 | check(err) 72 | 73 | client.BareDo(ctx, &http.Request{Method: "GET", URL: link}) 74 | 75 | } else { 76 | 77 | query := url.Values{} 78 | 79 | query.Add("repo", repo) 80 | query.Add("issue", fmt.Sprint(issue)) 81 | 82 | query.Add("owner", owner) 83 | 84 | // fmt.Printf("%+v\n", issueData) 85 | 86 | link, err := url.Parse("https://depp-serverless.vercel.app/api/proxy/issueComments?" + query.Encode()) 87 | 88 | check(err) 89 | 90 | response, err = http.Get(link.String()) 91 | 92 | check(err) 93 | } 94 | 95 | body, err := ioutil.ReadAll(response.Body) 96 | 97 | check(err) 98 | 99 | issueComments := []IssueComment{} 100 | 101 | json.Unmarshal(body, &issueComments) 102 | 103 | for _, comment := range issueComments { 104 | if strings.Contains(comment.Body, DEEP_REPORT_TITLE) { 105 | return comment.Id 106 | } 107 | } 108 | return -1 109 | } 110 | 111 | func makePrComment(deployUrl string) { 112 | setGithubRepoFromEnv() 113 | setIssueNumberFromEnv() 114 | 115 | ctx := context.Background() 116 | ts := oauth2.StaticTokenSource( 117 | &oauth2.Token{AccessToken: githubToken}, 118 | ) 119 | tc := oauth2.NewClient(ctx, ts) 120 | 121 | client := github.NewClient(tc) 122 | 123 | body := DEEP_REPORT_TITLE + "\n Report Deploy URL is " + deployUrl + "\n \n" + markdownString 124 | 125 | commentId := checkPrComments() 126 | 127 | if checkIfPublic() { 128 | 129 | if commentId == -1 { 130 | _, _, err := client.Issues.CreateComment(ctx, owner, repo, issue, &github.IssueComment{Body: &body}) 131 | check(err) 132 | 133 | } else { 134 | _, _, err := client.Issues.EditComment(ctx, owner, repo, commentId, &github.IssueComment{Body: &body}) 135 | check(err) 136 | } 137 | } else { 138 | 139 | query := url.Values{} 140 | 141 | query.Add("repo", repo) 142 | if commentId == -1 { 143 | query.Add("issue", fmt.Sprint(issue)) 144 | } else { 145 | query.Add("commentId", fmt.Sprint(commentId)) 146 | } 147 | query.Add("owner", owner) 148 | query.Add("commentBody", body) 149 | 150 | link, err := url.Parse("https://depp-serverless.vercel.app/api/proxy/updateComment?" + query.Encode()) 151 | 152 | check(err) 153 | 154 | resp, err := http.Get(link.String()) 155 | 156 | if err != nil { 157 | fmt.Println("[WARN]", err) 158 | } 159 | 160 | if resp.StatusCode > 300 { 161 | fmt.Println("Failed response", resp.Status, resp) 162 | body, err := ioutil.ReadAll(resp.Body) 163 | if err != nil { 164 | fmt.Println("[Error]", err) 165 | } 166 | 167 | fmt.Println("Failed to comment on PR :(", owner, repo, issue) 168 | 169 | panic(string(body)) 170 | } 171 | 172 | } 173 | 174 | fmt.Println("Commented on PR!", owner, repo, issue) 175 | 176 | } 177 | 178 | func setGithubRepoFromEnv() { 179 | repoUrl := os.Getenv("GITHUB_REPOSITORY") 180 | 181 | if repoUrl == "" { 182 | panic("ENV GITHUB_REPOSITORY not found, do not use -ci in local environment") 183 | } 184 | 185 | splits := strings.Split(repoUrl, "/") 186 | 187 | owner = splits[0] 188 | repo = splits[1] 189 | } 190 | 191 | func setIssueNumberFromEnv() { 192 | prNumber := os.Getenv("PR_NUMBER") 193 | 194 | if prNumber == "" { 195 | panic("ENV PR_NUMBER not set, please set ENV PR_NUMBER when using -ci") 196 | } 197 | 198 | no, err := strconv.Atoi(prNumber) 199 | if err != nil { 200 | // handle error 201 | fmt.Println(err) 202 | os.Exit(2) 203 | } 204 | issue = no 205 | 206 | } 207 | -------------------------------------------------------------------------------- /cli.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/urfave/cli/v2" 5 | ) 6 | 7 | func createCliApp() cli.App { 8 | configCommands := setupConfigCLI() 9 | 10 | commands := []*cli.Command{ 11 | { 12 | Name: "clean", 13 | Usage: "Cleans all output files", 14 | Action: func(c *cli.Context) error { 15 | removeDirectory(false) 16 | return nil 17 | }, 18 | }, 19 | { 20 | Name: "show", 21 | Usage: "Shows previous report", 22 | Action: func(c *cli.Context) error { 23 | openHtml() 24 | return nil 25 | }, 26 | }, 27 | { 28 | Name: "deploy", 29 | Usage: "Automatically deploy your report to netlify", 30 | Aliases: []string{"d"}, 31 | Action: func(c *cli.Context) error { 32 | deployToNetlify() 33 | return nil 34 | }, 35 | Flags: []cli.Flag{ 36 | &cli.StringFlag{ 37 | Name: "token", 38 | Required: true, 39 | Usage: "Netlify PAT", 40 | Destination: &netlifyToken, 41 | }, 42 | }, 43 | }, 44 | } 45 | 46 | commands = append(commands, configCommands...) 47 | 48 | flags := []cli.Flag{ 49 | &cli.BoolFlag{ 50 | Name: "dev", 51 | Aliases: []string{"d"}, 52 | Usage: "Enable dev dependencies", 53 | Destination: &globalConfig.DevDependencies, 54 | }, 55 | &cli.BoolFlag{ 56 | Name: "js", 57 | Aliases: []string{"j"}, 58 | Usage: "Enable js source files", 59 | Destination: &globalConfig.JS, 60 | }, 61 | &cli.PathFlag{ 62 | Name: "path", 63 | Aliases: []string{"p"}, 64 | Usage: "Overwrite root directory", 65 | Destination: &globalConfig.Path, 66 | }, 67 | &cli.BoolFlag{ 68 | Name: "log", 69 | Aliases: []string{"l"}, 70 | Usage: "Will write logs to .depcheck.log", 71 | Destination: &globalConfig.Log, 72 | }, 73 | &cli.StringFlag{ 74 | Name: "source", 75 | Aliases: []string{"s"}, 76 | Usage: "Overwrite default sources", 77 | Destination: &overwriteSource, 78 | }, 79 | &cli.BoolFlag{ 80 | Name: "report", 81 | Aliases: []string{"r"}, 82 | Usage: "Generate report file", 83 | Destination: &globalConfig.Report, 84 | }, 85 | &cli.BoolFlag{ 86 | Name: "show-versions", 87 | Aliases: []string{"v"}, 88 | Usage: "Show conflicting versions", 89 | Destination: &globalConfig.Versions, 90 | }, 91 | &cli.BoolFlag{ 92 | Name: "write-output-files", 93 | Aliases: []string{"w"}, 94 | Usage: "This will write the esbuild output files.", 95 | Destination: &esbuildWrite, 96 | }, 97 | &cli.StringSliceFlag{ 98 | Name: "externals", 99 | Aliases: []string{"e"}, 100 | Usage: "Pass custom externals using this flag", 101 | Destination: &externals, 102 | }, 103 | &cli.StringSliceFlag{ 104 | Name: "ignore-namespaces", 105 | Aliases: []string{"in"}, 106 | Usage: "Pass namespace (@monorepo) to be ignored", 107 | Destination: &ignoreNameSpaces, 108 | }, 109 | &cli.BoolFlag{ 110 | Name: "no-open", 111 | Aliases: []string{"no"}, 112 | Usage: "Flag to prevent auto opening report in browser", 113 | Destination: &noOpen, 114 | }, 115 | &cli.BoolFlag{ 116 | Name: "save-config", 117 | Aliases: []string{"sc"}, 118 | Usage: "Flag to automatically save config from other flags", 119 | Destination: &saveConfig, 120 | }, 121 | &cli.BoolFlag{ 122 | Name: "ci", 123 | Usage: "Run in github actions ci mode", 124 | Destination: &ciMode, 125 | }, 126 | &cli.StringFlag{ 127 | Name: "deploy", 128 | Usage: "Will automatically deploy report to netlify", 129 | Destination: &netlifyToken, 130 | }, 131 | &cli.BoolFlag{ 132 | Name: "browser", 133 | Usage: "Will use esbuild browser platform (by default it uses node platform)", 134 | Destination: &globalConfig.BrowserPlatform, 135 | }, 136 | &cli.StringSliceFlag{ 137 | Name: "ignore-path", 138 | Aliases: []string{"ip"}, 139 | Usage: "A glob pattern of files to be ignored", 140 | Destination: &ignorePaths, 141 | }, 142 | } 143 | 144 | app := &cli.App{ 145 | Name: "depp", 146 | EnableBashCompletion: true, 147 | Usage: "Find un used packages fast", 148 | Flags: flags, 149 | // Before: altsrc.InitInputSourceWithContext(flags, ), 150 | Action: func(c *cli.Context) error { 151 | loadConfigFromFile() 152 | 153 | depcheck() 154 | 155 | return nil 156 | }, 157 | Commands: commands, 158 | } 159 | 160 | return *app 161 | 162 | } 163 | -------------------------------------------------------------------------------- /config.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "io/ioutil" 7 | "os" 8 | "reflect" 9 | "strings" 10 | 11 | "github.com/AlecAivazis/survey/v2" 12 | "github.com/urfave/cli/v2" 13 | ) 14 | 15 | type ConfigJSON struct { 16 | JS bool `json:"js"` 17 | Path string `json:"path"` 18 | Log bool `json:"log"` 19 | Report bool `json:"report"` 20 | Versions bool `json:"show-versions"` 21 | DevDependencies bool `json:"dev"` 22 | Externals []string `json:"externals"` 23 | IgnoredNamespaces []string `json:"ignore-namespaces"` 24 | IgnoredPaths []string `json:"ignored-paths"` 25 | BrowserPlatform bool `json:"browser-platform"` 26 | } 27 | 28 | var esbuildWrite bool 29 | var noOpen bool 30 | 31 | var externals cli.StringSlice 32 | var ignoreNameSpaces cli.StringSlice 33 | var ignorePaths cli.StringSlice 34 | 35 | var globalConfig ConfigJSON 36 | var hasConfig bool 37 | var saveConfig bool 38 | 39 | func loadConfigFromFile() { 40 | 41 | configJson, err := os.ReadFile(DEPCHECK_DIR + "/config.json") 42 | 43 | if err != nil { 44 | return 45 | } 46 | 47 | config := ConfigJSON{} 48 | 49 | err = json.Unmarshal(configJson, &config) 50 | 51 | if err != nil { 52 | return 53 | } 54 | 55 | // Could not think of a better way to this should ask @zackradisic how it should be done 56 | // The following if states sets the precedence for flags and the config file 57 | // How it works 58 | // If flag is set --dev (true) then that will overwrite config value 59 | // However if flag is unset the value will be take from config file 60 | 61 | if !globalConfig.BrowserPlatform { 62 | globalConfig.BrowserPlatform = config.BrowserPlatform 63 | } 64 | 65 | if !globalConfig.DevDependencies { 66 | globalConfig.DevDependencies = config.DevDependencies 67 | } 68 | 69 | if !globalConfig.JS { 70 | globalConfig.JS = config.JS 71 | } 72 | 73 | if !globalConfig.Log { 74 | globalConfig.Log = config.Log 75 | } 76 | 77 | if !globalConfig.Report { 78 | globalConfig.Report = config.Report 79 | } 80 | 81 | if !globalConfig.Versions { 82 | globalConfig.Versions = config.Versions 83 | } 84 | 85 | if globalConfig.Path == "" { 86 | globalConfig.Path = config.Path 87 | } 88 | 89 | globalConfig.Externals = append(externals.Value(), config.Externals...) 90 | globalConfig.IgnoredNamespaces = append(ignoreNameSpaces.Value(), config.IgnoredNamespaces...) 91 | globalConfig.IgnoredPaths = append(ignorePaths.Value(), config.IgnoredPaths...) 92 | 93 | hasConfig = true 94 | 95 | fmt.Println("Externals", globalConfig.Externals) 96 | fmt.Println("Ignored Paths", globalConfig.IgnoredPaths) 97 | } 98 | 99 | func setupConfig() { 100 | createDirectory() 101 | 102 | config := ConfigJSON{JS: false, Report: true} 103 | 104 | prompt := &survey.Confirm{ 105 | Message: "Enable javascript (Default typescript only)", 106 | } 107 | survey.AskOne(prompt, &config.JS) 108 | 109 | prompt = &survey.Confirm{ 110 | Message: "Show versions of duplicate packages", 111 | } 112 | survey.AskOne(prompt, &config.Versions) 113 | 114 | prompt = &survey.Confirm{ 115 | Message: "Check dev dependencies (unstable)", 116 | } 117 | survey.AskOne(prompt, &config.DevDependencies) 118 | 119 | writeConfig((config)) 120 | } 121 | 122 | func setVersions() { 123 | config := retriveConfig() 124 | 125 | prompt := &survey.Confirm{ 126 | Message: "Show versions of duplicate packages", 127 | } 128 | survey.AskOne(prompt, &config.Versions) 129 | 130 | writeConfig(config) 131 | } 132 | 133 | func setJs() { 134 | config := retriveConfig() 135 | 136 | prompt := &survey.Confirm{ 137 | Message: "Enable javascript (Default typescript only)", 138 | } 139 | survey.AskOne(prompt, &config.JS) 140 | 141 | writeConfig(config) 142 | } 143 | 144 | func writeConfig(config ConfigJSON) { 145 | configJson, _ := json.Marshal(config) 146 | err := ioutil.WriteFile(DEPCHECK_DIR+"/config.json", configJson, 0644) 147 | 148 | if err != nil { 149 | panic(err) 150 | } 151 | } 152 | 153 | func retriveConfig() ConfigJSON { 154 | 155 | configJson, err := ioutil.ReadFile(DEPCHECK_DIR + "/config.json") 156 | 157 | if err != nil { 158 | fmt.Println("No config found, run depp init") 159 | os.Exit(1) 160 | } 161 | 162 | config := ConfigJSON{} 163 | 164 | err = json.Unmarshal(configJson, &config) 165 | 166 | if err != nil { 167 | fmt.Println("Not intialized config properly") 168 | os.Exit(1) 169 | } 170 | 171 | return config 172 | } 173 | 174 | func showConfig() { 175 | config := retriveConfig() 176 | 177 | fmt.Println("The current config is") 178 | 179 | v := reflect.ValueOf(config) 180 | typeOfS := v.Type() 181 | 182 | for i := 0; i < v.NumField(); i++ { 183 | fmt.Printf("%s\tValue: %v\n", typeOfS.Field(i).Name, v.Field(i).Interface()) 184 | } 185 | 186 | } 187 | 188 | func setPath(input string) { 189 | config := retriveConfig() 190 | 191 | if input == "" { 192 | prompt := &survey.Input{ 193 | Message: "Set Root Path", 194 | } 195 | survey.AskOne(prompt, &input) 196 | } 197 | config.Path = input 198 | 199 | writeConfig(config) 200 | } 201 | 202 | func setExternals(lines []string) { 203 | config := retriveConfig() 204 | 205 | if len(lines) == 0 { 206 | 207 | input := "" 208 | 209 | prompt := &survey.Multiline{ 210 | Message: "Set Externals (each line is one package)", 211 | } 212 | survey.AskOne(prompt, &input) 213 | 214 | lines = strings.Split(input, "\n") 215 | } 216 | 217 | config.Externals = lines 218 | 219 | writeConfig(config) 220 | } 221 | 222 | func addExternal(input string) { 223 | config := retriveConfig() 224 | 225 | if input == "" { 226 | prompt := &survey.Input{ 227 | Message: "Package to add as external", 228 | } 229 | survey.AskOne(prompt, &input) 230 | } 231 | 232 | config.Externals = append(config.Externals, input) 233 | 234 | writeConfig(config) 235 | } 236 | 237 | func removeExternal(input string) { 238 | config := retriveConfig() 239 | 240 | if input == "" { 241 | 242 | prompt := &survey.Input{ 243 | Message: "Package to remove as external", 244 | } 245 | survey.AskOne(prompt, &input) 246 | } 247 | 248 | index := -1 249 | 250 | for i, val := range config.Externals { 251 | if val == input { 252 | index = i 253 | } 254 | } 255 | 256 | config.Externals = append(config.Externals[:index], config.Externals[index+1:]...) 257 | 258 | writeConfig(config) 259 | } 260 | 261 | func setINS(lines []string) { 262 | config := retriveConfig() 263 | 264 | if len(lines) == 0 { 265 | input := "" 266 | 267 | prompt := &survey.Multiline{ 268 | Message: "Set Externals (each line is one package)", 269 | } 270 | survey.AskOne(prompt, &input) 271 | 272 | lines = strings.Split(input, "\n") 273 | } 274 | 275 | config.IgnoredNamespaces = lines 276 | 277 | writeConfig(config) 278 | } 279 | 280 | func addINS(input string) { 281 | config := retriveConfig() 282 | 283 | if input == "" { 284 | prompt := &survey.Input{ 285 | Message: "Package to add as external", 286 | } 287 | survey.AskOne(prompt, &input) 288 | } 289 | 290 | config.IgnoredNamespaces = append(config.IgnoredNamespaces, input) 291 | 292 | writeConfig(config) 293 | } 294 | 295 | func removeINS(input string) { 296 | config := retriveConfig() 297 | 298 | if input == "" { 299 | 300 | prompt := &survey.Input{ 301 | Message: "Package to remove as external", 302 | } 303 | survey.AskOne(prompt, &input) 304 | } 305 | 306 | index := -1 307 | 308 | for i, val := range config.IgnoredNamespaces { 309 | if val == input { 310 | index = i 311 | } 312 | } 313 | 314 | config.IgnoredNamespaces = append(config.IgnoredNamespaces[:index], config.IgnoredNamespaces[index+1:]...) 315 | 316 | writeConfig(config) 317 | } 318 | 319 | func setupConfigCLI() []*cli.Command { 320 | 321 | commands := []*cli.Command{ 322 | { 323 | Name: "config", 324 | Usage: "A command to handle config", 325 | Subcommands: []*cli.Command{ 326 | { 327 | Name: "show", 328 | Usage: "Show current configuration", 329 | Action: func(c *cli.Context) error { 330 | showConfig() 331 | return nil 332 | }, 333 | }, 334 | { 335 | Name: "path", 336 | Usage: "Set the root path", 337 | Action: func(c *cli.Context) error { 338 | setPath(c.Args().Get(0)) 339 | return nil 340 | }, 341 | }, 342 | { 343 | Name: "versions", 344 | Usage: "Set versions config", 345 | Action: func(c *cli.Context) error { 346 | setVersions() 347 | return nil 348 | }, 349 | }, 350 | { 351 | Name: "js", 352 | Usage: "Set js config", 353 | Action: func(c *cli.Context) error { 354 | setJs() 355 | return nil 356 | }, 357 | }, 358 | { 359 | Name: "externals", 360 | Usage: "Handle external config", 361 | Subcommands: []*cli.Command{ 362 | { 363 | Name: "add", 364 | Usage: "Add external", 365 | Action: func(c *cli.Context) error { 366 | addExternal(c.Args().Get(0)) 367 | return nil 368 | }, 369 | }, 370 | { 371 | Name: "set", 372 | Usage: "Set externals", 373 | Action: func(c *cli.Context) error { 374 | args := c.Args().Tail() 375 | args = append(args, c.Args().First()) 376 | setExternals(args) 377 | return nil 378 | }, 379 | }, 380 | { 381 | Name: "remove", 382 | Usage: "Remove external", 383 | Action: func(c *cli.Context) error { 384 | removeExternal(c.Args().Get(0)) 385 | return nil 386 | }, 387 | }, 388 | }, 389 | }, 390 | { 391 | Name: "ignored-namespaces", 392 | Usage: "Handle ignored namespace config", 393 | Subcommands: []*cli.Command{ 394 | { 395 | Name: "add", 396 | Usage: "Add ignored namespace", 397 | Action: func(c *cli.Context) error { 398 | addINS(c.Args().Get(0)) 399 | return nil 400 | }, 401 | }, 402 | { 403 | Name: "set", 404 | Usage: "Set ignored namespaces", 405 | Action: func(c *cli.Context) error { 406 | args := c.Args().Tail() 407 | args = append(args, c.Args().First()) 408 | setINS(args) 409 | return nil 410 | }, 411 | }, 412 | { 413 | Name: "remove", 414 | Usage: "Remove ignored namespace", 415 | Action: func(c *cli.Context) error { 416 | removeINS(c.Args().Get(0)) 417 | return nil 418 | }, 419 | }, 420 | }, 421 | }, 422 | }, 423 | }, 424 | { 425 | Name: "init", 426 | Usage: "Initialize project", 427 | Action: func(c *cli.Context) error { 428 | fmt.Println("Init project") 429 | setupConfig() 430 | return nil 431 | }, 432 | }, 433 | } 434 | 435 | return commands 436 | 437 | } 438 | -------------------------------------------------------------------------------- /deployReport.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "log" 6 | "net" 7 | "net/http" 8 | "time" 9 | 10 | "github.com/go-openapi/runtime" 11 | "github.com/go-openapi/strfmt" 12 | 13 | openapiClient "github.com/go-openapi/runtime/client" 14 | "github.com/netlify/open-api/v2/go/models" 15 | "github.com/netlify/open-api/v2/go/porcelain" 16 | netlifyContext "github.com/netlify/open-api/v2/go/porcelain/context" 17 | ) 18 | 19 | const ( 20 | apiHostname = "api.netlify.com" 21 | apiPath = "/api/v1" 22 | apiDebug = false 23 | siteName = "depp-report" 24 | ) 25 | 26 | type ctxKey int 27 | 28 | var netlifyToken string 29 | 30 | const ( 31 | apiClientKey ctxKey = 1 + iota 32 | ) 33 | 34 | func httpClient() *http.Client { 35 | return &http.Client{ 36 | Transport: &http.Transport{ 37 | Proxy: http.ProxyFromEnvironment, 38 | DialContext: (&net.Dialer{ 39 | Timeout: 30 * time.Second, 40 | KeepAlive: 30 * time.Second, 41 | DualStack: true, 42 | }).DialContext, 43 | MaxIdleConns: 100, 44 | IdleConnTimeout: 90 * time.Second, 45 | TLSHandshakeTimeout: 10 * time.Second, 46 | ExpectContinueTimeout: 1 * time.Second, 47 | MaxIdleConnsPerHost: -1, 48 | DisableKeepAlives: true, 49 | }, 50 | } 51 | } 52 | 53 | func newContext() context.Context { 54 | ctx := context.Background() 55 | 56 | // add OpenAPI Runtime credentials to context 57 | creds := runtime.ClientAuthInfoWriterFunc(func(r runtime.ClientRequest, _ strfmt.Registry) error { 58 | r.SetHeaderParam("User-Agent", "test") 59 | r.SetHeaderParam("Authorization", "Bearer "+netlifyToken) 60 | return nil 61 | }) 62 | ctx = netlifyContext.WithAuthInfo(ctx, creds) 63 | 64 | // create an OpenAPI transport 65 | transport := openapiClient.NewWithClient(apiHostname, apiPath, []string{"https"}, httpClient()) 66 | transport.SetDebug(apiDebug) 67 | 68 | // create a Netlify api client and add to context 69 | // 70 | // client can be porcelain.New or porcelain.NewRetryable 71 | 72 | // client := porcelain.New(transport, strfmt.Default) 73 | client := porcelain.NewRetryable(transport, strfmt.Default, porcelain.DefaultRetryAttempts) 74 | ctx = context.WithValue(ctx, apiClientKey, client) 75 | 76 | return ctx 77 | } 78 | 79 | func getClient(ctx context.Context) *porcelain.Netlify { 80 | return ctx.Value(apiClientKey).(*porcelain.Netlify) 81 | } 82 | 83 | func deployToNetlify() string { 84 | ctx := newContext() 85 | client := getClient(ctx) 86 | 87 | sites, err := client.ListSites(ctx, nil) 88 | check(err) 89 | 90 | var currentSite models.Site 91 | siteExists := false 92 | 93 | for _, site := range sites { 94 | name := site.Name 95 | if name == siteName { 96 | currentSite = *site 97 | siteExists = true 98 | // Exits 99 | break 100 | } 101 | } 102 | 103 | if !siteExists { 104 | site, err := client.CreateSite(ctx, &models.SiteSetup{Site: models.Site{Name: siteName}}, false) 105 | check(err) 106 | currentSite = *site 107 | } 108 | 109 | deploy, err := client.DeploySite(ctx, porcelain.DeployOptions{Dir: "./.depp", SiteID: currentSite.ID}) 110 | 111 | if err != nil { 112 | log.Fatal(err) 113 | } 114 | 115 | deployUrl := deploy.DeployURL 116 | 117 | return deployUrl 118 | 119 | } 120 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/cryogenicplanet/depp 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/AlecAivazis/survey/v2 v2.3.2 7 | github.com/bradleyfalzon/ghinstallation/v2 v2.0.3 8 | github.com/cryogenicplanet/mdopen v1.1.4 9 | github.com/evanw/esbuild v0.13.12 10 | github.com/fatih/color v1.13.0 11 | github.com/go-openapi/runtime v0.21.0 12 | github.com/go-openapi/strfmt v0.21.0 13 | github.com/google/go-github/v39 v39.2.0 14 | github.com/netlify/open-api/v2 v2.5.2 15 | github.com/tidwall/gjson v1.11.0 16 | github.com/urfave/cli/v2 v2.3.0 17 | golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 18 | ) 19 | 20 | require ( 21 | github.com/Azure/go-autorest v14.2.0+incompatible // indirect 22 | github.com/Azure/go-autorest/autorest v0.11.21 // indirect 23 | github.com/Azure/go-autorest/autorest/adal v0.9.16 // indirect 24 | github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect 25 | github.com/Azure/go-autorest/logger v0.2.1 // indirect 26 | github.com/Azure/go-autorest/tracing v0.6.0 // indirect 27 | github.com/PuerkitoBio/purell v1.1.1 // indirect 28 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect 29 | github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect 30 | github.com/cenkalti/backoff/v4 v4.1.1 // indirect 31 | github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect 32 | github.com/go-openapi/analysis v0.21.1 // indirect 33 | github.com/go-openapi/errors v0.20.1 // indirect 34 | github.com/go-openapi/jsonpointer v0.19.5 // indirect 35 | github.com/go-openapi/jsonreference v0.19.6 // indirect 36 | github.com/go-openapi/loads v0.21.0 // indirect 37 | github.com/go-openapi/spec v0.20.4 // indirect 38 | github.com/go-openapi/swag v0.19.15 // indirect 39 | github.com/go-openapi/validate v0.20.3 // indirect 40 | github.com/go-stack/stack v1.8.1 // indirect 41 | github.com/golang-jwt/jwt/v4 v4.1.0 // indirect 42 | github.com/golang/protobuf v1.4.2 // indirect 43 | github.com/gomarkdown/markdown v0.0.0-20210918233619-6c1113f12c4a // indirect 44 | github.com/google/go-querystring v1.1.0 // indirect 45 | github.com/josharian/intern v1.0.0 // indirect 46 | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect 47 | github.com/mailru/easyjson v0.7.7 // indirect 48 | github.com/mattn/go-colorable v0.1.11 // indirect 49 | github.com/mattn/go-isatty v0.0.14 // indirect 50 | github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect 51 | github.com/mitchellh/mapstructure v1.4.2 // indirect 52 | github.com/oklog/ulid v1.3.1 // indirect 53 | github.com/opentracing/opentracing-go v1.2.0 // indirect 54 | github.com/pkg/errors v0.9.1 // indirect 55 | github.com/rsc/goversion v1.2.0 // indirect 56 | github.com/russross/blackfriday/v2 v2.1.0 // indirect 57 | github.com/sirupsen/logrus v1.8.1 // indirect 58 | github.com/tidwall/match v1.1.1 // indirect 59 | github.com/tidwall/pretty v1.2.0 // indirect 60 | github.com/tink-ab/tempfile v0.0.0-20180226111222-33beb0518f1a // indirect 61 | go.mongodb.org/mongo-driver v1.7.4 // indirect 62 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect 63 | golang.org/x/net v0.0.0-20211104170005-ce137452f963 // indirect 64 | golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect 65 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect 66 | golang.org/x/text v0.3.7 // indirect 67 | google.golang.org/appengine v1.6.7 // indirect 68 | google.golang.org/protobuf v1.25.0 // indirect 69 | gopkg.in/yaml.v2 v2.4.0 // indirect 70 | ) 71 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 12 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= 13 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= 14 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= 15 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 16 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 17 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 18 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 19 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 20 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= 21 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 22 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 23 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 24 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 25 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 26 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 27 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= 28 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 29 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 30 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 31 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= 32 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= 33 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 34 | github.com/AlecAivazis/survey/v2 v2.3.2 h1:TqTB+aDDCLYhf9/bD2TwSO8u8jDSmMUd2SUVO4gCnU8= 35 | github.com/AlecAivazis/survey/v2 v2.3.2/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg= 36 | github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= 37 | github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= 38 | github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= 39 | github.com/Azure/go-autorest/autorest v0.10.1/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= 40 | github.com/Azure/go-autorest/autorest v0.11.21 h1:w77zY/9RnUAWcIQyDC0Fc89mCvwftR8F+zsR/OH6enk= 41 | github.com/Azure/go-autorest/autorest v0.11.21/go.mod h1:Do/yuMSW/13ayUkcVREpsMHGG+MvV81uzSCFgYPj4tM= 42 | github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= 43 | github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= 44 | github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= 45 | github.com/Azure/go-autorest/autorest/adal v0.9.16 h1:P8An8Z9rH1ldbOLdFpxYorgOt2sywL9V24dAwWHPuGc= 46 | github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= 47 | github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= 48 | github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= 49 | github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= 50 | github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= 51 | github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= 52 | github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= 53 | github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= 54 | github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= 55 | github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= 56 | github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= 57 | github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= 58 | github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= 59 | github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= 60 | github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= 61 | github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 62 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 63 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 64 | github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= 65 | github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= 66 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 67 | github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 68 | github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= 69 | github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 70 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= 71 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 72 | github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= 73 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 74 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 75 | github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= 76 | github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= 77 | github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 78 | github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 79 | github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= 80 | github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= 81 | github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= 82 | github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= 83 | github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= 84 | github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= 85 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 86 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 87 | github.com/bradleyfalzon/ghinstallation/v2 v2.0.3 h1:ywF/8q+GVpvlsEuvRb1SGSDQDUxntW1d4kFu/9q/YAE= 88 | github.com/bradleyfalzon/ghinstallation/v2 v2.0.3/go.mod h1:tlgi+JWCXnKFx/Y4WtnDbZEINo31N5bcvnCoqieefmk= 89 | github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= 90 | github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= 91 | github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= 92 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 93 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 94 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 95 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 96 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 97 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 98 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 99 | github.com/corbym/gocrest v1.0.3/go.mod h1:maVFL5lbdS2PgfOQgGRWDYTeunSWQeiEgoNdTABShCs= 100 | github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= 101 | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 102 | github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= 103 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 104 | github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 105 | github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 106 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 107 | github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= 108 | github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 109 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 110 | github.com/cryogenicplanet/mdopen v1.1.4 h1:s0C5OxBNse9nXrgARJ7sI0wp+a37WgytdWwS9+sXgkk= 111 | github.com/cryogenicplanet/mdopen v1.1.4/go.mod h1:5GSObfYYf3XGc+hWrTZKzbgsMwsJc0yndqwaiJbEfJw= 112 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 113 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 114 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 115 | github.com/deadcheat/goblet v1.3.1/go.mod h1:IrMNyAwyrVgB30HsND2WgleTUM4wHTS9m40yNY6NJQg= 116 | github.com/deadcheat/gonch v0.0.0-20180528124129-c2ff7a019863/go.mod h1:/5mH3gAuXUxGN3maOBAxBfB8RXvP9tBIX5fx2x1k0V0= 117 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 118 | github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= 119 | github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 120 | github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 121 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 122 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 123 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 124 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 125 | github.com/evanw/esbuild v0.13.12 h1:q8fmywXq1vIKlbA6XSxdU9LCLzMdrsD3wfM2gz2d8JU= 126 | github.com/evanw/esbuild v0.13.12/go.mod h1:GG+zjdi59yh3ehDn4ZWfPcATxjPDUH53iU4ZJbp7dkY= 127 | github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= 128 | github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= 129 | github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 130 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 131 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 132 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 133 | github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= 134 | github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= 135 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 136 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 137 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 138 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 139 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 140 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 141 | github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= 142 | github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= 143 | github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= 144 | github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= 145 | github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= 146 | github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= 147 | github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= 148 | github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= 149 | github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= 150 | github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= 151 | github.com/go-openapi/analysis v0.21.1 h1:krcNCEvCttpSUFBPOrfvn7nniejvrOkoNYRlZwQFpEs= 152 | github.com/go-openapi/analysis v0.21.1/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= 153 | github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= 154 | github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= 155 | github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= 156 | github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= 157 | github.com/go-openapi/errors v0.19.4/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= 158 | github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= 159 | github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= 160 | github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= 161 | github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= 162 | github.com/go-openapi/errors v0.20.1 h1:j23mMDtRxMwIobkpId7sWh7Ddcx4ivaoqUbfXx5P+a8= 163 | github.com/go-openapi/errors v0.20.1/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= 164 | github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= 165 | github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= 166 | github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= 167 | github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= 168 | github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 169 | github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= 170 | github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 171 | github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= 172 | github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= 173 | github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= 174 | github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= 175 | github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= 176 | github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= 177 | github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= 178 | github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= 179 | github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= 180 | github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= 181 | github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= 182 | github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= 183 | github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= 184 | github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= 185 | github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= 186 | github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= 187 | github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= 188 | github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= 189 | github.com/go-openapi/loads v0.21.0 h1:jYtUO4wwP7psAweisP/MDoOpdzsYEESdoPcsWjHDR68= 190 | github.com/go-openapi/loads v0.21.0/go.mod h1:rHYve9nZrQ4CJhyeIIFJINGCg1tQpx2yJrrNo8sf1ws= 191 | github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= 192 | github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= 193 | github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= 194 | github.com/go-openapi/runtime v0.19.12/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= 195 | github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= 196 | github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= 197 | github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= 198 | github.com/go-openapi/runtime v0.21.0 h1:giZ8eT26R+/rx6RX2MkYjZPY8vPYVKDhP/mOazrQHzM= 199 | github.com/go-openapi/runtime v0.21.0/go.mod h1:aQg+kaIQEn+A2CRSY1TxbM8+sT9g2V3aLc1FbIAnbbs= 200 | github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= 201 | github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= 202 | github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= 203 | github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= 204 | github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= 205 | github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= 206 | github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= 207 | github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= 208 | github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= 209 | github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= 210 | github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= 211 | github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= 212 | github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= 213 | github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= 214 | github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= 215 | github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= 216 | github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= 217 | github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= 218 | github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= 219 | github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= 220 | github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= 221 | github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= 222 | github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= 223 | github.com/go-openapi/strfmt v0.21.0 h1:hX2qEZKmYks+t0hKeb4VTJpUm2UYsdL3+DCid5swxIs= 224 | github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= 225 | github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= 226 | github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= 227 | github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 228 | github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 229 | github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= 230 | github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= 231 | github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= 232 | github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= 233 | github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 234 | github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 235 | github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= 236 | github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 237 | github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= 238 | github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= 239 | github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= 240 | github.com/go-openapi/validate v0.19.7/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= 241 | github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= 242 | github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= 243 | github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= 244 | github.com/go-openapi/validate v0.20.0/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= 245 | github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= 246 | github.com/go-openapi/validate v0.20.3 h1:GZPPhhKSZrE8HjB4eEkoYAZmoWA4+tCemSgINH1/vKw= 247 | github.com/go-openapi/validate v0.20.3/go.mod h1:goDdqVGiigM3jChcrYJxD2joalke3ZXeftD16byIjA4= 248 | github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 249 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 250 | github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= 251 | github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= 252 | github.com/go-swagger/go-swagger v0.23.0/go.mod h1:5AaV4Dx69cUjpFRTZnSHPr1Y7dKBVk6SvfIvkTEqwJs= 253 | github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= 254 | github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= 255 | github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= 256 | github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= 257 | github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= 258 | github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= 259 | github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= 260 | github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= 261 | github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= 262 | github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= 263 | github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= 264 | github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= 265 | github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= 266 | github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= 267 | github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= 268 | github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= 269 | github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= 270 | github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= 271 | github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= 272 | github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= 273 | github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= 274 | github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= 275 | github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= 276 | github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= 277 | github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= 278 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 279 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 280 | github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= 281 | github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0= 282 | github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= 283 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 284 | github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 285 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 286 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 287 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 288 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 289 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 290 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 291 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 292 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 293 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 294 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 295 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 296 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 297 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 298 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 299 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 300 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 301 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 302 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 303 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 304 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 305 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 306 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 307 | github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= 308 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 309 | github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 310 | github.com/gomarkdown/markdown v0.0.0-20180831092322-0465c5af6a9b/go.mod h1:gmFANS06wAVmF0B9yi65QKsRmPQ97tze7FRLswua+OY= 311 | github.com/gomarkdown/markdown v0.0.0-20210918233619-6c1113f12c4a h1:syEwbl3pF5Y1mnIStrPwqd50vNU1AAKuAy8HFCPAgUc= 312 | github.com/gomarkdown/markdown v0.0.0-20210918233619-6c1113f12c4a/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= 313 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 314 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 315 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 316 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 317 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 318 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 319 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 320 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 321 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 322 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 323 | github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= 324 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 325 | github.com/google/go-github/v39 v39.0.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= 326 | github.com/google/go-github/v39 v39.2.0 h1:rNNM311XtPOz5rDdsJXAp2o8F67X9FnROXTvto3aSnQ= 327 | github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= 328 | github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= 329 | github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 330 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 331 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 332 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 333 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 334 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 335 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 336 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 337 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 338 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 339 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 340 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 341 | github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= 342 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 343 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 344 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 345 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 346 | github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= 347 | github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 348 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 349 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= 350 | github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 351 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 352 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 353 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 354 | github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= 355 | github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= 356 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 357 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 358 | github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 359 | github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= 360 | github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= 361 | github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= 362 | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 363 | github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= 364 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 365 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 366 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 367 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 368 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 369 | github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= 370 | github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= 371 | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= 372 | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 373 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 374 | github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 375 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 376 | github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 377 | github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 378 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 379 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 380 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 381 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 382 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 383 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 384 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 385 | github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 386 | github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= 387 | github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 388 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 389 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 390 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 391 | github.com/kyoh86/richgo v0.3.3/go.mod h1:S65jllVRxBm59fqIXfCa3cPxQYRT9u9v45EPQVeuoH0= 392 | github.com/kyoh86/xdg v0.0.0-20171007020617-d28e4c5d7b81/go.mod h1:Z5mDqe0fxyxn3W2yTxsBAOQqIrXADQIh02wrTnaRM38= 393 | github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 394 | github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 395 | github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 396 | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 397 | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 398 | github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= 399 | github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= 400 | github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 401 | github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= 402 | github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 403 | github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= 404 | github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= 405 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 406 | github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 407 | github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= 408 | github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= 409 | github.com/mattn/go-isatty v0.0.0-20170925054904-a5cdd64afdee/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 410 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 411 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 412 | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= 413 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 414 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 415 | github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= 416 | github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= 417 | github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= 418 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 419 | github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 420 | github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 421 | github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 422 | github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 423 | github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= 424 | github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 425 | github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= 426 | github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= 427 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 428 | github.com/myitcv/gobin v0.0.14/go.mod h1:GvHEiYCWroKI2KrMT+xQkHC3FC551wigVWeR4Sgg5P4= 429 | github.com/netlify/open-api/v2 v2.5.2 h1:e+TClhqyM56ho85VNnngKUq+R8K/R2EjYHnDIGYQxOU= 430 | github.com/netlify/open-api/v2 v2.5.2/go.mod h1:NbccOGa/b1S22KG8yBKhkuUfhrlQC31nCWzUApIbjiQ= 431 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 432 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 433 | github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= 434 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 435 | github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= 436 | github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 437 | github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= 438 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 439 | github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= 440 | github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= 441 | github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= 442 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 443 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 444 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 445 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 446 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 447 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 448 | github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= 449 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 450 | github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= 451 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 452 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 453 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 454 | github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 455 | github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 456 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 457 | github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 458 | github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= 459 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 460 | github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 461 | github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 462 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 463 | github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= 464 | github.com/rsc/goversion v1.2.0 h1:zVF4y5ciA/rw779S62bEAq4Yif1cBc/UwRkXJ2xZyT4= 465 | github.com/rsc/goversion v1.2.0/go.mod h1:Tf/O0TQyfRvp7NelXAyfXYRKUO+LX3KNgXc8ALRUv4k= 466 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 467 | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 468 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 469 | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 470 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 471 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 472 | github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 473 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= 474 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 475 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 476 | github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= 477 | github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 478 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 479 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 480 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 481 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 482 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 483 | github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 484 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 485 | github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 486 | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 487 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 488 | github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= 489 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 490 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 491 | github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= 492 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 493 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 494 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 495 | github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 496 | github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 497 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 498 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 499 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 500 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 501 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 502 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 503 | github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= 504 | github.com/tidwall/gjson v1.11.0 h1:C16pk7tQNiH6VlCrtIXL1w8GaOsi1X3W8KDkE1BuYd4= 505 | github.com/tidwall/gjson v1.11.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= 506 | github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= 507 | github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= 508 | github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= 509 | github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= 510 | github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= 511 | github.com/tink-ab/tempfile v0.0.0-20180226111222-33beb0518f1a h1:Qhm/9UKGO1+AjEKIsq8G72uCq4SrYxSxS5wiD0F3IC4= 512 | github.com/tink-ab/tempfile v0.0.0-20180226111222-33beb0518f1a/go.mod h1:Wt5qSdcHgX6XkqZKAZTxnN+93jnqtx0jEgTQakpZ1CE= 513 | github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 514 | github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= 515 | github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= 516 | github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= 517 | github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= 518 | github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= 519 | github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= 520 | github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= 521 | github.com/wacul/ptr v0.0.0-20170209030335-91632201dfc8/go.mod h1:BD0gjsZrCwtoR+yWDB9v2hQ8STlq9tT84qKfa+3txOc= 522 | github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= 523 | github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= 524 | github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= 525 | github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= 526 | github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= 527 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 528 | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 529 | github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= 530 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 531 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 532 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 533 | go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 534 | go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= 535 | go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= 536 | go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= 537 | go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= 538 | go.mongodb.org/mongo-driver v1.3.1/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= 539 | go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= 540 | go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= 541 | go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= 542 | go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= 543 | go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= 544 | go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= 545 | go.mongodb.org/mongo-driver v1.7.4 h1:sllcioag8Mec0LYkftYWq+cKNPIR4Kqq3iv9ZXY0g/E= 546 | go.mongodb.org/mongo-driver v1.7.4/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= 547 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 548 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 549 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 550 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 551 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 552 | go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 553 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 554 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 555 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 556 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 557 | golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 558 | golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= 559 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 560 | golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 561 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 562 | golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 563 | golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 564 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 565 | golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 566 | golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 567 | golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 568 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 569 | golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 570 | golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 571 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= 572 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 573 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 574 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 575 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 576 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 577 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 578 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 579 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 580 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 581 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 582 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 583 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 584 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 585 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 586 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 587 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 588 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 589 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 590 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 591 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 592 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 593 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 594 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 595 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 596 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 597 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 598 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 599 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 600 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 601 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 602 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 603 | golang.org/x/net v0.0.0-20180404174746-b3c676e531a6/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 604 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 605 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 606 | golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 607 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 608 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 609 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 610 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 611 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 612 | golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 613 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 614 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 615 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 616 | golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 617 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 618 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 619 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 620 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 621 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 622 | golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 623 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 624 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 625 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 626 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 627 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 628 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 629 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 630 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 631 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 632 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 633 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 634 | golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 635 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 636 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 637 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 638 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 639 | golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 640 | golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 641 | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 642 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 643 | golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= 644 | golang.org/x/net v0.0.0-20211104170005-ce137452f963 h1:8gJUadZl+kWvZBqG/LautX0X6qe5qTC2VI/3V3NBRAY= 645 | golang.org/x/net v0.0.0-20211104170005-ce137452f963/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 646 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 647 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 648 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 649 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 650 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 651 | golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= 652 | golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 653 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 654 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 655 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 656 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 657 | golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 658 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 659 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 660 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 661 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 662 | golang.org/x/sys v0.0.0-20170927054621-314a259e304f/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 663 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 664 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 665 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 666 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 667 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 668 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 669 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 670 | golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 671 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 672 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 673 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 674 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 675 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 676 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 677 | golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 678 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 679 | golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 680 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 681 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 682 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 683 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 684 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 685 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 686 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 687 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 688 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 689 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 690 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 691 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 692 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 693 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 694 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 695 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 696 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 697 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 698 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 699 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 700 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 701 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 702 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 703 | golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 704 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 705 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 706 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 707 | golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 708 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 709 | golang.org/x/sys v0.0.0-20211103235746-7861aae1554b h1:1VkfZQv42XQlA/jchYumAnv1UPo6RgF9rJFkTgZIxO4= 710 | golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 711 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 712 | golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= 713 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= 714 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 715 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 716 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 717 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 718 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 719 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 720 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 721 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 722 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 723 | golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 724 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 725 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 726 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 727 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 728 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 729 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 730 | golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 731 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 732 | golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 733 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 734 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 735 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 736 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 737 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 738 | golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 739 | golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 740 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 741 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 742 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 743 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 744 | golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 745 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 746 | golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 747 | golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 748 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 749 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 750 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 751 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 752 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 753 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 754 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 755 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 756 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 757 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 758 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 759 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 760 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 761 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 762 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 763 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 764 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 765 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 766 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 767 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 768 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 769 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 770 | golang.org/x/tools v0.0.0-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 771 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 772 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 773 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 774 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 775 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 776 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 777 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 778 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 779 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 780 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 781 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 782 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 783 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 784 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 785 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 786 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 787 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 788 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 789 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 790 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 791 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 792 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 793 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 794 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 795 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 796 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 797 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 798 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= 799 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= 800 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 801 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 802 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 803 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 804 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 805 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 806 | google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= 807 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 808 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 809 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 810 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 811 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 812 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 813 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 814 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 815 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 816 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 817 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 818 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 819 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 820 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 821 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 822 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 823 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 824 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 825 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 826 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 827 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 828 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 829 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 830 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 831 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= 832 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 833 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 834 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 835 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 836 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 837 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 838 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 839 | google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 840 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 841 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 842 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 843 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 844 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 845 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 846 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= 847 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 848 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 849 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 850 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 851 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 852 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 853 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 854 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 855 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 856 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 857 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 858 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 859 | google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= 860 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 861 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 862 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 863 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 864 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= 865 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 866 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 867 | gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 868 | gopkg.in/ini.v1 v1.54.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 869 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 870 | gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 871 | gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= 872 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 873 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 874 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 875 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 876 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 877 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 878 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 879 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 880 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 881 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 882 | gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 883 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 884 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 885 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 886 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 887 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 888 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 889 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 890 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 891 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 892 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 893 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 894 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 895 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 896 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "io/ioutil" 7 | "path/filepath" 8 | "strings" 9 | 10 | "log" 11 | "os" 12 | 13 | "github.com/evanw/esbuild/pkg/api" 14 | "github.com/fatih/color" 15 | ) 16 | 17 | type PackageJSON struct { 18 | Name string `json:"name"` 19 | Dependencies map[string]string `json:"dependencies"` 20 | DevDependencies map[string]string `json:"devDependencies"` 21 | } 22 | 23 | var depcheckPlugin = api.Plugin{ 24 | Name: "Depcheck Plugin", 25 | Setup: func(build api.PluginBuild) { 26 | 27 | // Everything 28 | build.OnResolve(api.OnResolveOptions{Filter: `\.`}, 29 | func(args api.OnResolveArgs) (api.OnResolveResult, error) { 30 | 31 | if strings.Contains(args.Importer, "node_module") { 32 | 33 | return api.OnResolveResult{ 34 | Path: args.Path, 35 | External: true, 36 | }, nil 37 | } 38 | 39 | ext := filepath.Ext(args.Path) 40 | 41 | if strings.Contains(ext, "ts") || strings.Contains(ext, "js") || ext == "" { 42 | 43 | // if strings.Contains(args.Importer, "node_modules") { 44 | // // Ignore node modules 45 | // return api.OnResolveResult{ 46 | // Path: args.Path, 47 | // External: true, 48 | // }, nil 49 | // } 50 | 51 | // fmt.Println("isTsJsLike") 52 | return api.OnResolveResult{}, nil 53 | 54 | } 55 | 56 | return api.OnResolveResult{ 57 | Path: args.Path, 58 | External: true, 59 | }, nil 60 | }) 61 | 62 | build.OnResolve(api.OnResolveOptions{Filter: `[t|j]sx?$`}, 63 | func(args api.OnResolveArgs) (api.OnResolveResult, error) { 64 | 65 | fileLog("Resolved", args, args.Kind) 66 | 67 | if args.Kind == api.ResolveJSImportStatement { 68 | // import statement 69 | path := args.Path 70 | fileLog("Import statement", args) 71 | 72 | importer := args.Importer 73 | lastNM := strings.LastIndex(importer, "node_module") 74 | 75 | if lastNM == -1 { 76 | // color.New(color.FgYellow).Println("[WARN] Error finding node_module in require call, skipping", importer) 77 | return api.OnResolveResult{}, nil 78 | } 79 | 80 | str := importer[lastNM:] 81 | 82 | splitBySlash := strings.Split(str, "/") 83 | // fmt.Println(importer, lastNM, str, splitBySlash) 84 | moduleName := splitBySlash[1] 85 | 86 | if strings.Contains(moduleName, "@") { 87 | // using a @x/y package 88 | // Example @babel/core 89 | moduleName += "/" + splitBySlash[2] 90 | } 91 | 92 | fileLog("Import statement", path, moduleName, args.Kind) 93 | checkModule(path) 94 | 95 | checkModule(moduleName) 96 | 97 | return api.OnResolveResult{ 98 | Path: args.Path, 99 | External: true, 100 | }, nil 101 | } 102 | 103 | if args.Kind == api.ResolveJSRequireCall { 104 | // require call 105 | 106 | importer := args.Importer 107 | lastNM := strings.LastIndex(importer, "node_module") 108 | fileLog("Require call", args) 109 | 110 | if lastNM == -1 { 111 | // color.New(color.FgYellow).Println("[WARN] Error finding node_module in require call, skipping", importer) 112 | return api.OnResolveResult{}, nil 113 | } 114 | 115 | str := importer[lastNM:] 116 | 117 | splitBySlash := strings.Split(str, "/") 118 | // fmt.Println(importer, lastNM, str, splitBySlash) 119 | moduleName := splitBySlash[1] 120 | 121 | if strings.Contains(moduleName, "@") { 122 | // using a @x/y package 123 | // Example @babel/core 124 | moduleName += "/" + splitBySlash[2] 125 | } 126 | 127 | fileLog("Require call", moduleName) 128 | 129 | checkModule(moduleName) 130 | 131 | return api.OnResolveResult{ 132 | Path: args.Path, 133 | External: true, 134 | }, nil 135 | 136 | } 137 | 138 | // return api.OnResolveResult{ 139 | // Path: filepath.Join(args.ResolveDir, "public", args.Path), 140 | // }, nil 141 | 142 | return api.OnResolveResult{}, nil 143 | 144 | }) 145 | 146 | build.OnLoad(api.OnLoadOptions{Filter: `\.`}, 147 | func(args api.OnLoadArgs) (api.OnLoadResult, error) { 148 | path := args.Path 149 | 150 | ext := filepath.Ext(path) 151 | 152 | if ext != "" { 153 | // has file extension 154 | if strings.Contains(ext, "ts") || strings.Contains(ext, "js") { 155 | return api.OnLoadResult{}, nil 156 | } 157 | // default to file loader for all other file types 158 | return api.OnLoadResult{Loader: api.LoaderFile}, nil 159 | } 160 | return api.OnLoadResult{}, nil 161 | }) 162 | }, 163 | } 164 | 165 | func getPackageJsonPaths(path string) []string { 166 | files, err := Glob(path + "**/package.json") 167 | 168 | if err != nil { 169 | fmt.Println("Error Reading file paths from glob", err) 170 | } 171 | // fmt.Println("Package json files are", files) 172 | return files 173 | } 174 | 175 | func getFiles(path string) []string { 176 | var files []string 177 | 178 | tsFiles, err := Glob(path + "**/*.ts*") 179 | 180 | for _, file := range tsFiles { 181 | 182 | ext := filepath.Ext(file) 183 | 184 | // The ext check prevents .ts.snap or ts.anything files\ 185 | // By default we will check .test.ts files 186 | // TODO Add a flag for ignored directories later 187 | if !strings.Contains(file, ".d.ts") && (ext == ".ts" || ext == ".tsx") { 188 | files = append(files, file) 189 | } 190 | } 191 | 192 | if err != nil { 193 | fmt.Println("Error Reading file paths from glob", err) 194 | } 195 | 196 | if globalConfig.JS { 197 | 198 | jsFiles, err := Glob(path + "**/*.js") 199 | 200 | if err != nil { 201 | fmt.Println("Error Reading file paths from glob", err) 202 | } 203 | files = append(files, jsFiles...) 204 | 205 | // js* === json and hence we need to have a separate case for *.jsx 206 | jsxFiles, err := Glob(path + "**/*.jsx") 207 | 208 | if err != nil { 209 | fmt.Println("Error Reading file paths from glob", err) 210 | } 211 | files = append(files, jsxFiles...) 212 | 213 | } 214 | 215 | // fmt.Println("Source Files are", files) 216 | return files 217 | } 218 | 219 | func readJson(path string) PackageJSON { 220 | 221 | plan, _ := ioutil.ReadFile(path) 222 | 223 | packageJson := PackageJSON{} 224 | err := json.Unmarshal(plan, &packageJson) 225 | 226 | if err != nil { 227 | fmt.Println("Error reading file", err) 228 | os.Exit(1) 229 | } 230 | return packageJson 231 | } 232 | 233 | var deps = make(map[string]bool) 234 | var depsName = make(map[string][]string) 235 | var versions = make(map[string][]string) 236 | 237 | func setDeps(paths []string) { 238 | for _, path := range paths { 239 | packageJson := readJson(path) 240 | 241 | for key, version := range packageJson.Dependencies { 242 | deps[key] = false 243 | 244 | if _, ok := depsName[key]; ok { 245 | depsName[key] = append(depsName[key], packageJson.Name) 246 | } else { 247 | depsName[key] = []string{packageJson.Name} 248 | } 249 | 250 | if _, ok := versions[key]; ok { 251 | versions[key] = append(versions[key], version) 252 | } else { 253 | versions[key] = []string{version} 254 | } 255 | 256 | } 257 | 258 | for key, version := range packageJson.DevDependencies { 259 | 260 | if globalConfig.DevDependencies { 261 | deps[key] = false 262 | } else { 263 | if checkTypePackage(key) { 264 | deps[key] = false 265 | } 266 | } 267 | if _, ok := versions[key]; ok { 268 | versions[key] = append(versions[key], version) 269 | } else { 270 | versions[key] = []string{version} 271 | } 272 | 273 | if _, ok := depsName[key]; ok { 274 | depsName[key] = append(depsName[key], packageJson.Name) 275 | } else { 276 | depsName[key] = []string{packageJson.Name} 277 | } 278 | } 279 | 280 | } 281 | } 282 | 283 | var overwriteSource string 284 | 285 | func depcheck() { 286 | createDirectory() 287 | 288 | if esbuildWrite { 289 | color.New(color.FgRed).Println("Do not use this as a bundler of files, it will likely not work") 290 | fmt.Println("This write mode is really only for debugging purposes") 291 | } 292 | 293 | go writeLogsToFile() 294 | go handleModule() 295 | go generateReport() 296 | 297 | rootPath, err := os.Getwd() 298 | if err != nil { 299 | fmt.Println(err) 300 | } 301 | 302 | if globalConfig.Path != "" { 303 | rootPath = globalConfig.Path 304 | } 305 | 306 | fmt.Println("Root path:", rootPath) 307 | 308 | packageJsonPaths := getPackageJsonPaths(rootPath) 309 | 310 | sourcePaths := getFiles(rootPath) 311 | 312 | if overwriteSource != "" { 313 | sourcePaths = []string{overwriteSource} 314 | fmt.Println("Overwritten source", sourcePaths) 315 | } 316 | 317 | for _, path := range sourcePaths { 318 | fileLog("Source Path", path) 319 | } 320 | 321 | setDeps(packageJsonPaths) 322 | 323 | platform := api.PlatformNode 324 | 325 | if globalConfig.BrowserPlatform { 326 | platform = api.PlatformBrowser 327 | } 328 | 329 | result := api.Build(api.BuildOptions{ 330 | EntryPoints: sourcePaths, 331 | // EntryPoints: []string{"test/monorepo/packages/package-b/src/App.tsx"}, 332 | Target: api.ESNext, 333 | Bundle: true, 334 | Write: esbuildWrite, 335 | Format: api.FormatESModule, 336 | Outdir: DEPCHECK_DIR + "/dist", 337 | Plugins: []api.Plugin{depcheckPlugin}, 338 | External: globalConfig.Externals, 339 | Metafile: true, 340 | Platform: platform, 341 | Loader: map[string]api.Loader{ 342 | ".js": api.LoaderJSX, 343 | }, 344 | }) 345 | 346 | if len(result.Errors) > 0 { 347 | 348 | for _, err := range result.Errors { 349 | fmt.Println("Error", err.Text, err.Location.File, err.Location.Line) 350 | fileLog("Error", err.Text, err.Location.File, err.Location.Line, err) 351 | } 352 | 353 | os.Exit(1) 354 | } 355 | checkMetaFile(result.Metafile, rootPath, sourcePaths) 356 | 357 | moduleWg.Wait() 358 | 359 | reportLog("## Report for - ", rootPath) 360 | 361 | computeResults() 362 | 363 | // reportWg.Add(1) // Extra wg to allow file to finish writing 364 | reportWg.Wait() 365 | close(reportLines) 366 | 367 | loggerWg.Wait() 368 | close(logs) 369 | 370 | fileOps.Wait() 371 | 372 | openHtml() 373 | 374 | deployUrl := "" 375 | 376 | if netlifyToken != "" { 377 | deployUrl = deployToNetlify() 378 | fmt.Print("Deployed URL: ") 379 | color.New(color.FgGreen).Println(deployUrl) 380 | } 381 | 382 | if ciMode { 383 | makePrComment(deployUrl) 384 | } 385 | 386 | // Auto deletes the folder by default 387 | // The folder is used to create the html report everytime 388 | if !globalConfig.Log && !globalConfig.Report && !esbuildWrite && !hasConfig && !saveConfig { 389 | 390 | removeDirectory(true) 391 | } 392 | 393 | if saveConfig { 394 | writeConfig(globalConfig) 395 | } 396 | 397 | close(modules) 398 | } 399 | 400 | func main() { 401 | netlifyPat := os.Getenv("NETLIFY_TOKEN") 402 | if netlifyToken == "" { 403 | netlifyToken = netlifyPat 404 | } 405 | 406 | githubPat := os.Getenv("GITHUB_TOKEN") 407 | 408 | githubToken = githubPat 409 | 410 | app := createCliApp() 411 | 412 | err := app.Run(os.Args) 413 | if err != nil { 414 | log.Fatal(err) 415 | } 416 | 417 | } 418 | -------------------------------------------------------------------------------- /modules.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "sync" 5 | ) 6 | 7 | var modules = make(chan string, 100) 8 | 9 | var moduleWg sync.WaitGroup 10 | 11 | var count int32 12 | 13 | func checkModule(name string) { 14 | moduleWg.Add(1) 15 | count += 1 16 | // fmt.Println("Added", name, "to check queue") 17 | modules <- name 18 | } 19 | 20 | func handleModule() { 21 | for name := range modules { 22 | if _, ok := deps[name]; ok { 23 | deps[name] = true 24 | } 25 | moduleWg.Done() 26 | count -= 1 27 | // fmt.Println("Removed", name, "from check queue. There are ", count, "items remaining") 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "depp-installer", 3 | "version": "0.0.11", 4 | "description": " A fast unused and duplicate dependency checker ", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/CryogenicPlanet/depp.git" 8 | }, 9 | "keywords": [ 10 | "unused", 11 | "dependency", 12 | "checker", 13 | "duplicate" 14 | ], 15 | "author": "Rahul Tarak", 16 | "license": "MIT", 17 | "bugs": { 18 | "url": "https://github.com/CryogenicPlanet/depp/issues" 19 | }, 20 | "homepage": "https://github.com/CryogenicPlanet/depp#readme", 21 | "scripts": { 22 | "postinstall": "node dist/postinstall.js install", 23 | "preuninstall": "node dist/postinstall.js uninstall", 24 | "build": "esbuild scripts/postinstall.ts --outdir=dist/ --platform=node --format=cjs", 25 | "prepare": "pnpm build" 26 | }, 27 | "goBinary": { 28 | "name": "depp", 29 | "path": "./bin" 30 | }, 31 | "files": [ 32 | "dist/postinstall.js" 33 | ], 34 | "main": "scripts/postinstall.js", 35 | "dependencies": { 36 | "axios": "^0.24.0", 37 | "decompress": "^4.2.1", 38 | "mkdirp": "^1.0.4" 39 | }, 40 | "devDependencies": { 41 | "@types/decompress": "^4.2.4", 42 | "@types/mkdirp": "^1.0.2", 43 | "esbuild": "^0.13.12" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@types/decompress': ^4.2.4 5 | '@types/mkdirp': ^1.0.2 6 | axios: ^0.24.0 7 | decompress: ^4.2.1 8 | esbuild: ^0.13.12 9 | mkdirp: ^1.0.4 10 | 11 | dependencies: 12 | axios: 0.24.0 13 | decompress: 4.2.1 14 | mkdirp: 1.0.4 15 | 16 | devDependencies: 17 | '@types/decompress': 4.2.4 18 | '@types/mkdirp': 1.0.2 19 | esbuild: 0.13.12 20 | 21 | packages: 22 | 23 | /@types/decompress/4.2.4: 24 | resolution: {integrity: sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA==} 25 | dependencies: 26 | '@types/node': 16.11.6 27 | dev: true 28 | 29 | /@types/mkdirp/1.0.2: 30 | resolution: {integrity: sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==} 31 | dependencies: 32 | '@types/node': 16.11.6 33 | dev: true 34 | 35 | /@types/node/16.11.6: 36 | resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==} 37 | dev: true 38 | 39 | /axios/0.24.0: 40 | resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} 41 | dependencies: 42 | follow-redirects: 1.14.5 43 | transitivePeerDependencies: 44 | - debug 45 | dev: false 46 | 47 | /base64-js/1.5.1: 48 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 49 | dev: false 50 | 51 | /bl/1.2.3: 52 | resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} 53 | dependencies: 54 | readable-stream: 2.3.7 55 | safe-buffer: 5.2.1 56 | dev: false 57 | 58 | /buffer-alloc-unsafe/1.1.0: 59 | resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} 60 | dev: false 61 | 62 | /buffer-alloc/1.2.0: 63 | resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} 64 | dependencies: 65 | buffer-alloc-unsafe: 1.1.0 66 | buffer-fill: 1.0.0 67 | dev: false 68 | 69 | /buffer-crc32/0.2.13: 70 | resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} 71 | dev: false 72 | 73 | /buffer-fill/1.0.0: 74 | resolution: {integrity: sha1-+PeLdniYiO858gXNY39o5wISKyw=} 75 | dev: false 76 | 77 | /buffer/5.7.1: 78 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 79 | dependencies: 80 | base64-js: 1.5.1 81 | ieee754: 1.2.1 82 | dev: false 83 | 84 | /commander/2.20.3: 85 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 86 | dev: false 87 | 88 | /core-util-is/1.0.3: 89 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 90 | dev: false 91 | 92 | /decompress-tar/4.1.1: 93 | resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} 94 | engines: {node: '>=4'} 95 | dependencies: 96 | file-type: 5.2.0 97 | is-stream: 1.1.0 98 | tar-stream: 1.6.2 99 | dev: false 100 | 101 | /decompress-tarbz2/4.1.1: 102 | resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} 103 | engines: {node: '>=4'} 104 | dependencies: 105 | decompress-tar: 4.1.1 106 | file-type: 6.2.0 107 | is-stream: 1.1.0 108 | seek-bzip: 1.0.6 109 | unbzip2-stream: 1.4.3 110 | dev: false 111 | 112 | /decompress-targz/4.1.1: 113 | resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} 114 | engines: {node: '>=4'} 115 | dependencies: 116 | decompress-tar: 4.1.1 117 | file-type: 5.2.0 118 | is-stream: 1.1.0 119 | dev: false 120 | 121 | /decompress-unzip/4.0.1: 122 | resolution: {integrity: sha1-3qrM39FK6vhVePczroIQ+bSEj2k=} 123 | engines: {node: '>=4'} 124 | dependencies: 125 | file-type: 3.9.0 126 | get-stream: 2.3.1 127 | pify: 2.3.0 128 | yauzl: 2.10.0 129 | dev: false 130 | 131 | /decompress/4.2.1: 132 | resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} 133 | engines: {node: '>=4'} 134 | dependencies: 135 | decompress-tar: 4.1.1 136 | decompress-tarbz2: 4.1.1 137 | decompress-targz: 4.1.1 138 | decompress-unzip: 4.0.1 139 | graceful-fs: 4.2.8 140 | make-dir: 1.3.0 141 | pify: 2.3.0 142 | strip-dirs: 2.1.0 143 | dev: false 144 | 145 | /end-of-stream/1.4.4: 146 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 147 | dependencies: 148 | once: 1.4.0 149 | dev: false 150 | 151 | /esbuild-android-arm64/0.13.12: 152 | resolution: {integrity: sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==} 153 | cpu: [arm64] 154 | os: [android] 155 | dev: true 156 | optional: true 157 | 158 | /esbuild-darwin-64/0.13.12: 159 | resolution: {integrity: sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==} 160 | cpu: [x64] 161 | os: [darwin] 162 | dev: true 163 | optional: true 164 | 165 | /esbuild-darwin-arm64/0.13.12: 166 | resolution: {integrity: sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==} 167 | cpu: [arm64] 168 | os: [darwin] 169 | dev: true 170 | optional: true 171 | 172 | /esbuild-freebsd-64/0.13.12: 173 | resolution: {integrity: sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==} 174 | cpu: [x64] 175 | os: [freebsd] 176 | dev: true 177 | optional: true 178 | 179 | /esbuild-freebsd-arm64/0.13.12: 180 | resolution: {integrity: sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==} 181 | cpu: [arm64] 182 | os: [freebsd] 183 | dev: true 184 | optional: true 185 | 186 | /esbuild-linux-32/0.13.12: 187 | resolution: {integrity: sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==} 188 | cpu: [ia32] 189 | os: [linux] 190 | dev: true 191 | optional: true 192 | 193 | /esbuild-linux-64/0.13.12: 194 | resolution: {integrity: sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==} 195 | cpu: [x64] 196 | os: [linux] 197 | dev: true 198 | optional: true 199 | 200 | /esbuild-linux-arm/0.13.12: 201 | resolution: {integrity: sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==} 202 | cpu: [arm] 203 | os: [linux] 204 | dev: true 205 | optional: true 206 | 207 | /esbuild-linux-arm64/0.13.12: 208 | resolution: {integrity: sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==} 209 | cpu: [arm64] 210 | os: [linux] 211 | dev: true 212 | optional: true 213 | 214 | /esbuild-linux-mips64le/0.13.12: 215 | resolution: {integrity: sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==} 216 | cpu: [mips64el] 217 | os: [linux] 218 | dev: true 219 | optional: true 220 | 221 | /esbuild-linux-ppc64le/0.13.12: 222 | resolution: {integrity: sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==} 223 | cpu: [ppc64] 224 | os: [linux] 225 | dev: true 226 | optional: true 227 | 228 | /esbuild-netbsd-64/0.13.12: 229 | resolution: {integrity: sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==} 230 | cpu: [x64] 231 | os: [netbsd] 232 | dev: true 233 | optional: true 234 | 235 | /esbuild-openbsd-64/0.13.12: 236 | resolution: {integrity: sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==} 237 | cpu: [x64] 238 | os: [openbsd] 239 | dev: true 240 | optional: true 241 | 242 | /esbuild-sunos-64/0.13.12: 243 | resolution: {integrity: sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==} 244 | cpu: [x64] 245 | os: [sunos] 246 | dev: true 247 | optional: true 248 | 249 | /esbuild-windows-32/0.13.12: 250 | resolution: {integrity: sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==} 251 | cpu: [ia32] 252 | os: [win32] 253 | dev: true 254 | optional: true 255 | 256 | /esbuild-windows-64/0.13.12: 257 | resolution: {integrity: sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==} 258 | cpu: [x64] 259 | os: [win32] 260 | dev: true 261 | optional: true 262 | 263 | /esbuild-windows-arm64/0.13.12: 264 | resolution: {integrity: sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==} 265 | cpu: [arm64] 266 | os: [win32] 267 | dev: true 268 | optional: true 269 | 270 | /esbuild/0.13.12: 271 | resolution: {integrity: sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow==} 272 | hasBin: true 273 | requiresBuild: true 274 | optionalDependencies: 275 | esbuild-android-arm64: 0.13.12 276 | esbuild-darwin-64: 0.13.12 277 | esbuild-darwin-arm64: 0.13.12 278 | esbuild-freebsd-64: 0.13.12 279 | esbuild-freebsd-arm64: 0.13.12 280 | esbuild-linux-32: 0.13.12 281 | esbuild-linux-64: 0.13.12 282 | esbuild-linux-arm: 0.13.12 283 | esbuild-linux-arm64: 0.13.12 284 | esbuild-linux-mips64le: 0.13.12 285 | esbuild-linux-ppc64le: 0.13.12 286 | esbuild-netbsd-64: 0.13.12 287 | esbuild-openbsd-64: 0.13.12 288 | esbuild-sunos-64: 0.13.12 289 | esbuild-windows-32: 0.13.12 290 | esbuild-windows-64: 0.13.12 291 | esbuild-windows-arm64: 0.13.12 292 | dev: true 293 | 294 | /fd-slicer/1.1.0: 295 | resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} 296 | dependencies: 297 | pend: 1.2.0 298 | dev: false 299 | 300 | /file-type/3.9.0: 301 | resolution: {integrity: sha1-JXoHg4TR24CHvESdEH1SpSZyuek=} 302 | engines: {node: '>=0.10.0'} 303 | dev: false 304 | 305 | /file-type/5.2.0: 306 | resolution: {integrity: sha1-LdvqfHP/42No365J3DOMBYwritY=} 307 | engines: {node: '>=4'} 308 | dev: false 309 | 310 | /file-type/6.2.0: 311 | resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} 312 | engines: {node: '>=4'} 313 | dev: false 314 | 315 | /follow-redirects/1.14.5: 316 | resolution: {integrity: sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==} 317 | engines: {node: '>=4.0'} 318 | peerDependencies: 319 | debug: '*' 320 | peerDependenciesMeta: 321 | debug: 322 | optional: true 323 | dev: false 324 | 325 | /fs-constants/1.0.0: 326 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 327 | dev: false 328 | 329 | /get-stream/2.3.1: 330 | resolution: {integrity: sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=} 331 | engines: {node: '>=0.10.0'} 332 | dependencies: 333 | object-assign: 4.1.1 334 | pinkie-promise: 2.0.1 335 | dev: false 336 | 337 | /graceful-fs/4.2.8: 338 | resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} 339 | dev: false 340 | 341 | /ieee754/1.2.1: 342 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 343 | dev: false 344 | 345 | /inherits/2.0.4: 346 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 347 | dev: false 348 | 349 | /is-natural-number/4.0.1: 350 | resolution: {integrity: sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=} 351 | dev: false 352 | 353 | /is-stream/1.1.0: 354 | resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} 355 | engines: {node: '>=0.10.0'} 356 | dev: false 357 | 358 | /isarray/1.0.0: 359 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 360 | dev: false 361 | 362 | /make-dir/1.3.0: 363 | resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} 364 | engines: {node: '>=4'} 365 | dependencies: 366 | pify: 3.0.0 367 | dev: false 368 | 369 | /mkdirp/1.0.4: 370 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 371 | engines: {node: '>=10'} 372 | hasBin: true 373 | dev: false 374 | 375 | /object-assign/4.1.1: 376 | resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} 377 | engines: {node: '>=0.10.0'} 378 | dev: false 379 | 380 | /once/1.4.0: 381 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 382 | dependencies: 383 | wrappy: 1.0.2 384 | dev: false 385 | 386 | /pend/1.2.0: 387 | resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} 388 | dev: false 389 | 390 | /pify/2.3.0: 391 | resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} 392 | engines: {node: '>=0.10.0'} 393 | dev: false 394 | 395 | /pify/3.0.0: 396 | resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} 397 | engines: {node: '>=4'} 398 | dev: false 399 | 400 | /pinkie-promise/2.0.1: 401 | resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} 402 | engines: {node: '>=0.10.0'} 403 | dependencies: 404 | pinkie: 2.0.4 405 | dev: false 406 | 407 | /pinkie/2.0.4: 408 | resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} 409 | engines: {node: '>=0.10.0'} 410 | dev: false 411 | 412 | /process-nextick-args/2.0.1: 413 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 414 | dev: false 415 | 416 | /readable-stream/2.3.7: 417 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 418 | dependencies: 419 | core-util-is: 1.0.3 420 | inherits: 2.0.4 421 | isarray: 1.0.0 422 | process-nextick-args: 2.0.1 423 | safe-buffer: 5.1.2 424 | string_decoder: 1.1.1 425 | util-deprecate: 1.0.2 426 | dev: false 427 | 428 | /safe-buffer/5.1.2: 429 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 430 | dev: false 431 | 432 | /safe-buffer/5.2.1: 433 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 434 | dev: false 435 | 436 | /seek-bzip/1.0.6: 437 | resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} 438 | hasBin: true 439 | dependencies: 440 | commander: 2.20.3 441 | dev: false 442 | 443 | /string_decoder/1.1.1: 444 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 445 | dependencies: 446 | safe-buffer: 5.1.2 447 | dev: false 448 | 449 | /strip-dirs/2.1.0: 450 | resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} 451 | dependencies: 452 | is-natural-number: 4.0.1 453 | dev: false 454 | 455 | /tar-stream/1.6.2: 456 | resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} 457 | engines: {node: '>= 0.8.0'} 458 | dependencies: 459 | bl: 1.2.3 460 | buffer-alloc: 1.2.0 461 | end-of-stream: 1.4.4 462 | fs-constants: 1.0.0 463 | readable-stream: 2.3.7 464 | to-buffer: 1.1.1 465 | xtend: 4.0.2 466 | dev: false 467 | 468 | /through/2.3.8: 469 | resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} 470 | dev: false 471 | 472 | /to-buffer/1.1.1: 473 | resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} 474 | dev: false 475 | 476 | /unbzip2-stream/1.4.3: 477 | resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} 478 | dependencies: 479 | buffer: 5.7.1 480 | through: 2.3.8 481 | dev: false 482 | 483 | /util-deprecate/1.0.2: 484 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 485 | dev: false 486 | 487 | /wrappy/1.0.2: 488 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 489 | dev: false 490 | 491 | /xtend/4.0.2: 492 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 493 | engines: {node: '>=0.4'} 494 | dev: false 495 | 496 | /yauzl/2.10.0: 497 | resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} 498 | dependencies: 499 | buffer-crc32: 0.2.13 500 | fd-slicer: 1.1.0 501 | dev: false 502 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Depp - A fast unused and duplicate package checker [![Go Reference](https://pkg.go.dev/badge/github.com/CryogenicPlanet/depp.svg)](https://pkg.go.dev/github.com/CryogenicPlanet/depp) 2 | 3 | ![](https://user-images.githubusercontent.com/10355479/139758905-7f911615-84d0-46c6-805a-06f8eafaf633.png) 4 | 5 | ## Installation 6 | 7 | ```bash 8 | ## NPM 9 | npm install -g depp-installer 10 | # (will try to get npm install -g depp later) 11 | 12 | ## Go 13 | go install github.com/cryogenicplanet/depp@latest 14 | 15 | ``` 16 | 17 | ## Usage 18 | 19 | Just run `depp` in your project folder and it will do the rest. Keep in mind it will likely fail without setting some externals 20 | 21 | **Note if you want it to work with JS** please use `-j` or `--js` by default it will do only `.ts|.tsx` files 22 | 23 | All options 24 | ```bash 25 | ➜ depp --help 26 | NAME: 27 | depp - Find un used packages fast 28 | 29 | USAGE: 30 | depp [global options] command [command options] [arguments...] 31 | 32 | COMMANDS: 33 | clean Cleans all output files 34 | show Shows previous report 35 | deploy, d Automatically deploy your report to netlify 36 | config A command to handle config 37 | init Initialize project 38 | help, h Shows a list of commands or help for one command 39 | 40 | GLOBAL OPTIONS: 41 | --dev, -d Enable dev dependencies (default: false) 42 | --js, -j Enable js source files (default: false) 43 | --path value, -p value Overwrite root directory 44 | --log, -l Will write logs to .depcheck.log (default: false) 45 | --source value, -s value Overwrite default sources 46 | --report, -r Generate report file (default: false) 47 | --show-versions, -v Show conflicting versions (default: false) 48 | --write-output-files, -w This will write the esbuild output files. (default: false) 49 | --externals value, -e value Pass custom externals using this flag 50 | --ignore-namespaces value, --in value Pass namespace (@monorepo) to be ignored 51 | --no-open, --no Flag to prevent auto opening report in browser (default: false) 52 | --save-config, --sc Flag to automatically save config from other flags (default: false) 53 | --ci Run in github actions ci mode (default: false) 54 | --deploy value Will automatically deploy report to netlify 55 | --help, -h show help (default: false) 56 | ``` 57 | 58 | ## Example Advanced usage 59 | 60 | This is an example of advanced usage of the script with `externals` and `ignore-namespace` 61 | 62 | ``` 63 | depp -v -j -e mobx -e magic-sdk -e domain -e @daybrush/utils -e yjs -e constants -e ws -e perf_hooks -in @editor -in @server --report 64 | ``` 65 | 66 | 67 | ## Configuration 68 | 69 | You can save your `depp` config and not have to run it with flags every time, the config is saved in `.depp/config.json` but can be created from the cli 70 | 71 | ```bash 72 | # Initialize config 73 | depp init 74 | 75 | ➜ depp --help 76 | NAME: 77 | depp - Find un used packages fast 78 | 79 | USAGE: 80 | depp [global options] command [command options] [arguments...] 81 | 82 | COMMANDS: 83 | clean Cleans all output files 84 | show Shows previous report 85 | deploy, d Automatically deploy your report to netlify 86 | config A command to handle config 87 | init Initialize project 88 | help, h Shows a list of commands or help for one command 89 | 90 | GLOBAL OPTIONS: 91 | --dev, -d Enable dev dependencies (default: false) 92 | --js, -j Enable js source files (default: false) 93 | --path value, -p value Overwrite root directory 94 | --log, -l Will write logs to .depcheck.log (default: false) 95 | --source value, -s value Overwrite default sources 96 | --report, -r Generate report file (default: false) 97 | --show-versions, -v Show conflicting versions (default: false) 98 | --write-output-files, -w This will write the esbuild output files. (default: false) 99 | --externals value, -e value Pass custom externals using this flag 100 | --ignore-namespaces value, --in value Pass namespace (@monorepo) to be ignored 101 | --no-open, --no Flag to prevent auto opening report in browser (default: false) 102 | --save-config, --sc Flag to automatically save config from other flags (default: false) 103 | --ci Run in github actions ci mode (default: false) 104 | --deploy value Will automatically deploy report to netlify 105 | --browser Will use esbuild browser platform (by default it uses node platform) (default: false) 106 | --ignore-path value, --ip value A glob pattern of files to be ignored 107 | ``` 108 | 109 | ## CI 110 | 111 | Currently only supports Github actions out of the box. 112 | 113 | In mode, `depp` will automatically comment on the PR with its report. It will look like [this](https://github.com/CryogenicPlanet/cryogenicplanet.github.io/issues/49#issuecomment-961496544) 114 | 115 | It can also deploy the report to [netlify](netlify.com) but requires a `NETLIFY_TOKEN` which you can get [here](https://app.netlify.com/user/applications#personal-access-tokens) 116 | 117 | ```yaml 118 | name: Dependency CI 119 | 120 | on: 121 | pull_request: 122 | 123 | 124 | jobs: 125 | release-go: 126 | runs-on: ubuntu-latest 127 | steps: 128 | - name: Checkout 129 | uses: actions/checkout@v2 130 | with: 131 | fetch-depth: 0 132 | - name: Set up Go 133 | uses: actions/setup-go@v2 134 | with: 135 | go-version: 1.17 136 | - name: Install Depp 137 | run: go install github.com/cryogenicplanet/depp@latest 138 | - name: Run Depp 139 | run: depp --ci 140 | env: 141 | # NETLIFY_TOKEN: ${{secrets.NETLIFY_TOKEN}} 142 | # Optional if you want report urls or not 143 | # You can get a netlify pat here https://app.netlify.com/user/applications#personal-access-tokens 144 | ``` 145 | 146 | ## Example Outputs 147 | 148 | 1. [Markdown](./static/markdownReport.md) 149 | 2. [Html](https://cryogenicplanet.github.io/depp/static/htmlReport.html) 150 | 151 | ## Why use this 152 | 153 | 1. It is using `esbuild` and `go` so it is quite a bit faster than most other tools 154 | 2. Most tools that I could find at least, didn't not support monorepos. This does and is built for monorepos 155 | 156 | ## Caveats 157 | 158 | This is not been extensively tested and might have some short comings, it may not identify every unused package but will definitely do a decent first pass 159 | 160 | 161 | ## Acknowledgement 162 | 163 | 164 | > Credits to [@zack_overflow](https://github.com/zackradisic) for the amazing cover photo 165 | 166 | This is built upon the excellent work down by [@evanw](https://github.com/evanw/) on `esbuild` and uses `esbuild` under the hood 167 | -------------------------------------------------------------------------------- /results.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "bytes" 6 | "fmt" 7 | "io/ioutil" 8 | "os" 9 | "strings" 10 | "sync" 11 | 12 | "github.com/cryogenicplanet/mdopen" 13 | "github.com/fatih/color" 14 | ) 15 | 16 | func checkIgnoredNameSpace(module string) bool { 17 | namespaces := globalConfig.IgnoredNamespaces 18 | 19 | if len(namespaces) > 0 { 20 | for _, name := range namespaces { 21 | if strings.Contains(module, name) { 22 | return true 23 | } 24 | } 25 | } 26 | return false 27 | } 28 | 29 | func computeResults() { 30 | 31 | count := 0 32 | unused := 0 33 | unusedPackages := []string{} 34 | yellow := color.New(color.FgYellow) 35 | green := color.New(color.FgGreen) 36 | red := color.New(color.FgRed) 37 | for key, val := range deps { 38 | 39 | if checkIgnoredNameSpace(key) { 40 | continue 41 | } 42 | 43 | if checkTypePackage(key) { 44 | continue 45 | } 46 | 47 | if !val { 48 | yellow.Println("Package", key, "is unused") 49 | fileLog("Package", key, "is unused") 50 | unusedPackages = append(unusedPackages, key) 51 | unused += 1 52 | } else { 53 | green.Println("Package", key, "is used!") 54 | fileLog("Package", key, "is used!") 55 | } 56 | count += 1 57 | } 58 | 59 | fmt.Print("There are a total of ", count, " packages and ") 60 | yellow.Println(unused, "are the unused") 61 | 62 | fileLog("There are a total of ", count, " packages and ", unused, " are the unused") 63 | 64 | reportLog("**There are a total of ", count, " packages and ", unused, " are the unused**") 65 | 66 | fmt.Print("The unused packages are ") 67 | 68 | yellow.Println(strings.Join(unusedPackages, ", ")) 69 | 70 | duplicatesDiffVersions, duplicatesSameVersion := findDuplicates() 71 | 72 | unusedTypePackage := checkAtTypesPackages() 73 | 74 | if len(duplicatesSameVersion) > 0 || len(duplicatesDiffVersions) > 0 { 75 | if len(duplicatesSameVersion) > 0 { 76 | 77 | fmt.Print("The duplicate packages with same versions are ") 78 | yellow.Println(strings.Join(duplicatesSameVersion, ", ")) 79 | } 80 | if len(duplicatesDiffVersions) > 0 { 81 | 82 | fmt.Print("The duplicate packages with different versions are ") 83 | red.Println(strings.Join(duplicatesDiffVersions, ", ")) 84 | } 85 | 86 | } else { 87 | green.Println("There are no duplicate packages") 88 | } 89 | 90 | unusedPackageMarkdownTable(unusedPackages) 91 | 92 | unusedTypesPackagesMarkdownTable(unusedTypePackage) 93 | 94 | } 95 | 96 | func findDuplicates() ([]string, []string) { 97 | duplicatesDiffVersionName := []string{} 98 | duplicatesDiffVersions := [][]string{} 99 | duplicatesSameVersion := []string{} 100 | 101 | yellow := color.New(color.FgYellow) 102 | 103 | for key, val := range versions { 104 | 105 | if !checkIgnoredNameSpace(key) { 106 | uniqueVersions := uniqueStringSlice(val) 107 | if len(val) > 1 { 108 | 109 | if len(uniqueVersions) > 1 { 110 | duplicatesDiffVersionName = append(duplicatesDiffVersionName, key) 111 | duplicatesDiffVersions = append(duplicatesDiffVersions, uniqueVersions) 112 | } else { 113 | duplicatesSameVersion = append(duplicatesSameVersion, key) 114 | } 115 | if globalConfig.Versions { 116 | if len(uniqueVersions) > 1 { 117 | fmt.Print("The package ") 118 | yellow.Print(key) 119 | fmt.Print(" has multiple versions - ") 120 | yellow.Println(strings.Join(uniqueVersions, ", ")) 121 | } 122 | } 123 | } 124 | } 125 | } 126 | reportLog("## Duplicate packages") 127 | 128 | multipleVersionsMarkdownTable(duplicatesDiffVersionName, duplicatesDiffVersions) 129 | 130 | sameVersionMarkdownTable(duplicatesSameVersion) 131 | 132 | return duplicatesDiffVersionName, duplicatesSameVersion 133 | } 134 | 135 | var reportLines = make(chan string, 100) 136 | 137 | var reportWg sync.WaitGroup 138 | 139 | // Log to generate report file 140 | func reportLog(a ...interface{}) { 141 | str := fmt.Sprint(a...) 142 | reportWg.Add(1) 143 | reportLines <- str 144 | 145 | } 146 | 147 | func unusedPackageMarkdownTable(packages []string) { 148 | if len(packages) > 0 { 149 | reportLog("## Unused packages \n") 150 | for _, val := range packages { 151 | reportLog("- [] ", val) 152 | } 153 | reportLog("\n---") 154 | } 155 | } 156 | 157 | func multipleVersionsMarkdownTable(packages []string, packageVersions [][]string) { 158 | if len(packages) > 0 { 159 | reportLog("### Packages with Multiple Versions") 160 | reportLog("| Package | Version | Used By |") 161 | reportLog("| ----------- | ----------- | ----------- |") 162 | for i := range packages { 163 | name := packages[i] 164 | versions := packageVersions[i] 165 | reportLog("| ", name, " | `", strings.Join(versions, ","), "` | `", strings.Join(depsName[name], ", "), "` | ") 166 | } 167 | } 168 | } 169 | 170 | func sameVersionMarkdownTable(packages []string) { 171 | if len(packages) > 0 { 172 | reportLog("
") 173 | reportLog("Packages with Same Versions\n") 174 | reportLog("| Package | Used By |") 175 | reportLog("| ----------- | ----------- |") 176 | for _, val := range packages { 177 | reportLog("| ", val, " | `", strings.Join(depsName[val], ", "), "` | ") 178 | } 179 | reportLog("
") 180 | } 181 | reportLog("---") 182 | } 183 | 184 | func generateReport() { 185 | 186 | // open output file 187 | fo, err := os.Create(DEPCHECK_DIR + "/report.md") 188 | fileOps.Add(1) 189 | if err != nil { 190 | panic(err) 191 | } 192 | // close fo on exit and check for its returned error 193 | 194 | datawriter := bufio.NewWriter(fo) 195 | 196 | for line := range reportLines { 197 | // fmt.Println("Writing", line, "to report") 198 | _, err := datawriter.WriteString(line + "\n") 199 | markdownString = markdownString + line + "\n" 200 | check(err) 201 | reportWg.Done() 202 | } 203 | 204 | err = datawriter.Flush() 205 | check(err) 206 | err = fo.Close() 207 | check(err) 208 | fileOps.Done() 209 | 210 | } 211 | 212 | func openHtml() { 213 | if !noOpen { 214 | md, err := ioutil.ReadFile(DEPCHECK_DIR + "/report.md") 215 | 216 | if err != nil { 217 | fmt.Println("Previous report not found, please generate a report") 218 | os.Exit(1) 219 | } 220 | 221 | reader := bytes.NewReader(md) 222 | 223 | // err := os.WriteFile(DEPCHECK_DIR+"/report.html", output, 0644) 224 | 225 | // if err != nil { 226 | // panic(err) 227 | // } 228 | 229 | opnr := mdopen.New() 230 | 231 | filePath, err := opnr.Open(reader) 232 | if err != nil { 233 | fmt.Println("[WARN] could not open browser") 234 | } 235 | 236 | fmt.Println("File path is", filePath) 237 | 238 | err = MoveFile(filePath, DEPCHECK_DIR+"/index.html") 239 | 240 | if err != nil { 241 | fmt.Println("[WARN] Error moving file") 242 | } 243 | 244 | } 245 | 246 | } 247 | -------------------------------------------------------------------------------- /scripts/postinstall.ts: -------------------------------------------------------------------------------- 1 | import { exec } from "child_process"; 2 | 3 | import * as fs from "fs"; 4 | 5 | import path from "path"; 6 | 7 | import mkdirp from "mkdirp"; 8 | 9 | import axios from "axios"; 10 | 11 | import decompress from "decompress"; 12 | // Mapping from Node's `process.arch` to Golang's `$GOARCH` 13 | const ARCH_MAPPING: { [name: string]: string } = { 14 | ia32: "386", 15 | x64: "x86_64", 16 | arm: "arm", 17 | arm64: "arm64" 18 | }; 19 | 20 | 21 | // Mapping between Node's `process.platform` to Golang's 22 | const PLATFORM_MAPPING: { [name: string]: string } = { 23 | darwin: "darwin", 24 | linux: "linux", 25 | win32: "windows", 26 | freebsd: "freebsd", 27 | }; 28 | 29 | async function getInstallationPath() { 30 | // `npm bin` will output the path where binary files should be installed 31 | 32 | const value = await execShellCommand("npm bin -g"); 33 | 34 | let dir: string | undefined = undefined; 35 | if (!value || value.length === 0) { 36 | // We couldn't infer path from `npm bin`. Let's try to get it from 37 | // Environment letiables set by NPM when it runs. 38 | // npm_config_prefix points to NPM's installation directory where `bin` folder is available 39 | // Ex: /Users/foo/.nvm/versions/node/v4.3.0 40 | let env = process.env; 41 | if (env && env.npm_config_prefix) { 42 | dir = path.join(env.npm_config_prefix, "bin"); 43 | } 44 | } else { 45 | dir = value.trim(); 46 | } 47 | if (dir) { 48 | await mkdirp(dir); 49 | return dir; 50 | } else { 51 | throw new Error("Could not getInstallationPath"); 52 | } 53 | } 54 | 55 | async function verifyAndPlaceBinary(binName: string, binPath: string, callback: ErrCallback) { 56 | if (!fs.existsSync(path.join(binPath, binName))) 57 | return callback( 58 | new Error("Downloaded binary does not contain the binary specified in configuration - " + 59 | binName) 60 | ); 61 | 62 | // Get installation path for executables under node 63 | const installationPath = await getInstallationPath(); 64 | // Copy the executable to the path 65 | fs.rename( 66 | path.join(binPath, binName), 67 | path.join(installationPath, binName), 68 | (err) => { 69 | if (!err) { 70 | console.info("Installed cli successfully"); 71 | callback(null); 72 | } else { 73 | callback(err); 74 | } 75 | } 76 | ); 77 | } 78 | 79 | function validateConfiguration(packageJson) { 80 | if (!packageJson.version) { 81 | return "'version' property must be specified"; 82 | } 83 | 84 | if (!packageJson.goBinary || typeof packageJson.goBinary !== "object") { 85 | return "'goBinary' property must be defined and be an object"; 86 | } 87 | 88 | if (!packageJson.goBinary.name) { 89 | return "'name' property is necessary"; 90 | } 91 | 92 | if (!packageJson.goBinary.path) { 93 | return "'path' property is necessary"; 94 | } 95 | } 96 | 97 | function parsePackageJson() { 98 | if (!(process.arch in ARCH_MAPPING)) { 99 | throw new Error( 100 | "Installation is not supported for this architecture: " + process.arch 101 | ); 102 | } 103 | 104 | if (!(process.platform in PLATFORM_MAPPING)) { 105 | throw new Error( 106 | "Installation is not supported for this platform: " + process.platform 107 | ); 108 | } 109 | 110 | let packageJsonPath = path.join(".", "package.json"); 111 | if (!fs.existsSync(packageJsonPath)) { 112 | throw new Error( 113 | "Unable to find package.json. " + 114 | "Please run this script at root of the package you want to be installed" 115 | ); 116 | } 117 | 118 | let packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")); 119 | let error = validateConfiguration(packageJson); 120 | if (error && error.length > 0) { 121 | throw new Error("Invalid package.json: " + error); 122 | } 123 | 124 | // We have validated the config. It exists in all its glory 125 | let binName: string = packageJson.goBinary.name; 126 | let binPath: string = packageJson.goBinary.path; 127 | let version: string = packageJson.version; 128 | if (version[0] === "v") version = version.substr(1); // strip the 'v' if necessary v0.0.1 => 0.0.1 129 | 130 | // Binary name on Windows has .exe suffix 131 | if (process.platform === "win32") { 132 | binName += ".exe"; 133 | } 134 | 135 | return { 136 | binName: binName, 137 | binPath: binPath, 138 | version: version, 139 | }; 140 | } 141 | 142 | type ErrCallback = (_err: Error | null) => void; 143 | 144 | async function downloadAndInstall(url: string, outPath: string, binName:string) { 145 | const tempPath = fs.mkdtempSync("depp"); 146 | 147 | const { data } = await axios({ 148 | method: "get", 149 | url: url, 150 | responseType: "stream", 151 | }); 152 | 153 | const tarballPath = `${tempPath}/tarball.tar.gz`; 154 | 155 | const outFile = fs.createWriteStream(tarballPath); 156 | 157 | data.pipe(outFile); 158 | 159 | return new Promise((resolve) => { 160 | outFile.on("unpipe", async () => { 161 | console.log("Unpacked tarball"); 162 | await decompress(tarballPath, `${tempPath}/tar`); 163 | fs.renameSync( 164 | path.resolve(`${tempPath}/tar/${binName}`), 165 | path.resolve(outPath) 166 | ); 167 | console.log("Wrote binary to out path", outPath); 168 | 169 | fs.rmdirSync(tempPath, { recursive: true }); 170 | 171 | resolve(); 172 | }); 173 | }); 174 | } 175 | 176 | /** 177 | * Reads the configuration from application's package.json, 178 | * validates properties, copied the binary from the package and stores at 179 | * ./bin in the package's root. NPM already has support to install binary files 180 | * specific locations when invoked with "npm install -g" 181 | * 182 | * See: https://docs.npmjs.com/files/package.json#bin 183 | */ 184 | const INVALID_INPUT = "Invalid inputs"; 185 | async function install(callback: ErrCallback) { 186 | let opts = parsePackageJson(); 187 | if (!opts) return callback(new Error(INVALID_INPUT)); 188 | mkdirp.sync(opts.binPath); 189 | console.info( 190 | `Copying the relevant binary for your platform ${process.platform}` 191 | ); 192 | const platform = PLATFORM_MAPPING[process.platform]; 193 | const arch = ARCH_MAPPING[process.arch]; 194 | 195 | const url = `https://github.com/CryogenicPlanet/depp/releases/download/v${opts.version}/depp_${opts.version}_${platform}_${arch}.tar.gz`; 196 | 197 | console.log("Downloading binary from", url); 198 | 199 | await downloadAndInstall(url, `${opts.binPath}/${opts.binName}`, opts.binName); 200 | 201 | // await execShellCommand(`cp ${src} ${opts.binPath}/${opts.binName}`); 202 | // await execShellCommand(`cp ${src} ${opts.binPath}/${opts.binName}`); 203 | await verifyAndPlaceBinary(opts.binName, opts.binPath, callback); 204 | } 205 | 206 | async function uninstall(callback: ErrCallback) { 207 | let opts = parsePackageJson(); 208 | try { 209 | const installationPath = await getInstallationPath(); 210 | fs.unlink(path.join(installationPath, opts.binName), (err) => { 211 | if (err) { 212 | return callback(err); 213 | } 214 | }); 215 | } catch (ex) { 216 | // Ignore errors when deleting the file. 217 | } 218 | console.info("Uninstalled cli successfully"); 219 | return callback(null); 220 | } 221 | 222 | // Parse command line arguments and call the right method 223 | let actions = { 224 | install: install, 225 | uninstall: uninstall, 226 | }; 227 | /** 228 | * Executes a shell command and return it as a Promise. 229 | * @param cmd {string} 230 | * @return {Promise} 231 | */ 232 | function execShellCommand(cmd: string) { 233 | return new Promise((resolve, reject) => { 234 | exec(cmd, (error, stdout, stderr) => { 235 | if (error) { 236 | console.warn(error); 237 | reject(error); 238 | } 239 | resolve(stdout ? stdout : stderr); 240 | }); 241 | }); 242 | } 243 | 244 | const argv = process.argv; 245 | if (argv && argv.length > 2) { 246 | let cmd = process.argv[2]; 247 | if (!actions[cmd]) { 248 | console.log( 249 | "Invalid command. `install` and `uninstall` are the only supported commands" 250 | ); 251 | process.exit(1); 252 | } 253 | 254 | actions[cmd](function (err: Error | null) { 255 | if (err) { 256 | console.error(err); 257 | process.exit(1); 258 | } else { 259 | process.exit(0); 260 | } 261 | }); 262 | } 263 | -------------------------------------------------------------------------------- /serverless/.gitignore: -------------------------------------------------------------------------------- 1 | .vercel 2 | -------------------------------------------------------------------------------- /serverless/api/proxy/issueComments.go: -------------------------------------------------------------------------------- 1 | package serverless 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "io/ioutil" 7 | "net/http" 8 | "net/url" 9 | "strconv" 10 | 11 | "github.com/cryogenicplanet/depp/serverless/shared" 12 | "github.com/google/go-github/v39/github" 13 | "golang.org/x/oauth2" 14 | ) 15 | 16 | func Handler(w http.ResponseWriter, r *http.Request) { 17 | 18 | query := r.URL.Query() 19 | owner := query.Get("owner") 20 | repo := query.Get("repo") 21 | issue, err := strconv.Atoi(query.Get("issue")) 22 | 23 | if err != nil { 24 | fmt.Println(err) 25 | w.WriteHeader(http.StatusBadRequest) 26 | fmt.Fprintln(w, "Could not parse issue number") 27 | return 28 | } 29 | 30 | token, err := shared.GetInstallationToken(owner) 31 | 32 | if err != nil { 33 | fmt.Println(err) 34 | w.WriteHeader(http.StatusInternalServerError) 35 | fmt.Fprintln(w, err) 36 | return 37 | 38 | } 39 | 40 | tokenCtx := context.Background() 41 | 42 | ts := oauth2.StaticTokenSource( 43 | &oauth2.Token{AccessToken: token.GetToken()}, 44 | ) 45 | tc := oauth2.NewClient(tokenCtx, ts) 46 | 47 | tokenClient := github.NewClient(tc) 48 | 49 | issueData, _, err := tokenClient.Issues.Get(tokenCtx, owner, repo, issue) 50 | 51 | if err != nil { 52 | fmt.Println(err) 53 | w.WriteHeader(http.StatusInternalServerError) 54 | fmt.Fprintln(w, "Could not get issue data") 55 | return 56 | 57 | } 58 | 59 | link, err := url.Parse(issueData.GetCommentsURL()) 60 | 61 | if err != nil { 62 | fmt.Println(err) 63 | 64 | w.WriteHeader(http.StatusInternalServerError) 65 | fmt.Fprintln(w, "Could not get parse comment url") 66 | return 67 | 68 | } 69 | 70 | response, err := tokenClient.BareDo(tokenCtx, &http.Request{URL: link}) 71 | 72 | if err != nil { 73 | fmt.Println(err) 74 | w.WriteHeader(http.StatusInternalServerError) 75 | fmt.Fprintln(w, "Could not get comments") 76 | return 77 | 78 | } 79 | 80 | // issue, _, err := client.Issues.Get(tokenCtx, "cryogenicplanet", "cryogenicplanet.github.io", 49) 81 | 82 | // fmt.Fprintln(w, issue.GetCommentsURL()) 83 | 84 | body, err := ioutil.ReadAll(response.Body) 85 | 86 | if err != nil { 87 | fmt.Println(err) 88 | w.WriteHeader(http.StatusInternalServerError) 89 | fmt.Fprintln(w, "Could not read response") 90 | return 91 | } 92 | 93 | headers := response.Header.Clone() 94 | 95 | for key, values := range headers { 96 | for _, value := range values { 97 | w.Header().Add(key, value) 98 | } 99 | } 100 | 101 | w.Write(body) 102 | } 103 | -------------------------------------------------------------------------------- /serverless/api/proxy/updateComment.go: -------------------------------------------------------------------------------- 1 | package serverless 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "net/http" 7 | "strconv" 8 | 9 | "github.com/cryogenicplanet/depp/serverless/shared" 10 | 11 | "github.com/google/go-github/v39/github" 12 | "golang.org/x/oauth2" 13 | ) 14 | 15 | func UpdateHandler(w http.ResponseWriter, r *http.Request) { 16 | 17 | query := r.URL.Query() 18 | owner := query.Get("owner") 19 | repo := query.Get("repo") 20 | commentBody := query.Get("commentBody") 21 | commentId := query.Get("commentId") 22 | issue := query.Get("issue") 23 | 24 | if owner == "" || repo == "" || commentBody == "" { 25 | w.WriteHeader(http.StatusBadRequest) 26 | fmt.Fprintln(w, "Invalid params") 27 | return 28 | } 29 | 30 | if commentId == "" && issue == "" { 31 | w.WriteHeader(http.StatusBadRequest) 32 | fmt.Fprintln(w, "Invalid params") 33 | return 34 | } 35 | 36 | issueNumber, issueErr := strconv.Atoi(issue) 37 | commentNumber, commentErr := strconv.ParseInt(commentId, 10, 64) 38 | 39 | if issueErr != nil && commentErr != nil { 40 | fmt.Println(issueErr, commentErr) 41 | w.WriteHeader(http.StatusBadRequest) 42 | fmt.Fprintln(w, "Could not parse issue number or comment id") 43 | return 44 | } 45 | 46 | if issueErr != nil { 47 | issueNumber = -1 48 | } 49 | 50 | if commentErr != nil { 51 | commentNumber = -1 52 | } 53 | 54 | token, err := shared.GetInstallationToken(owner) 55 | 56 | if err != nil { 57 | fmt.Println(err) 58 | w.WriteHeader(http.StatusInternalServerError) 59 | fmt.Fprintln(w, err) 60 | } 61 | 62 | tokenCtx := context.Background() 63 | 64 | ts := oauth2.StaticTokenSource( 65 | &oauth2.Token{AccessToken: token.GetToken()}, 66 | ) 67 | tc := oauth2.NewClient(tokenCtx, ts) 68 | 69 | tokenClient := github.NewClient(tc) 70 | 71 | if issueNumber != -1 { 72 | _, _, err = tokenClient.Issues.CreateComment(tokenCtx, owner, repo, issueNumber, &github.IssueComment{Body: &commentBody}) 73 | } else { 74 | _, _, err = tokenClient.Issues.EditComment(tokenCtx, owner, repo, commentNumber, &github.IssueComment{Body: &commentBody}) 75 | } 76 | 77 | if err != nil { 78 | fmt.Println(err) 79 | w.WriteHeader(http.StatusInternalServerError) 80 | fmt.Fprintln(w, "Could not get create/edit comment", err) 81 | return 82 | } 83 | 84 | w.WriteHeader(http.StatusAccepted) 85 | fmt.Fprintln(w, "Success") 86 | } 87 | -------------------------------------------------------------------------------- /serverless/shared/auth.go: -------------------------------------------------------------------------------- 1 | package shared 2 | 3 | import ( 4 | "context" 5 | "net/http" 6 | "os" 7 | "strconv" 8 | "strings" 9 | 10 | "github.com/bradleyfalzon/ghinstallation/v2" 11 | "github.com/google/go-github/v39/github" 12 | ) 13 | 14 | func GetInstallationToken(owner string) (*github.InstallationToken, error) { 15 | keyData := os.Getenv("GITHUB_PRIVATE_KEY") 16 | id := os.Getenv("GITHUB_APP_ID") 17 | 18 | tr := http.DefaultTransport 19 | 20 | ctx := context.Background() 21 | 22 | intId, err := strconv.ParseInt(id, 10, 64) 23 | if err != nil { 24 | return nil, err 25 | } 26 | 27 | // Wrap the shared transport for use with the app ID 1 authenticating with installation ID 99. 28 | itr, err := ghinstallation.NewAppsTransport(tr, intId, []byte(keyData)) 29 | if err != nil { 30 | return nil, err 31 | } 32 | 33 | // Use installation transport with github.com/google/go-github 34 | jwtClient := github.NewClient(&http.Client{Transport: itr}) 35 | 36 | if err != nil { 37 | return nil, err 38 | } 39 | 40 | // fmt.Println("Owner", owner) 41 | 42 | installs, _, err := jwtClient.Apps.ListInstallations(ctx, nil) 43 | 44 | if err != nil { 45 | return nil, err 46 | } 47 | 48 | var installId int64 49 | 50 | for _, install := range installs { 51 | // fmt.Printf("Install %+v\n", install) 52 | 53 | if strings.EqualFold(install.Account.GetLogin(), owner) { 54 | 55 | installId = install.GetID() 56 | break 57 | } 58 | } 59 | if installId == 0 { 60 | panic("Could not find install") 61 | } 62 | 63 | token, _, err := jwtClient.Apps.CreateInstallationToken(ctx, installId, nil) 64 | 65 | return token, err 66 | 67 | } 68 | -------------------------------------------------------------------------------- /static/htmlReport.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 612 |
613 |

614 | 627 |

628 |
629 |

Report for - /home/cryogenicplanet/modfy/editor

630 | 631 |

632 | There are a total of 89 packages and 19 are the unused 633 |

634 | 635 |

Unused packages

636 | 637 |
    638 |
  • [] @babel/core
  • 639 |
  • [] @modfy/videocontext
  • 640 |
  • [] redux
  • 641 |
  • [] @visx/axis
  • 642 |
  • [] graphql-scalars
  • 643 |
  • [] graphql-fields
  • 644 |
  • [] mobx
  • 645 |
  • [] @magic-ext/oauth
  • 646 |
  • [] hash-stream-validation
  • 647 |
  • [] @sentry/node
  • 648 |
  • [] @visx/scale
  • 649 |
  • [] class-validator
  • 650 |
  • [] ws
  • 651 |
  • [] workbox-webpack-plugin
  • 652 |
  • [] worker-plugin
  • 653 |
  • [] graphql
  • 654 |
  • [] lodash.debounce
  • 655 |
  • [] magic-sdk
  • 656 |
  • [] apollo
  • 657 |
658 | 659 |
660 | 661 |

Duplicate packages

662 | 663 |

Packages with Same Versions

664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 |
PackageUsed By
reflect-metadata@modfy/editor, @server/core
y-websocket@editor/multiplayer, @server/ws
@sentry/tracingclient, @server/core
react-redux 692 | @editor/command-palette, @editor/components, @editor/hotkeys, 694 | @editor/render, @editor/state 696 |
twind@modfy/editor, client
@google-cloud/storageclient, @editor/api
graphql@modfy/editor, @editor/graphql, @server/core
@types/react@modfy/editor, client
@types/express@server/core, @server/interfaces
mobx-react 727 | @modfy/editor, @editor/command-palette, @editor/components, 729 | @editor/controls, @editor/editable-preview, @editor/files, 730 | @editor/hotkeys, @editor/media, @editor/multiplayer, 731 | @editor/player, @editor/render, @editor/timeline, 732 | @editor/utils 734 |
@sentry/cli@modfy/editor, client
@apollo/client 745 | client, @editor/graphql, @editor/state, @editor/utils, 747 | @server/core 749 |
react-dom@modfy/editor, @editor/editable-preview
nanoid 760 | @editor/components, @editor/files, @editor/media, 762 | @editor/multiplayer, @editor/state, @editor/utils, 763 | @server/core 765 |
jsonwebtoken@server/core, @server/ws
fuse.jsclient, @editor/command-palette
gqty@modfy/editor, @editor/graphql
@reduxjs/toolkit@editor/multiplayer, @editor/state
@babel/core@modfy/editor, @modfy/editor
@magic-sdk/admin@server/core, @server/interfaces
http-status-codes@editor/api, @server/core
esbuildclient, @server/core, @server/ws
y-protocols@editor/multiplayer, @server/ws
classnames 816 | @editor/files, @editor/multiplayer, @editor/render, 818 | @editor/timeline 820 |
nodemon@server/core, @server/ws
@types/audioworklet 831 | @modfy/editor, @editor/interfaces, @editor/render 832 |
react-draggable@editor/controls, @editor/timeline
react-zoom-pan-pinch@editor/editable-preview, @editor/state
winston@server/core, @server/ws
ws@server/core, @server/ws
856 | 857 |
858 | 859 |

Packages with Multiple Versions

860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 880 | 881 | 882 | 883 | 884 | 885 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 910 | 911 | 912 | 913 | 914 | 915 | 921 | 922 | 923 | 924 | 925 | 926 | 929 | 930 | 931 | 932 | 933 | 934 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 |
PackageVersionUsed By
yjs^13.5.11,^13.5.12 875 | @editor/multiplayer, @editor/render, @server/core, 877 | @server/ws 879 |
react-cookie^4.0.3,^4.1.1 886 | client, @editor/graphql, @editor/multiplayer, @editor/render, 888 | @editor/utils 890 |
axios^0.23.0,^0.21.1@modfy/editor, @editor/files, @server/core
mobx^6.3.2,^6.3.3 903 | @editor/command-palette, @editor/components, @editor/controls, 905 | @editor/files, @editor/hotkeys, @editor/media, 906 | @editor/multiplayer, @editor/player, @editor/render, 907 | @editor/state, @editor/utils 909 |
@heroicons/react^1.0.1,^1.0.2 916 | @modfy/editor, @editor/multiplayer, @editor/player, 918 | @editor/timeline 920 |
@headlessui/react^1.4.1,^1.3.0 927 | @modfy/editor, @editor/multiplayer, @editor/render 928 |
react-hot-toast^2.1.0,^2.0.0 935 | @modfy/editor, client, @editor/components, @editor/files, 937 | @editor/media 939 |
@types/node^15.6.2,^16.4.12@modfy/editor, client
949 | 950 |
951 | 952 |

Unused @types packages

953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 994 | 995 | 996 |
Type PackageActual PackageUsed By
@types/webpackwebpackclient
@types/nodenode@modfy/editor, client
@types/webaudioapiwebaudioapi@modfy/editor
@types/offscreencanvasoffscreencanvas@editor/render
@types/audioworkletaudioworklet 992 | @modfy/editor, @editor/interfaces, @editor/render 993 |
997 | 998 |
999 |
1000 |
1001 | -------------------------------------------------------------------------------- /static/markdownReport.md: -------------------------------------------------------------------------------- 1 | # Report for - /home/cryogenicplanet/modfy/editor 2 | **There are a total of 89 packages and 19 are the unused** 3 | ## Unused packages 4 | 5 | - [] @babel/core 6 | - [] @modfy/videocontext 7 | - [] redux 8 | - [] @visx/axis 9 | - [] graphql-scalars 10 | - [] graphql-fields 11 | - [] mobx 12 | - [] @magic-ext/oauth 13 | - [] hash-stream-validation 14 | - [] @sentry/node 15 | - [] @visx/scale 16 | - [] class-validator 17 | - [] ws 18 | - [] workbox-webpack-plugin 19 | - [] worker-plugin 20 | - [] graphql 21 | - [] lodash.debounce 22 | - [] magic-sdk 23 | - [] apollo 24 | 25 | --- 26 | ## Duplicate packages 27 | ### Packages with Same Versions 28 | | Package | Used By | 29 | | ----------- | ----------- | 30 | | reflect-metadata | `@modfy/editor, @server/core` | 31 | | y-websocket | `@editor/multiplayer, @server/ws` | 32 | | @sentry/tracing | `client, @server/core` | 33 | | react-redux | `@editor/command-palette, @editor/components, @editor/hotkeys, @editor/render, @editor/state` | 34 | | twind | `@modfy/editor, client` | 35 | | @google-cloud/storage | `client, @editor/api` | 36 | | graphql | `@modfy/editor, @editor/graphql, @server/core` | 37 | | @types/react | `@modfy/editor, client` | 38 | | @types/express | `@server/core, @server/interfaces` | 39 | | mobx-react | `@modfy/editor, @editor/command-palette, @editor/components, @editor/controls, @editor/editable-preview, @editor/files, @editor/hotkeys, @editor/media, @editor/multiplayer, @editor/player, @editor/render, @editor/timeline, @editor/utils` | 40 | | @sentry/cli | `@modfy/editor, client` | 41 | | @apollo/client | `client, @editor/graphql, @editor/state, @editor/utils, @server/core` | 42 | | react-dom | `@modfy/editor, @editor/editable-preview` | 43 | | nanoid | `@editor/components, @editor/files, @editor/media, @editor/multiplayer, @editor/state, @editor/utils, @server/core` | 44 | | jsonwebtoken | `@server/core, @server/ws` | 45 | | fuse.js | `client, @editor/command-palette` | 46 | | gqty | `@modfy/editor, @editor/graphql` | 47 | | @reduxjs/toolkit | `@editor/multiplayer, @editor/state` | 48 | | @babel/core | `@modfy/editor, @modfy/editor` | 49 | | @magic-sdk/admin | `@server/core, @server/interfaces` | 50 | | http-status-codes | `@editor/api, @server/core` | 51 | | esbuild | `client, @server/core, @server/ws` | 52 | | y-protocols | `@editor/multiplayer, @server/ws` | 53 | | classnames | `@editor/files, @editor/multiplayer, @editor/render, @editor/timeline` | 54 | | nodemon | `@server/core, @server/ws` | 55 | | @types/audioworklet | `@modfy/editor, @editor/interfaces, @editor/render` | 56 | | react-draggable | `@editor/controls, @editor/timeline` | 57 | | react-zoom-pan-pinch | `@editor/editable-preview, @editor/state` | 58 | | winston | `@server/core, @server/ws` | 59 | | ws | `@server/core, @server/ws` | 60 | --- 61 | ### Packages with Multiple Versions 62 | | Package | Version | Used By 63 | | ----------- | ----------- | ----------- | 64 | | yjs | `^13.5.11,^13.5.12` | `@editor/multiplayer, @editor/render, @server/core, @server/ws` | 65 | | react-cookie | `^4.0.3,^4.1.1` | `client, @editor/graphql, @editor/multiplayer, @editor/render, @editor/utils` | 66 | | axios | `^0.23.0,^0.21.1` | `@modfy/editor, @editor/files, @server/core` | 67 | | mobx | `^6.3.2,^6.3.3` | `@editor/command-palette, @editor/components, @editor/controls, @editor/files, @editor/hotkeys, @editor/media, @editor/multiplayer, @editor/player, @editor/render, @editor/state, @editor/utils` | 68 | | @heroicons/react | `^1.0.1,^1.0.2` | `@modfy/editor, @editor/multiplayer, @editor/player, @editor/timeline` | 69 | | @headlessui/react | `^1.4.1,^1.3.0` | `@modfy/editor, @editor/multiplayer, @editor/render` | 70 | | react-hot-toast | `^2.1.0,^2.0.0` | `@modfy/editor, client, @editor/components, @editor/files, @editor/media` | 71 | | @types/node | `^15.6.2,^16.4.12` | `@modfy/editor, client` | 72 | --- 73 | ## Unused `@types` packages 74 | | Type Package | Actual Package | Used By | 75 | | ----------- | ----------- | ----------- | 76 | | @types/webpack | webpack | `client` | 77 | | @types/node | node | `@modfy/editor, client` | 78 | | @types/webaudioapi | webaudioapi | `@modfy/editor` | 79 | | @types/offscreencanvas | offscreencanvas | `@editor/render` | 80 | | @types/audioworklet | audioworklet | `@modfy/editor, @editor/interfaces, @editor/render` | 81 | --- 82 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": false, 4 | "noImplicitAny": false, 5 | "removeComments": true, 6 | "noLib": false, 7 | "target": "ES2016", 8 | "sourceMap": true, 9 | "module": "commonjs", 10 | "jsx": "preserve", 11 | "strict": true, 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "allowSyntheticDefaultImports": true, 15 | "esModuleInterop": true, 16 | "lib": ["dom", "dom.iterable", "esnext", "WebWorker", "es2019"], 17 | "skipLibCheck": true, 18 | "forceConsistentCasingInFileNames": true, 19 | "isolatedModules": true, 20 | "baseUrl": ".", 21 | "allowJs": true, 22 | "noEmit": true 23 | }, 24 | 25 | "include": [ 26 | "scripts/*" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /utils.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io" 6 | "os" 7 | "path/filepath" 8 | "strings" 9 | ) 10 | 11 | // Expand finds matches for the provided Globs. 12 | func handleGlobs(globs []string, ignored []string) ([]string, error) { 13 | var matches = []string{""} // accumulate here 14 | 15 | for _, glob := range globs { 16 | if glob != "" && string(glob[0]) == "." { 17 | // Check if first character is "." 18 | // This eliminates cases where you have .ts instead of *.ts 19 | glob = "*" + glob 20 | } 21 | if glob == "" { 22 | glob = "." 23 | } 24 | 25 | // fmt.Println("Glob iteration", glob) 26 | var hits []string 27 | var hitMap = map[string]bool{} 28 | for _, match := range matches { 29 | // fmt.Println("Match iteration", match) 30 | paths, err := filepath.Glob(match + glob) 31 | // fmt.Println("Paths", paths) 32 | if err != nil { 33 | return nil, err 34 | } 35 | for _, path := range paths { 36 | err = filepath.Walk(path, func(path string, info os.FileInfo, err error) error { 37 | if err != nil { 38 | return err 39 | } 40 | // save de duped match from current iteration 41 | if _, ok := hitMap[path]; !ok { 42 | 43 | for _, ignorePattern := range ignored { 44 | ok, err := filepath.Match(ignorePattern, path) 45 | if ok || err != nil || strings.Contains(path, ignorePattern) { 46 | // is an ignored file 47 | return nil 48 | } 49 | 50 | } 51 | 52 | if strings.Contains(path, "node_modules") { 53 | return nil 54 | } 55 | 56 | hits = append(hits, path) 57 | hitMap[path] = true 58 | } 59 | return nil 60 | }) 61 | if err != nil { 62 | return nil, err 63 | } 64 | } 65 | } 66 | matches = hits 67 | } 68 | 69 | // fix up return value for nil input 70 | if globs == nil && len(matches) > 0 && matches[0] == "" { 71 | matches = matches[1:] 72 | } 73 | 74 | return matches, nil 75 | } 76 | 77 | // Globs represents one filepath glob, with its elements joined by "**". 78 | 79 | // Glob adds double-star support to the core path/filepath Glob function. 80 | // It's useful when your globs might have double-stars, but you're not sure. 81 | func Glob(pattern string) ([]string, error) { 82 | if !strings.Contains(pattern, "**") { 83 | // passthru to core package if no double-star 84 | return filepath.Glob(pattern) 85 | } 86 | ingored := []string{"node_modules", "dist", ".next"} 87 | ingored = append(ingored, globalConfig.IgnoredPaths...) 88 | 89 | return handleGlobs(strings.Split(pattern, "**"), ingored) 90 | } 91 | 92 | func uniqueStringSlice(intSlice []string) []string { 93 | keys := make(map[string]bool) 94 | list := []string{} 95 | for _, entry := range intSlice { 96 | if _, value := keys[entry]; !value { 97 | keys[entry] = true 98 | list = append(list, entry) 99 | } 100 | } 101 | return list 102 | } 103 | 104 | func check(err error) { 105 | if err != nil { 106 | panic(err) 107 | } 108 | } 109 | 110 | func MoveFile(sourcePath, destPath string) error { 111 | inputFile, err := os.Open(sourcePath) 112 | if err != nil { 113 | return fmt.Errorf("couldn't open source file: %s", err) 114 | } 115 | outputFile, err := os.Create(destPath) 116 | if err != nil { 117 | inputFile.Close() 118 | return fmt.Errorf("couldn't open dest file: %s", err) 119 | } 120 | defer outputFile.Close() 121 | _, err = io.Copy(outputFile, inputFile) 122 | inputFile.Close() 123 | if err != nil { 124 | return fmt.Errorf("writing to output file failed: %s", err) 125 | } 126 | // // The copy was successful, so now delete the original file 127 | // err = os.Remove(sourcePath) 128 | // if err != nil { 129 | // return fmt.Errorf("Failed removing original file: %s", err) 130 | // } 131 | return nil 132 | } 133 | -------------------------------------------------------------------------------- /writer.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "sync" 8 | ) 9 | 10 | var logs = make(chan string, 100) 11 | 12 | const DEPCHECK_DIR = ".depp" 13 | 14 | var loggerWg sync.WaitGroup 15 | 16 | var fileOps sync.WaitGroup 17 | 18 | func fileLog(a ...interface{}) { 19 | str := fmt.Sprintln(a...) 20 | // fmt.Println("Adding to log queue") 21 | loggerWg.Add(1) 22 | logs <- str 23 | } 24 | 25 | func createDirectory() { 26 | 27 | if _, err := os.Stat(DEPCHECK_DIR); os.IsNotExist(err) { 28 | 29 | err := os.Mkdir(DEPCHECK_DIR, 0755) 30 | if err != nil { 31 | panic(err) 32 | } 33 | } 34 | 35 | } 36 | 37 | func removeDirectory(noLog bool) { 38 | if _, err := os.Stat(DEPCHECK_DIR); !os.IsNotExist(err) { 39 | // path/to/whatever exists 40 | err := os.RemoveAll(DEPCHECK_DIR) 41 | if err != nil { 42 | panic(err) 43 | } 44 | if !noLog { 45 | fmt.Println("Cleaned!") 46 | } 47 | } else { 48 | fmt.Println("Nothing to clean") 49 | } 50 | 51 | } 52 | 53 | func writeLogsToFile() { 54 | 55 | if globalConfig.Log { 56 | fmt.Println("Will be logging output to " + DEPCHECK_DIR + "/debug.log") 57 | // open output file 58 | fo, err := os.Create(DEPCHECK_DIR + "/debug.log") 59 | fileOps.Add(1) 60 | if err != nil { 61 | panic(err) 62 | } 63 | // close fo on exit and check for its returned error 64 | defer func() { 65 | if err := fo.Close(); err != nil { 66 | panic(err) 67 | } 68 | }() 69 | 70 | datawriter := bufio.NewWriter(fo) 71 | 72 | for line := range logs { 73 | // fmt.Println("Writing", line, "to file") 74 | _, err := datawriter.WriteString(line + "\n") 75 | if err != nil { 76 | panic(err) 77 | } 78 | loggerWg.Done() 79 | } 80 | datawriter.Flush() 81 | fo.Close() 82 | fileOps.Done() 83 | } else { 84 | for line := range logs { 85 | fmt.Sprintln(line) // Just ignore this line 86 | loggerWg.Done() 87 | 88 | } 89 | } 90 | } 91 | --------------------------------------------------------------------------------