├── .github └── workflows │ ├── commit.yml │ ├── release.yml │ └── test.yml ├── .gitignore ├── .goreleaser.yaml ├── LICENSE ├── README.md ├── cmd ├── cmd_build.go ├── cmd_init.go ├── cmd_run.go ├── cmd_version.go ├── cmd_yml.go └── main.go ├── go.mod ├── go.sum ├── internal ├── build │ ├── build.go │ ├── config │ │ └── webpack.config.js │ ├── jar.go │ ├── jar_template.go │ ├── jar_template_file.go │ ├── jar_template_github.go │ └── pluginyml.go ├── initialize │ ├── initialize.go │ └── template │ │ ├── installer.go │ │ ├── template.go │ │ └── template_github.go ├── minecraft │ ├── version.go │ ├── version_papermc.go │ └── versions.go ├── pluginyml │ ├── pluginyml.go │ ├── pluginyml_test.go │ └── testdata │ │ ├── plugin-1.yml │ │ └── plugin-2.yml ├── project │ ├── package_json.go │ └── project.go ├── serve │ └── serve.go └── server │ ├── fetcher.go │ ├── fetcher_cache.go │ └── fetcher_http.go ├── package-lock.json ├── package.json └── postinstall.js /.github/workflows/commit.yml: -------------------------------------------------------------------------------- 1 | name: Commit Version 2 | on: 3 | push: 4 | branches: 5 | - master 6 | 7 | jobs: 8 | version_tag: 9 | name: Commit Version 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v2 14 | 15 | - name: Generate next version number 16 | uses: actions/github-script@v6 17 | id: version 18 | with: 19 | github-token: ${{ secrets.GITHUB_TOKEN }} 20 | result-encoding: string 21 | script: | 22 | const fs = require('fs'); 23 | const version_from_file = JSON.parse(fs.readFileSync('package.json', 'utf8')).version; 24 | const base_version = version_from_file 25 | .split('.') 26 | .slice(0, 2) 27 | .join('.'); 28 | const previous_refs = await github.rest.git.listMatchingRefs({ 29 | owner: context.repo.owner, 30 | repo: context.repo.repo, 31 | ref: 'tags/v' + base_version + '.' 32 | }); 33 | // build_number could also be github.run_attempt 34 | const build_number = previous_refs.data.length; 35 | const version = `${base_version}.${build_number}`; 36 | console.log('Version: ', version); 37 | return version; 38 | 39 | - name: Create tag 40 | uses: actions/github-script@v6 41 | with: 42 | github-token: ${{ secrets.GITHUB_TOKEN }} 43 | script: | 44 | github.rest.git.createRef({ 45 | owner: context.repo.owner, 46 | repo: context.repo.repo, 47 | ref: 'refs/tags/v${{ steps.version.outputs.result }}', 48 | sha: context.sha 49 | }) 50 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | release: 3 | types: [created] 4 | 5 | name: Release 6 | 7 | permissions: 8 | contents: write 9 | 10 | jobs: 11 | release: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v2 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Get release 20 | id: get_release 21 | uses: bruceadams/get-release@v1.2.2 22 | env: 23 | GITHUB_TOKEN: ${{ github.token }} 24 | 25 | - name: Set up Go 26 | uses: actions/setup-go@v5 27 | with: 28 | go-version-file: 'go.mod' 29 | 30 | - uses: actions/setup-node@v4 31 | with: 32 | node-version: 20 33 | 34 | - name: Build Go Binaries 35 | uses: goreleaser/goreleaser-action@v2 36 | with: 37 | distribution: goreleaser 38 | version: latest 39 | args: release --clean 40 | env: 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | 43 | - name: Update version in package.json 44 | uses: actions/github-script@v6 45 | with: 46 | github-token: ${{ secrets.GITHUB_TOKEN }} 47 | script: | 48 | const fs = require('fs'); 49 | const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8')); 50 | packageJson.version = '${{ steps.get_release.outputs.tag_name }}'.replace(/^v/, ''); 51 | fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2)); 52 | 53 | - run: npm ci 54 | 55 | - uses: JS-DevTools/npm-publish@v1 56 | with: 57 | token: ${{ secrets.NPM_TOKEN }} 58 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: 3 | pull_request: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - master 8 | jobs: 9 | checks: 10 | name: Workspace Checks 11 | runs-on: ubuntu-latest 12 | steps: 13 | 14 | - name: Checkout 15 | uses: actions/checkout@v2 16 | 17 | - uses: actions/setup-go@v5 18 | with: 19 | go-version-file: 'go.mod' 20 | 21 | - name: Lint 22 | run: if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then exit 1; fi 23 | 24 | - name: Tidy 25 | run: | 26 | go mod tidy 27 | if [[ -n $(git status -s) ]]; then exit 1; fi 28 | 29 | test: 30 | name: Build and Test 31 | runs-on: ubuntu-latest 32 | steps: 33 | 34 | - name: Checkout 35 | uses: actions/checkout@v2 36 | 37 | - uses: actions/setup-go@v5 38 | with: 39 | go-version-file: 'go.mod' 40 | 41 | - name: Vet 42 | run: go vet ./... 43 | 44 | - name: Test 45 | run: go test ./... 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /dist 3 | /node_modules 4 | -------------------------------------------------------------------------------- /.goreleaser.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://goreleaser.com/static/schema.json 2 | 3 | version: 2 4 | 5 | project_name: customrealms-cli 6 | 7 | before: 8 | hooks: 9 | - go mod tidy 10 | 11 | builds: 12 | - env: 13 | - CGO_ENABLED=0 14 | goos: 15 | - linux 16 | - windows 17 | - darwin 18 | main: ./cmd 19 | binary: crx 20 | 21 | archives: 22 | - format: tar.gz 23 | name_template: >- 24 | {{ .ProjectName }}_ 25 | {{- .Version }}_ 26 | {{- .Os }}_ 27 | {{- if eq .Arch "386" }}i386 28 | {{- else }}{{- .Arch }}{{ end }} 29 | {{- if .Arm }}v{{ .Arm }}{{ end }} 30 | 31 | checksum: 32 | name_template: "checksums.txt" 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 CustomRealms 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @customrealms/cli 2 | 3 | CustomRealms command-line tools for setting up and compiling JavaScript Minecraft plugins. 4 | 5 | ### Installation 6 | 7 | Install the CLI on your computer: 8 | 9 | ```sh 10 | npm install -g @customrealms/cli 11 | ``` 12 | 13 | Then, you can use the CustomRealms CLI using the `crx` command in your terminal. 14 | 15 | ### Start a project 16 | 17 | ```sh 18 | mkdir my-plugin 19 | cd my-plugin 20 | crx init 21 | ``` 22 | 23 | That's it! You now have a plugin project ready to develop! 24 | 25 | ### Build a JAR file 26 | 27 | Compile your plugin project to a JAR file: 28 | 29 | If you used `crx init` above to create your project, you can compile a JAR file using: 30 | 31 | ```sh 32 | npm run build:jar 33 | ``` 34 | 35 | If you used a different method to create your project, use this instead: 36 | 37 | ```sh 38 | crx build -o ./dist/my-plugin.jar 39 | ``` 40 | -------------------------------------------------------------------------------- /cmd/cmd_build.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | 6 | "github.com/customrealms/cli/internal/build" 7 | "github.com/customrealms/cli/internal/project" 8 | ) 9 | 10 | type BuildCmd struct { 11 | ProjectDir string `name:"project" short:"p" usage:"plugin project directory" optional:""` 12 | McVersion string `name:"mc" usage:"Minecraft version number target" optional:""` 13 | TemplateJarFile string `name:"jar" short:"t" usage:"template JAR file" optional:""` 14 | OutputFile string `name:"output" short:"o" usage:"output JAR file path"` 15 | } 16 | 17 | func (c *BuildCmd) Run() error { 18 | // Root context for the CLI 19 | ctx, cancel := rootContext() 20 | defer cancel() 21 | 22 | // Default to the current working directory 23 | if c.ProjectDir == "" { 24 | c.ProjectDir, _ = os.Getwd() 25 | } 26 | 27 | // Get the Minecraft version 28 | minecraftVersion := mustMinecraftVersion(ctx, c.McVersion) 29 | 30 | // Create the JAR template to build with 31 | var jarTemplate build.JarTemplate 32 | if len(c.TemplateJarFile) > 0 { 33 | jarTemplate = &build.FileJarTemplate{ 34 | Filename: c.TemplateJarFile, 35 | } 36 | } else { 37 | jarTemplate = &build.GitHubJarTemplate{ 38 | MinecraftVersion: minecraftVersion, 39 | } 40 | } 41 | 42 | // Create the project 43 | crProject := project.New(c.ProjectDir) 44 | 45 | // Create the build action 46 | buildAction := build.BuildAction{ 47 | Project: crProject, 48 | JarTemplate: jarTemplate, 49 | MinecraftVersion: minecraftVersion, 50 | OutputFile: c.OutputFile, 51 | } 52 | return buildAction.Run(ctx) 53 | } 54 | -------------------------------------------------------------------------------- /cmd/cmd_init.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "path/filepath" 6 | 7 | "github.com/customrealms/cli/internal/initialize" 8 | ) 9 | 10 | type InitCmd struct { 11 | ProjectDir string `name:"project" short:"p" usage:"plugin project directory" optional:""` 12 | } 13 | 14 | func (c *InitCmd) Run() error { 15 | // Root context for the CLI 16 | ctx, cancel := rootContext() 17 | defer cancel() 18 | 19 | // Default to the current working directory 20 | if c.ProjectDir == "" { 21 | c.ProjectDir, _ = os.Getwd() 22 | } 23 | 24 | // Create the init runner 25 | initAction := initialize.InitAction{ 26 | Name: filepath.Base(c.ProjectDir), 27 | Dir: c.ProjectDir, 28 | Template: nil, 29 | } 30 | return initAction.Run(ctx) 31 | } 32 | -------------------------------------------------------------------------------- /cmd/cmd_run.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "log" 6 | "os" 7 | "path/filepath" 8 | 9 | "github.com/customrealms/cli/internal/build" 10 | "github.com/customrealms/cli/internal/project" 11 | "github.com/customrealms/cli/internal/serve" 12 | "github.com/customrealms/cli/internal/server" 13 | "github.com/fsnotify/fsnotify" 14 | "golang.org/x/sync/errgroup" 15 | ) 16 | 17 | type RunCmd struct { 18 | ProjectDir string `name:"project" short:"p" usage:"plugin project directory" optional:""` 19 | McVersion string `name:"mc" usage:"Minecraft version number target" optional:""` 20 | TemplateJarFile string `name:"jar" short:"t" usage:"template JAR file" optional:""` 21 | } 22 | 23 | func (c *RunCmd) Run() error { 24 | // Root context for the CLI 25 | ctx, cancel := rootContext() 26 | defer cancel() 27 | 28 | // Default to the current working directory 29 | if c.ProjectDir == "" { 30 | c.ProjectDir, _ = os.Getwd() 31 | } 32 | 33 | // Get the Minecraft version 34 | minecraftVersion := mustMinecraftVersion(ctx, c.McVersion) 35 | 36 | // Generate a temp filename for the plugin JAR file 37 | ofile, _ := os.CreateTemp("", "cr-jar-output-*.jar") 38 | ofile.Close() 39 | outputFile := ofile.Name() 40 | defer os.Remove(outputFile) 41 | 42 | // Create the JAR template to build with 43 | var jarTemplate build.JarTemplate 44 | if len(c.TemplateJarFile) > 0 { 45 | jarTemplate = &build.FileJarTemplate{ 46 | Filename: c.TemplateJarFile, 47 | } 48 | } else { 49 | jarTemplate = &build.GitHubJarTemplate{ 50 | MinecraftVersion: minecraftVersion, 51 | } 52 | } 53 | 54 | // Create the project 55 | crProject := project.New(c.ProjectDir) 56 | 57 | // Create the build action 58 | buildAction := build.BuildAction{ 59 | Project: crProject, 60 | JarTemplate: jarTemplate, 61 | MinecraftVersion: minecraftVersion, 62 | OutputFile: outputFile, 63 | } 64 | 65 | // Run the build action 66 | if err := buildAction.Run(ctx); err != nil { 67 | return err 68 | } 69 | 70 | // Create a fetcher for the Minecraft server JAR file that caches the files locally 71 | serverJarFetcher, err := server.NewCachedFetcher(&server.HttpFetcher{}) 72 | if err != nil { 73 | return err 74 | } 75 | 76 | eg, ctx := errgroup.WithContext(ctx) 77 | 78 | chanPluginUpdated := make(chan struct{}) 79 | chanServerStopped := make(chan struct{}) 80 | eg.Go(func() error { 81 | // Create new watcher. 82 | watcher, err := fsnotify.NewWatcher() 83 | if err != nil { 84 | return err 85 | } 86 | defer watcher.Close() 87 | 88 | // Start listening for events. 89 | go func() { 90 | for { 91 | select { 92 | case event, ok := <-watcher.Events: 93 | if !ok { 94 | return 95 | } 96 | if event.Has(fsnotify.Write) { 97 | // Rebuild the plugin JAR file 98 | if err := buildAction.Run(ctx); err != nil { 99 | log.Println("Error: ", err) 100 | } else { 101 | select { 102 | case chanPluginUpdated <- struct{}{}: 103 | case <-ctx.Done(): 104 | return 105 | } 106 | } 107 | } 108 | case err, ok := <-watcher.Errors: 109 | if !ok { 110 | return 111 | } 112 | log.Println("error:", err) 113 | case <-ctx.Done(): 114 | return 115 | case <-chanServerStopped: 116 | return 117 | } 118 | } 119 | }() 120 | 121 | // Add the project directory and src directory to the watcher 122 | if err := errors.Join( 123 | watcher.Add(c.ProjectDir), 124 | watcher.Add(filepath.Join(c.ProjectDir, "src")), 125 | ); err != nil { 126 | return err 127 | } 128 | 129 | // Block until the server is stopped 130 | select { 131 | case <-ctx.Done(): 132 | return ctx.Err() 133 | case <-chanServerStopped: 134 | return nil 135 | } 136 | }) 137 | eg.Go(func() error { 138 | defer close(chanServerStopped) 139 | 140 | // Create the serve runner 141 | serveAction := serve.ServeAction{ 142 | MinecraftVersion: minecraftVersion, 143 | PluginJarPath: outputFile, 144 | ServerJarFetcher: serverJarFetcher, 145 | } 146 | return serveAction.Run(ctx, chanPluginUpdated) 147 | }) 148 | return eg.Wait() 149 | } 150 | -------------------------------------------------------------------------------- /cmd/cmd_version.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | type VersionCmd struct{} 8 | 9 | func (c *VersionCmd) Run() error { 10 | fmt.Printf("@customrealms/cli (crx) v%s\n", version) 11 | return nil 12 | } 13 | -------------------------------------------------------------------------------- /cmd/cmd_yml.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/customrealms/cli/internal/build" 8 | "github.com/customrealms/cli/internal/project" 9 | "gopkg.in/yaml.v3" 10 | ) 11 | 12 | type YmlCmd struct { 13 | ProjectDir string `name:"project" short:"p" usage:"plugin project directory" optional:""` 14 | McVersion string `name:"mc" usage:"Minecraft version number target" optional:""` 15 | } 16 | 17 | func (c *YmlCmd) Run() error { 18 | // Root context for the CLI 19 | ctx, cancel := rootContext() 20 | defer cancel() 21 | 22 | // Default to the current working directory 23 | if c.ProjectDir == "" { 24 | c.ProjectDir, _ = os.Getwd() 25 | } 26 | 27 | // Get the Minecraft version 28 | minecraftVersion := mustMinecraftVersion(ctx, c.McVersion) 29 | 30 | // Create the project 31 | crProject := project.New(c.ProjectDir) 32 | 33 | // Generate the plugin.yml file 34 | pluginYML, err := build.GeneratePluginYML(crProject, minecraftVersion) 35 | if err != nil { 36 | return fmt.Errorf("generating plugin.yml: %w", err) 37 | } 38 | 39 | // Encode it to stdout 40 | enc := yaml.NewEncoder(os.Stdout) 41 | enc.SetIndent(2) 42 | if err := enc.Encode(pluginYML); err != nil { 43 | return fmt.Errorf("encoding plugin.yml: %w", err) 44 | } 45 | return nil 46 | } 47 | -------------------------------------------------------------------------------- /cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "os" 7 | "os/signal" 8 | "syscall" 9 | 10 | "github.com/alecthomas/kong" 11 | "github.com/customrealms/cli/internal/minecraft" 12 | ) 13 | 14 | var ( 15 | version = "dev" 16 | // commit = "none" 17 | // date = "unknown" 18 | ) 19 | 20 | var cli struct { 21 | VersionCmd VersionCmd `cmd:"" name:"version" help:"Show the version of the CLI."` 22 | InitCmd InitCmd `cmd:"" name:"init" help:"Initialize a new plugin project."` 23 | BuildCmd BuildCmd `cmd:"" name:"build" help:"Build the plugin JAR file."` 24 | RunCmd RunCmd `cmd:"" name:"run" help:"Build and serve the plugin in a Minecraft server."` 25 | YmlCmd YmlCmd `cmd:"" name:"yml" help:"Generate the plugin.yml file."` 26 | } 27 | 28 | func rootContext() (context.Context, context.CancelFunc) { 29 | ctx := context.Background() 30 | return signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM) 31 | } 32 | 33 | func main() { 34 | ctx := kong.Parse(&cli) 35 | err := ctx.Run() 36 | ctx.FatalIfErrorf(err) 37 | } 38 | 39 | // mustMinecraftVersion takes a user-supplied Minecraft version string and resolves the corresponding minecraft.Version 40 | // instance. If nothing can be found, it exits the process 41 | func mustMinecraftVersion(ctx context.Context, versionString string) minecraft.Version { 42 | if len(versionString) == 0 { 43 | versionString = "1.20.6" 44 | } 45 | minecraftVersion, err := minecraft.LookupVersion(ctx, versionString) 46 | if err != nil { 47 | fmt.Println("Failed to resolve the Minecraft version: ", err) 48 | os.Exit(1) 49 | } 50 | return minecraftVersion 51 | } 52 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/customrealms/cli 2 | 3 | go 1.22 4 | 5 | require ( 6 | github.com/alecthomas/kong v0.9.0 7 | github.com/fsnotify/fsnotify v1.7.0 8 | github.com/stretchr/testify v1.9.0 9 | golang.org/x/sync v0.7.0 10 | gopkg.in/yaml.v3 v3.0.1 11 | ) 12 | 13 | require ( 14 | github.com/davecgh/go-spew v1.1.1 // indirect 15 | github.com/pmezard/go-difflib v1.0.0 // indirect 16 | golang.org/x/sys v0.4.0 // indirect 17 | ) 18 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/alecthomas/assert/v2 v2.6.0 h1:o3WJwILtexrEUk3cUVal3oiQY2tfgr/FHWiz/v2n4FU= 2 | github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= 3 | github.com/alecthomas/kong v0.9.0 h1:G5diXxc85KvoV2f0ZRVuMsi45IrBgx9zDNGNj165aPA= 4 | github.com/alecthomas/kong v0.9.0/go.mod h1:Y47y5gKfHp1hDc7CH7OeXgLIpp+Q2m1Ni0L5s3bI8Os= 5 | github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= 6 | github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= 7 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 8 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 9 | github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= 10 | github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= 11 | github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= 12 | github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= 13 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 14 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 15 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 16 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 17 | golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= 18 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 19 | golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= 20 | golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 21 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 22 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 23 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 24 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 25 | -------------------------------------------------------------------------------- /internal/build/build.go: -------------------------------------------------------------------------------- 1 | package build 2 | 3 | import ( 4 | "context" 5 | _ "embed" 6 | "fmt" 7 | "math/rand" 8 | "os" 9 | "path/filepath" 10 | "strings" 11 | "time" 12 | 13 | "github.com/customrealms/cli/internal/minecraft" 14 | "github.com/customrealms/cli/internal/project" 15 | ) 16 | 17 | //go:embed config/webpack.config.js 18 | var webpackConfig string 19 | 20 | type BuildAction struct { 21 | Project project.Project 22 | JarTemplate JarTemplate 23 | MinecraftVersion minecraft.Version 24 | OutputFile string 25 | } 26 | 27 | func (a *BuildAction) Run(ctx context.Context) error { 28 | // Create the temp directory for the code output from Webpack. 29 | // The code will be put into "bundle.js" in that directory 30 | webpackOutputDir := filepath.Join( 31 | os.TempDir(), 32 | fmt.Sprintf("cr-build-%d-%d", time.Now().Unix(), rand.Uint32()), 33 | ) 34 | if err := os.MkdirAll(webpackOutputDir, 0777); err != nil { 35 | return fmt.Errorf("creating webpack output dir: %w", err) 36 | } 37 | defer os.RemoveAll(webpackOutputDir) 38 | 39 | // Write the webpack configuration file temporarily 40 | webpackConfigFile := filepath.Join(webpackOutputDir, "webpack.config.js") 41 | if err := os.WriteFile(webpackConfigFile, []byte(webpackConfig), 0777); err != nil { 42 | return fmt.Errorf("write webpack config file: %w", err) 43 | } 44 | 45 | // Parse the plugin.yml file 46 | pluginYML, err := a.Project.PluginYML() 47 | if err != nil { 48 | return fmt.Errorf("parse plugin.yml: %w", err) 49 | } 50 | 51 | fmt.Println("============================================================") 52 | fmt.Println("Bundling JavaScript code using Webpack") 53 | fmt.Println("============================================================") 54 | 55 | // Determine the entrypoint for the TypeScript project 56 | var entrypoint string 57 | if pluginYML != nil && strings.HasSuffix(pluginYML.Main, ".ts") { 58 | entrypoint = pluginYML.Main 59 | } else { 60 | entrypoint = "./src/main.ts" 61 | } 62 | 63 | // Build the local directory 64 | err = a.Project.Exec(ctx, "npx", "webpack-cli", 65 | "--mode=production", 66 | "-o", webpackOutputDir, 67 | "-c", webpackConfigFile, 68 | "--entry", entrypoint, 69 | ) 70 | if err != nil { 71 | return fmt.Errorf("run webpack: %w", err) 72 | } 73 | 74 | fmt.Println() 75 | 76 | // Package the jar file 77 | ja := JarAction{ 78 | Project: a.Project, 79 | JarTemplate: a.JarTemplate, 80 | MinecraftVersion: a.MinecraftVersion, 81 | BundleFile: filepath.Join(webpackOutputDir, "bundle.js"), 82 | OutputFile: a.OutputFile, 83 | } 84 | return ja.Run(ctx) 85 | } 86 | -------------------------------------------------------------------------------- /internal/build/config/webpack.config.js: -------------------------------------------------------------------------------- 1 | // const path = require('path'); 2 | 3 | module.exports = { 4 | module: { 5 | rules: [ 6 | { 7 | test: /\.(?:js|ts)$/, 8 | exclude: /node_modules/, 9 | use: [ 10 | { 11 | loader: 'babel-loader', 12 | options: { 13 | targets: { 14 | browsers: ["ie 7"] 15 | }, 16 | presets: [ 17 | "@babel/preset-env", 18 | ], 19 | }, 20 | }, 21 | 'ts-loader', 22 | ], 23 | }, 24 | ], 25 | }, 26 | resolve: { 27 | extensions: ['.ts', '.js'], 28 | }, 29 | output: { 30 | filename: 'bundle.js', 31 | environment: { 32 | arrowFunction: false, 33 | }, 34 | }, 35 | }; -------------------------------------------------------------------------------- /internal/build/jar.go: -------------------------------------------------------------------------------- 1 | package build 2 | 3 | import ( 4 | "archive/zip" 5 | "bytes" 6 | "context" 7 | "fmt" 8 | "io" 9 | "os" 10 | "path/filepath" 11 | 12 | "github.com/customrealms/cli/internal/minecraft" 13 | "github.com/customrealms/cli/internal/pluginyml" 14 | "github.com/customrealms/cli/internal/project" 15 | "gopkg.in/yaml.v3" 16 | ) 17 | 18 | type JarAction struct { 19 | Project project.Project 20 | JarTemplate JarTemplate 21 | MinecraftVersion minecraft.Version 22 | BundleFile string 23 | OutputFile string 24 | } 25 | 26 | func (a *JarAction) Run(ctx context.Context) error { 27 | fmt.Println("============================================================") 28 | fmt.Println("Downloading JAR plugin runtime") 29 | fmt.Println("============================================================") 30 | 31 | // Get the reader of the Jar file 32 | jarReader, err := a.JarTemplate.Jar() 33 | if err != nil { 34 | return err 35 | } 36 | defer jarReader.Close() 37 | 38 | // Copy the jar file to a buffer 39 | var jarTemplateBuf bytes.Buffer 40 | if _, err := io.Copy(&jarTemplateBuf, jarReader); err != nil { 41 | return err 42 | } 43 | 44 | fmt.Println(" -> DONE") 45 | fmt.Println() 46 | 47 | // Make sure the directory above the output file exists 48 | if err := os.MkdirAll(filepath.Dir(a.OutputFile), 0777); err != nil { 49 | return err 50 | } 51 | 52 | // Open the output file for the final JAR 53 | file, err := os.Create(a.OutputFile) 54 | if err != nil { 55 | return err 56 | } 57 | defer file.Close() 58 | 59 | // Create a reader for the plugin source code 60 | pluginCode, err := os.Open(a.BundleFile) 61 | if err != nil { 62 | return err 63 | } 64 | defer pluginCode.Close() 65 | 66 | // Generate the plugin.yml file for the project 67 | pluginYML, err := GeneratePluginYML(a.Project, a.MinecraftVersion) 68 | if err != nil { 69 | return fmt.Errorf("generating plugin.yml: %w", err) 70 | } 71 | 72 | // Produce the final JAR file 73 | if err := WriteJarFile( 74 | file, 75 | jarTemplateBuf.Bytes(), 76 | pluginCode, 77 | pluginYML, 78 | ); err != nil { 79 | return err 80 | } 81 | 82 | fmt.Println("Wrote JAR file to: ", a.OutputFile) 83 | 84 | return nil 85 | 86 | } 87 | 88 | func WriteJarFile( 89 | writer io.Writer, 90 | templateJarData []byte, 91 | pluginSourceCode io.Reader, 92 | pluginYML *pluginyml.Plugin, 93 | ) error { 94 | 95 | fmt.Println("============================================================") 96 | fmt.Println("Generating final JAR file for your plugin") 97 | fmt.Println("============================================================") 98 | 99 | // Create the ZIP writer 100 | zw := zip.NewWriter(writer) 101 | defer zw.Close() 102 | 103 | // Create the ZIP reader from the base YML 104 | templateJarReader := bytes.NewReader(templateJarData) 105 | zr, err := zip.NewReader(templateJarReader, int64(len(templateJarData))) 106 | if err != nil { 107 | return err 108 | } 109 | 110 | fmt.Println(" -> Copying template files to new JAR file") 111 | 112 | // Copy all the files back to the jar file 113 | for _, f := range zr.File { 114 | 115 | // Skip some files 116 | if f.Name == "plugin.js" || f.Name == "plugin.yml" { 117 | continue 118 | } 119 | 120 | // Copy the rest 121 | if err := zw.Copy(f); err != nil { 122 | return err 123 | } 124 | 125 | } 126 | 127 | fmt.Println(" -> Writing bundle JS code to JAR file") 128 | 129 | // Write the plugin code to the jar 130 | codeFile, err := zw.Create("plugin.js") 131 | if err != nil { 132 | return err 133 | } 134 | if _, err := io.Copy(codeFile, pluginSourceCode); err != nil { 135 | return err 136 | } 137 | 138 | fmt.Println(" -> Writing plugin.yml file to JAR file") 139 | 140 | // Write the plugin YML file to the jar 141 | ymlFile, err := zw.Create("plugin.yml") 142 | if err != nil { 143 | return err 144 | } 145 | enc := yaml.NewEncoder(ymlFile) 146 | enc.SetIndent(2) 147 | if err := enc.Encode(pluginYML); err != nil { 148 | return fmt.Errorf("encoding plugin.yml: %w", err) 149 | } 150 | 151 | fmt.Println(" -> DONE") 152 | fmt.Println() 153 | 154 | // We're done, no errors 155 | return nil 156 | 157 | } 158 | -------------------------------------------------------------------------------- /internal/build/jar_template.go: -------------------------------------------------------------------------------- 1 | package build 2 | 3 | import ( 4 | "io" 5 | ) 6 | 7 | type JarTemplate interface { 8 | Jar() (io.ReadCloser, error) 9 | } 10 | -------------------------------------------------------------------------------- /internal/build/jar_template_file.go: -------------------------------------------------------------------------------- 1 | package build 2 | 3 | import ( 4 | "io" 5 | "os" 6 | ) 7 | 8 | type FileJarTemplate struct { 9 | Filename string 10 | } 11 | 12 | func (t *FileJarTemplate) Jar() (io.ReadCloser, error) { 13 | return os.Open(t.Filename) 14 | } 15 | -------------------------------------------------------------------------------- /internal/build/jar_template_github.go: -------------------------------------------------------------------------------- 1 | package build 2 | 3 | import ( 4 | "fmt" 5 | "io" 6 | "net/http" 7 | 8 | "github.com/customrealms/cli/internal/minecraft" 9 | ) 10 | 11 | type GitHubJarTemplate struct { 12 | MinecraftVersion minecraft.Version 13 | } 14 | 15 | func (t *GitHubJarTemplate) Jar() (io.ReadCloser, error) { 16 | 17 | // Get the JAR url 18 | jarUrl := t.MinecraftVersion.PluginJarUrl() 19 | 20 | // Download the JAR file 21 | fmt.Printf(" -> %s\n", jarUrl) 22 | res, err := http.Get(jarUrl) 23 | if err != nil { 24 | return nil, err 25 | } 26 | 27 | // Return the response body 28 | return res.Body, nil 29 | 30 | } 31 | -------------------------------------------------------------------------------- /internal/build/pluginyml.go: -------------------------------------------------------------------------------- 1 | package build 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "log" 7 | 8 | "github.com/customrealms/cli/internal/minecraft" 9 | "github.com/customrealms/cli/internal/pluginyml" 10 | "github.com/customrealms/cli/internal/project" 11 | ) 12 | 13 | const JarMainClass = "io.customrealms.MainPlugin" 14 | 15 | func GeneratePluginYML(project project.Project, version minecraft.Version) (*pluginyml.Plugin, error) { 16 | // Read the package.json file 17 | packageJSON, err := project.PackageJSON() 18 | if err != nil { 19 | return nil, fmt.Errorf("getting package.json: %w", err) 20 | } 21 | 22 | // Read the plugin.yml file 23 | plugin, err := project.PluginYML() 24 | if err != nil { 25 | return nil, fmt.Errorf("getting plugin.yml: %w", err) 26 | } 27 | 28 | // If plugin.yml and package.json are both missing, it's an error 29 | if packageJSON == nil && plugin == nil { 30 | return nil, errors.New("missing both package.json and plugin.yml") 31 | } 32 | 33 | // If there is no plugin.yml file present, create one 34 | if plugin == nil { 35 | plugin = &pluginyml.Plugin{} 36 | plugin.Name = packageJSON.Name 37 | } 38 | 39 | // Set the main Java class for the plugin 40 | plugin.Main = JarMainClass 41 | 42 | // Set the Bukkit API version for the plugin 43 | if version != nil { 44 | apiVersion := version.ApiVersion() 45 | plugin.ApiVersion = &apiVersion 46 | } 47 | 48 | // If there is a package.json file 49 | if packageJSON != nil { 50 | // Update the version if it's missing 51 | if plugin.Version == "" && packageJSON.Version != "" { 52 | plugin.Version = packageJSON.Version 53 | } else if plugin.Version == "" && packageJSON.Version == "" { 54 | log.Println("No version found in plugin.yml or package.json. Consider adding a version to package.json.") 55 | log.Println("Using version '0.0.0' as a fallback.") 56 | plugin.Version = "0.0.0" 57 | } else if plugin.Version != packageJSON.Version { 58 | log.Println("Version mismatch between plugin.yml and package.json. Consider removing `version` from plugin.yml.") 59 | log.Printf("Using version '%s' from plugin.yml", plugin.Version) 60 | } 61 | } 62 | 63 | // Return the plugin yml 64 | return plugin, nil 65 | } 66 | -------------------------------------------------------------------------------- /internal/initialize/initialize.go: -------------------------------------------------------------------------------- 1 | package initialize 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "os" 7 | "os/exec" 8 | 9 | "github.com/customrealms/cli/internal/initialize/template" 10 | ) 11 | 12 | type InitAction struct { 13 | Name string 14 | Dir string 15 | Template template.Template 16 | } 17 | 18 | func (a *InitAction) Run(ctx context.Context) error { 19 | 20 | // Check if NPM is installed on the machine 21 | if _, err := exec.LookPath("npm"); err != nil { 22 | fmt.Println("Couldn't find 'npm' command on your machine. Make sure NodeJS is installed.") 23 | fmt.Println("Visit https://nodejs.org and download the most recent version.") 24 | return nil 25 | } 26 | 27 | // If the template is nil, use the default template 28 | if a.Template == nil { 29 | tmpl, err := template.NewFromGitHub("customrealms", "cli-default-template", "master") 30 | if err != nil { 31 | return nil 32 | } 33 | a.Template = tmpl 34 | } 35 | 36 | // Install the template in the directory 37 | err := template.Install( 38 | a.Template, 39 | a.Dir, 40 | &template.Options{ 41 | Name: a.Name, 42 | }, 43 | ) 44 | if err != nil { 45 | return err 46 | } 47 | 48 | // Run npm install 49 | cmd := exec.CommandContext(ctx, "npm", "install") 50 | cmd.Dir = a.Dir 51 | cmd.Stdout = os.Stdout 52 | cmd.Stderr = os.Stderr 53 | if err := cmd.Run(); err != nil { 54 | return err 55 | } 56 | 57 | // If Git is installed on the machine 58 | if _, err := exec.LookPath("git"); err == nil { 59 | 60 | // Initialize the git repo 61 | cmd = exec.CommandContext(ctx, "git", "init") 62 | cmd.Dir = a.Dir 63 | cmd.Stdout = os.Stdout 64 | cmd.Stderr = os.Stderr 65 | if err := cmd.Run(); err != nil { 66 | return err 67 | } 68 | 69 | } 70 | 71 | return nil 72 | } 73 | -------------------------------------------------------------------------------- /internal/initialize/template/installer.go: -------------------------------------------------------------------------------- 1 | package template 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "fmt" 7 | "io" 8 | "os" 9 | "path" 10 | "strings" 11 | tmpl "text/template" 12 | ) 13 | 14 | const ManifestFilename = "manifest.json" 15 | 16 | type Options struct { 17 | Name string 18 | } 19 | 20 | type Manifest struct { 21 | Files map[string]bool `json:"files"` 22 | Rename map[string]string `json:"rename"` 23 | } 24 | 25 | func readManifest(tmpl Template) (*Manifest, error) { 26 | 27 | // Read the manifest file 28 | manifestFile, err := tmpl.Open(ManifestFilename) 29 | if err != nil { 30 | return nil, fmt.Errorf("failed to open %s in template: %s", ManifestFilename, err) 31 | } 32 | defer manifestFile.Close() 33 | manifestBytes, err := io.ReadAll(manifestFile) 34 | if err != nil { 35 | return nil, fmt.Errorf("failed to read %s in template: %s", ManifestFilename, err) 36 | } 37 | 38 | // Parse the manifest file as a manifest type 39 | var manifest Manifest 40 | if err := json.Unmarshal(manifestBytes, &manifest); err != nil { 41 | return nil, fmt.Errorf("invalid %s format: %s", ManifestFilename, err) 42 | } 43 | 44 | // Return the manifest object 45 | return &manifest, nil 46 | 47 | } 48 | 49 | func isDirEmpty(dir string) (bool, error) { 50 | 51 | // Check for files in the directory 52 | entries, err := os.ReadDir(dir) 53 | if err != nil && !os.IsNotExist(err) { 54 | return false, err 55 | } 56 | 57 | // Loop through to find non-hidden files 58 | for _, entry := range entries { 59 | if !strings.HasPrefix(entry.Name(), ".") { 60 | return false, nil 61 | } 62 | } 63 | 64 | // The directory is empty 65 | return true, nil 66 | 67 | } 68 | 69 | func setupDir(dir string) error { 70 | 71 | // Perform a stat on the directory to check its details 72 | stat, err := os.Stat(dir) 73 | if err != nil && !errors.Is(err, os.ErrNotExist) { 74 | return err 75 | } 76 | 77 | // If the directory doesn't exist, create it 78 | if errors.Is(err, os.ErrNotExist) { 79 | if err := os.MkdirAll(dir, 0777); err != nil { 80 | return fmt.Errorf("failed to create project directory: %s", err) 81 | } 82 | return nil 83 | } 84 | 85 | // If the directory exists, but is a file 86 | if !stat.IsDir() { 87 | return fmt.Errorf("project directory already exists, but is a file") 88 | } 89 | 90 | // If the project directory is not empty 91 | empty, err := isDirEmpty(dir) 92 | if err != nil { 93 | return err 94 | } 95 | if !empty { 96 | return fmt.Errorf("project directory is not empty") 97 | } 98 | 99 | // No error if we get here 100 | return nil 101 | 102 | } 103 | 104 | func Install(tmpl Template, dir string, options *Options) error { 105 | 106 | // Read the manifest 107 | manifest, err := readManifest(tmpl) 108 | if err != nil { 109 | return err 110 | } 111 | 112 | // Create the project directory 113 | if err := setupDir(dir); err != nil { 114 | return err 115 | } 116 | 117 | // Populate the project directory using the manifest 118 | if err := populateDir(tmpl, dir, manifest, options); err != nil { 119 | return err 120 | } 121 | 122 | // Return without error 123 | return nil 124 | 125 | } 126 | 127 | func populateDir( 128 | tmpl Template, 129 | dir string, 130 | manifest *Manifest, 131 | options *Options, 132 | ) error { 133 | 134 | // Loop through the files in the manifest 135 | for filename, parse := range manifest.Files { 136 | if err := populateDirWithFile(tmpl, filename, parse, dir, manifest, options); err != nil { 137 | return err 138 | } 139 | } 140 | 141 | // No errors 142 | return nil 143 | 144 | } 145 | 146 | func populateDirWithFile( 147 | tmpl Template, 148 | filename string, 149 | parse bool, 150 | dir string, 151 | manifest *Manifest, 152 | options *Options, 153 | ) error { 154 | 155 | // Read the file from the template 156 | from, err := tmpl.Open(filename) 157 | if err != nil { 158 | return err 159 | } 160 | defer from.Close() 161 | 162 | // Determine the new name for the file 163 | to := filename 164 | if manifest.Rename != nil { 165 | if renameTo, ok := manifest.Rename[filename]; ok { 166 | to = renameTo 167 | } 168 | } 169 | 170 | // Make sure the directory exists for the file 171 | toDir := path.Join(dir, path.Dir(to)) 172 | if err := os.MkdirAll(toDir, 0777); err != nil { 173 | return fmt.Errorf("failed to create %q from template: %s", toDir, err) 174 | } 175 | 176 | // Copy the file contents 177 | toFile, err := os.Create(path.Join(dir, to)) 178 | if err != nil { 179 | return fmt.Errorf("failed to create %q from template: %s", to, err) 180 | } 181 | defer toFile.Close() 182 | 183 | // Copy the contents from one to the other 184 | if parse { 185 | err = copyAndModifyTemplateFile(toFile, from, options) 186 | } else { 187 | _, err = io.Copy(toFile, from) 188 | } 189 | if err != nil { 190 | return err 191 | } 192 | 193 | // No errors with this file 194 | return nil 195 | 196 | } 197 | 198 | func copyAndModifyTemplateFile(to io.Writer, from io.Reader, options *Options) error { 199 | 200 | // Read the entire file to a byte slice 201 | fromBytes, err := io.ReadAll(from) 202 | if err != nil { 203 | return err 204 | } 205 | 206 | // Create template 207 | t, err := tmpl.New("").Parse(string(fromBytes)) 208 | if err != nil { 209 | return err 210 | } 211 | 212 | // Execute the template into the writer 213 | return t.Execute(to, options) 214 | 215 | } 216 | -------------------------------------------------------------------------------- /internal/initialize/template/template.go: -------------------------------------------------------------------------------- 1 | package template 2 | 3 | import ( 4 | "io" 5 | "io/fs" 6 | "path" 7 | ) 8 | 9 | type Template interface { 10 | Open(name string) (io.ReadCloser, error) 11 | } 12 | 13 | type templateFS struct { 14 | Dir string 15 | FS fs.FS 16 | } 17 | 18 | func (t *templateFS) Open(name string) (io.ReadCloser, error) { 19 | return t.FS.Open(path.Join(t.Dir, name)) 20 | } 21 | 22 | func NewFromFS(fileSystem fs.FS) Template { 23 | return &templateFS{FS: fileSystem} 24 | } 25 | 26 | func NewFromFSDir(fileSystem fs.FS, dir string) Template { 27 | return &templateFS{ 28 | Dir: dir, 29 | FS: fileSystem, 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /internal/initialize/template/template_github.go: -------------------------------------------------------------------------------- 1 | package template 2 | 3 | import ( 4 | "archive/zip" 5 | "bytes" 6 | "fmt" 7 | "io" 8 | "net/http" 9 | ) 10 | 11 | func githubUrl(org, repo, branch string) string { 12 | return fmt.Sprintf("https://github.com/%s/%s/archive/refs/heads/%s.zip", org, repo, branch) 13 | } 14 | 15 | func downloadUrl(url string) (io.ReadCloser, error) { 16 | res, err := http.Get(url) 17 | if err != nil { 18 | return nil, err 19 | } 20 | return res.Body, nil 21 | } 22 | 23 | func NewFromGitHub(org, repo, branch string) (Template, error) { 24 | 25 | // Get the github url 26 | url := githubUrl(org, repo, branch) 27 | 28 | // Download the zip file 29 | body, err := downloadUrl(url) 30 | if err != nil { 31 | return nil, err 32 | } 33 | defer body.Close() 34 | 35 | // Read the full body to bytes 36 | zipBytes, err := io.ReadAll(body) 37 | if err != nil { 38 | return nil, err 39 | } 40 | 41 | // Read the bytes 42 | zipReader, err := zip.NewReader(bytes.NewReader(zipBytes), int64(len(zipBytes))) 43 | if err != nil { 44 | return nil, err 45 | } 46 | 47 | // Define the base directory in the zip file 48 | baseDir := fmt.Sprintf("%s-%s", repo, branch) 49 | 50 | // Return the template with the file system 51 | return NewFromFSDir(zipReader, baseDir), nil 52 | 53 | } 54 | -------------------------------------------------------------------------------- /internal/minecraft/version.go: -------------------------------------------------------------------------------- 1 | package minecraft 2 | 3 | type Version interface { 4 | String() string 5 | ApiVersion() string 6 | ServerJarType() string 7 | ServerJarUrl() string 8 | PluginJarUrl() string 9 | } 10 | -------------------------------------------------------------------------------- /internal/minecraft/version_papermc.go: -------------------------------------------------------------------------------- 1 | package minecraft 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | ) 7 | 8 | type paperMcVersion struct { 9 | version string 10 | paperBuild int 11 | } 12 | 13 | func (v *paperMcVersion) String() string { 14 | return v.version 15 | } 16 | 17 | func (v *paperMcVersion) ApiVersion() string { 18 | parts := strings.Split(v.version, ".") 19 | return strings.Join(parts[:2], ".") 20 | } 21 | 22 | func (v *paperMcVersion) ServerJarType() string { 23 | return "paper" 24 | } 25 | 26 | func (v *paperMcVersion) ServerJarUrl() string { 27 | return fmt.Sprintf( 28 | "https://papermc.io/api/v2/projects/paper/versions/%s/builds/%d/downloads/paper-%s-%d.jar", 29 | v.version, 30 | v.paperBuild, 31 | v.version, 32 | v.paperBuild, 33 | ) 34 | } 35 | 36 | func (v *paperMcVersion) PluginJarUrl() string { 37 | return fmt.Sprintf("https://github.com/customrealms/bukkit-runtime/releases/latest/download/bukkit-runtime-%s.jar", v.version) 38 | } 39 | -------------------------------------------------------------------------------- /internal/minecraft/versions.go: -------------------------------------------------------------------------------- 1 | package minecraft 2 | 3 | import ( 4 | "context" 5 | "encoding/json" 6 | "fmt" 7 | "net/http" 8 | ) 9 | 10 | type paperMcBuilds struct { 11 | Builds []paperMcBuild `json:"builds"` 12 | } 13 | 14 | type paperMcBuild struct { 15 | Build int `json:"build"` 16 | Channel string `json:"channel"` 17 | Downloads struct { 18 | Application struct { 19 | Name string `json:"name"` 20 | Sha256 string `json:"sha256"` 21 | } `json:"application"` 22 | } `json:"downloads"` 23 | } 24 | 25 | func LookupVersion(ctx context.Context, versionStr string) (Version, error) { 26 | // Lookup the version from PaperMC 27 | builds, err := downloadJSON[paperMcBuilds](ctx, fmt.Sprintf("https://papermc.io/api/v2/projects/paper/versions/%s/builds", versionStr)) 28 | if err != nil { 29 | return nil, fmt.Errorf("download builds list: %w", err) 30 | } 31 | if builds == nil || len(builds.Builds) == 0 { 32 | return nil, fmt.Errorf("no builds found for version %s", versionStr) 33 | } 34 | 35 | // The last entry is the latest build 36 | build := builds.Builds[len(builds.Builds)-1] 37 | version := &paperMcVersion{versionStr, build.Build} 38 | 39 | // Check that the version has a downloadable plugin JAR 40 | ok, err := checkHttpOK(ctx, version.PluginJarUrl()) 41 | if err != nil { 42 | return nil, fmt.Errorf("check plugin jar url: %w", err) 43 | } 44 | if !ok { 45 | return nil, fmt.Errorf("no customrealms bukkit-runtime found for version %s", versionStr) 46 | } 47 | return version, nil 48 | } 49 | 50 | func downloadJSON[T any](ctx context.Context, url string) (*T, error) { 51 | // Create the HTTP request 52 | req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) 53 | if err != nil { 54 | return nil, fmt.Errorf("create http request: %w", err) 55 | } 56 | 57 | // Send the HTTP request 58 | res, err := http.DefaultClient.Do(req) 59 | if err != nil { 60 | return nil, fmt.Errorf("send http request: %w", err) 61 | } 62 | defer res.Body.Close() 63 | 64 | // Decode the JSON response 65 | var result T 66 | if err := json.NewDecoder(res.Body).Decode(&result); err != nil { 67 | return nil, fmt.Errorf("decode json response: %w", err) 68 | } 69 | return &result, nil 70 | } 71 | 72 | func checkHttpOK(ctx context.Context, url string) (bool, error) { 73 | // Create the HTTP request 74 | req, err := http.NewRequestWithContext(ctx, http.MethodHead, url, nil) 75 | if err != nil { 76 | return false, fmt.Errorf("create http request: %w", err) 77 | } 78 | 79 | // Send the HTTP request 80 | res, err := http.DefaultClient.Do(req) 81 | if err != nil { 82 | return false, fmt.Errorf("send http request: %w", err) 83 | } 84 | defer res.Body.Close() 85 | 86 | // Check the status code 87 | return res.StatusCode == http.StatusOK, nil 88 | } 89 | -------------------------------------------------------------------------------- /internal/pluginyml/pluginyml.go: -------------------------------------------------------------------------------- 1 | package pluginyml 2 | 3 | import ( 4 | "fmt" 5 | 6 | "gopkg.in/yaml.v3" 7 | ) 8 | 9 | type Plugin struct { 10 | // Name is the name of your plugin. 11 | Name string `yaml:"name"` 12 | // Version is the semantic version of the plugin (e.g. '1.4.1'). 13 | Version string `yaml:"version"` 14 | // ApiVersion is the version of the Bukkit API your plugin is built against. 15 | ApiVersion *string `yaml:"api-version,omitempty"` 16 | // Description is a human friendly description of the functionality your plugin provides. 17 | Description *string `yaml:"description,omitempty"` 18 | // Load explicitly states when the plugin should be loaded. if not supplied will default to 'postworld'. 19 | Load *string `yaml:"load,omitempty"` 20 | // Author uniquely identifies who developed this plugin. 21 | Author *string `yaml:"author,omitempty"` 22 | // Authors allows you to list multiple authors, if it is a collaborative project. 23 | Authors []string `yaml:"authors,flow,omitempty"` 24 | // Website is the URL to the plugin's or author's website. 25 | Website *string `yaml:"website,omitempty"` 26 | // Main points to the class that extends JavaPlugin. 27 | Main string `yaml:"main"` 28 | // Prefix is the name to use when logging to console instead of the plugin's name. 29 | Prefix *string `yaml:"prefix,omitempty"` 30 | // SoftDepend is a list of plugins that are required for your plugin to have full functionality. 31 | SoftDepend []string `yaml:"softdepend,flow,omitempty"` 32 | // LoadBefore is a list of plugins that should be loaded after your plugin. 33 | LoadBefore []string `yaml:"loadbefore,flow,omitempty"` 34 | // Libraries is a list of libraries your plugin needs which can be loaded from Maven Central. 35 | Libraries []string `yaml:"libraries,omitempty"` 36 | // Commands is a map of command names to command attributes. 37 | Commands map[string]Command `yaml:"commands,omitempty"` 38 | // Permissions is a map of permission names to permission attributes. 39 | Permissions map[string]Permission `yaml:"permissions,omitempty"` 40 | } 41 | 42 | type Command struct { 43 | // Description is a short description of what the command does. 44 | Description *string `yaml:"description,omitempty"` 45 | // Aliases is a list of alternate command names a user may use. 46 | Aliases []string `yaml:"aliases,flow,omitempty"` 47 | // Permission is the most basic permission node required to use the command. 48 | Permission *string `yaml:"permission,omitempty"` 49 | // PermissionMessage is the message to display to a user when they do not have the required permission. 50 | PermissionMessage *string `yaml:"permission-message,omitempty"` 51 | // Usage is a short description of how to use this command. 52 | Usage *string `yaml:"usage,omitempty"` 53 | } 54 | 55 | type Permission struct { 56 | // Description is a short description of what the permission allows. 57 | Description *string `yaml:"description,omitempty"` 58 | // Default is the default value of the permission. 59 | Default *string `yaml:"default,omitempty"` 60 | // Children allows you to set children for the permission. 61 | Children map[string]PermissionChild `yaml:"children,omitempty"` 62 | } 63 | 64 | type PermissionChild struct { 65 | // Bool is non-nil if the child permission is a boolean. 66 | Bool *bool 67 | // Permission is non-nil if the child permission is a nested permission. 68 | Permission *Permission 69 | } 70 | 71 | func (p PermissionChild) MarshalYAML() (any, error) { 72 | if p.Bool != nil { 73 | return *p.Bool, nil 74 | } 75 | if p.Permission != nil { 76 | return *p.Permission, nil 77 | } 78 | return nil, nil 79 | } 80 | 81 | func (p *PermissionChild) UnmarshalYAML(node *yaml.Node) error { 82 | if node.Tag == "!!bool" { 83 | var b bool 84 | if err := node.Decode(&b); err != nil { 85 | return err 86 | } 87 | p.Bool = &b 88 | return nil 89 | } 90 | if node.Tag == "!!map" { 91 | var perm Permission 92 | if err := node.Decode(&perm); err != nil { 93 | return err 94 | } 95 | p.Permission = &perm 96 | return nil 97 | } 98 | return fmt.Errorf("unsupported type for child permission: %s", node.Tag) 99 | } 100 | -------------------------------------------------------------------------------- /internal/pluginyml/pluginyml_test.go: -------------------------------------------------------------------------------- 1 | package pluginyml_test 2 | 3 | import ( 4 | "embed" 5 | "path" 6 | "testing" 7 | 8 | "github.com/customrealms/cli/internal/pluginyml" 9 | "github.com/stretchr/testify/require" 10 | "gopkg.in/yaml.v3" 11 | ) 12 | 13 | var ( 14 | //go:embed testdata/* 15 | testdataFS embed.FS 16 | ) 17 | 18 | func readTestFile(t *testing.T, filename string) []byte { 19 | t.Helper() 20 | data, err := testdataFS.ReadFile(path.Join("testdata", filename)) 21 | if err != nil { 22 | t.Fatalf("read test file: %v", err) 23 | } 24 | return data 25 | } 26 | 27 | func TestUnmarshalPluginYml(t *testing.T) { 28 | t.Run("plugin-1.yml", func(t *testing.T) { 29 | // Unmarshal the plugin-1.yml file 30 | var plugin pluginyml.Plugin 31 | err := yaml.Unmarshal(readTestFile(t, "plugin-1.yml"), &plugin) 32 | require.NoError(t, err, "unmarshal plugin-1.yml") 33 | 34 | // Check the plugin details 35 | require.Equal(t, "ScrapBukkit", plugin.Name) 36 | require.Equal(t, "1.0.0", plugin.Version) 37 | require.Equal(t, "com.dinnerbone.bukkit.scrap.ScrapBukkit", plugin.Main) 38 | require.NotNil(t, plugin.Description) 39 | require.Equal(t, "Miscellaneous administrative commands for Bukkit. This plugin is one of the default plugins shipped with Bukkit.\n", *plugin.Description) 40 | 41 | // No commands in this plugin 42 | require.Nil(t, plugin.Commands) 43 | require.Len(t, plugin.Commands, 0) 44 | 45 | // Check the permissions 46 | require.NotNil(t, plugin.Permissions) 47 | rootPerm := plugin.Permissions["scrapbukkit.*"] 48 | require.NotNil(t, rootPerm) 49 | require.Equal(t, "Gives all permissions for Scrapbukkit", *rootPerm.Description) 50 | require.Equal(t, "op", *rootPerm.Default) 51 | require.Len(t, rootPerm.Children, 8) 52 | 53 | // Check the children permissions (nested permission blocks) 54 | require.NotNil(t, rootPerm.Children["scrapbukkit.remove"].Permission) 55 | require.NotNil(t, rootPerm.Children["scrapbukkit.time"].Permission) 56 | require.NotNil(t, rootPerm.Children["scrapbukkit.tp"].Permission) 57 | require.NotNil(t, rootPerm.Children["scrapbukkit.give"].Permission) 58 | require.NotNil(t, rootPerm.Children["scrapbukkit.clear"].Permission) 59 | 60 | // Check the children permissions (boolean permissions) 61 | require.NotNil(t, rootPerm.Children["scrapbukkit.some.standard.perm"].Bool) 62 | require.NotNil(t, rootPerm.Children["scrapbukkit.some.other.perm"].Bool) 63 | require.NotNil(t, rootPerm.Children["scrapbukkit.some.bad.perm"].Bool) 64 | require.Equal(t, true, *rootPerm.Children["scrapbukkit.some.standard.perm"].Bool) 65 | require.Equal(t, true, *rootPerm.Children["scrapbukkit.some.other.perm"].Bool) 66 | require.Equal(t, false, *rootPerm.Children["scrapbukkit.some.bad.perm"].Bool) 67 | 68 | // Check a nested child permission 69 | child := rootPerm.Children["scrapbukkit.time"].Permission 70 | require.Equal(t, "Allows the player to view and change the time", *child.Description) 71 | require.Len(t, child.Children, 2) 72 | require.Equal(t, "Allows the player to view the time", *child.Children["scrapbukkit.time.view"].Permission.Description) 73 | require.Equal(t, "true", *child.Children["scrapbukkit.time.view"].Permission.Default) 74 | require.Equal(t, "Allows the player to change the time", *child.Children["scrapbukkit.time.change"].Permission.Description) 75 | require.Nil(t, child.Children["scrapbukkit.time.change"].Permission.Default) 76 | 77 | // require.NotNil(t, plugin.Permissions["scrapbukkit.*"].Children["scrapbukkit.remove"].Permission) 78 | // require.Nil(t, plugin.Permissions["scrapbukkit.*"].Children["scrapbukkit.remove"].Bool) 79 | }) 80 | } 81 | -------------------------------------------------------------------------------- /internal/pluginyml/testdata/plugin-1.yml: -------------------------------------------------------------------------------- 1 | name: ScrapBukkit 2 | main: com.dinnerbone.bukkit.scrap.ScrapBukkit 3 | version: 1.0.0 4 | website: http://www.bukkit.org 5 | author: The Bukkit Team 6 | description: > 7 | Miscellaneous administrative commands for Bukkit. 8 | This plugin is one of the default plugins shipped with Bukkit. 9 | # commands: snipped 10 | 11 | permissions: 12 | scrapbukkit.*: 13 | description: Gives all permissions for Scrapbukkit 14 | default: op 15 | children: 16 | scrapbukkit.remove: 17 | description: Allows the player to remove items from anyones inventory 18 | children: 19 | scrapbukkit.remove.self: 20 | description: Allows the player to remove items from their own inventory 21 | scrapbukkit.remove.other: 22 | description: Allows the player to remove items from other peoples inventory 23 | 24 | scrapbukkit.time: 25 | description: Allows the player to view and change the time 26 | children: 27 | scrapbukkit.time.view: 28 | description: Allows the player to view the time 29 | default: true 30 | scrapbukkit.time.change: 31 | description: Allows the player to change the time 32 | 33 | scrapbukkit.tp: 34 | description: Allows the player to teleport anyone to anyone else 35 | children: 36 | scrapbukkit.tp.here: 37 | description: Allows the player to teleport other players to themselves 38 | scrapbukkit.tp.self: 39 | description: Allows the player to teleport themselves to another player 40 | scrapbukkit.tp.other: 41 | description: Allows the player to teleport anyone to another player 42 | 43 | scrapbukkit.give: 44 | description: Allows the player to give items 45 | children: 46 | scrapbukkit.give.self: 47 | description: Allows the player to give themselves items 48 | scrapbukkit.give.other: 49 | description: Allows the player to give other players items 50 | 51 | scrapbukkit.clear: 52 | description: Allows the player to clear inventories 53 | children: 54 | scrapbukkit.clear.self: 55 | description: Allows the player to clear their own inventory 56 | scrapbukkit.clear.other: 57 | description: Allows the player to clear other players inventory 58 | 59 | scrapbukkit.some.standard.perm: true 60 | scrapbukkit.some.other.perm: true 61 | scrapbukkit.some.bad.perm: false -------------------------------------------------------------------------------- /internal/pluginyml/testdata/plugin-2.yml: -------------------------------------------------------------------------------- 1 | name: ScrapBukkit 2 | main: com.dinnerbone.bukkit.scrap.ScrapBukkit 3 | version: 1.0.0 4 | website: http://www.bukkit.org 5 | author: The Bukkit Team 6 | description: > 7 | Miscellaneous administrative commands for Bukkit. 8 | This plugin is one of the default plugins shipped with Bukkit. 9 | # commands: snipped 10 | 11 | permissions: 12 | scrapbukkit.remove: 13 | description: Allows the player to remove items from anyones inventory 14 | children: 15 | scrapbukkit.remove.self: true 16 | scrapbukkit.remove.other: true 17 | scrapbukkit.remove.self: 18 | description: Allows the player to remove items from their own inventory 19 | scrapbukkit.remove.other: 20 | description: Allows the player to remove items from other peoples inventory 21 | 22 | scrapbukkit.time: 23 | description: Allows the player to view and change the time 24 | children: 25 | scrapbukkit.time.view: true 26 | scrapbukkit.time.change: true 27 | scrapbukkit.time.view: 28 | description: Allows the player to view the time 29 | default: true 30 | scrapbukkit.time.change: 31 | description: Allows the player to change the time 32 | 33 | scrapbukkit.tp: 34 | description: Allows the player to teleport anyone to anyone else 35 | children: 36 | scrapbukkit.tp.here: true 37 | scrapbukkit.tp.self: true 38 | scrapbukkit.tp.other: true 39 | scrapbukkit.tp.here: 40 | description: Allows the player to teleport other players to themselvess 41 | scrapbukkit.tp.self: 42 | description: Allows the player to teleport themselves to another player 43 | scrapbukkit.tp.other: 44 | description: Allows the player to teleport anyone to another player 45 | 46 | scrapbukkit.give: 47 | children: 48 | scrapbukkit.give.self: true 49 | scrapbukkit.give.other: true 50 | description: Allows the player to give items 51 | scrapbukkit.give.self: 52 | description: Allows the player to give themselves items 53 | scrapbukkit.give.other: 54 | description: Allows the player to give other players items 55 | 56 | scrapbukkit.clear: 57 | description: Allows the player to clear inventories 58 | children: 59 | scrapbukkit.clear.self: true 60 | scrapbukkit.clear.other: true 61 | scrapbukkit.clear.self: 62 | description: Allows the player to clear their own inventory 63 | scrapbukkit.clear.other: 64 | description: Allows the player to clear other players inventory 65 | 66 | scrapbukkit.*: 67 | description: Gives all permissions for Scrapbukkit 68 | default: op 69 | children: 70 | scrapbukkit.clear: true 71 | scrapbukkit.remove: true 72 | scrapbukkit.time: true 73 | scrapbukkit.tp: true 74 | scrapbukkit.give: true 75 | scrapbukkit.some.standard.perm: true 76 | scrapbukkit.some.other.perm: true 77 | scrapbukkit.some.bad.perm: false -------------------------------------------------------------------------------- /internal/project/package_json.go: -------------------------------------------------------------------------------- 1 | package project 2 | 3 | type PackageJSON struct { 4 | Name string `json:"name"` 5 | Version string `json:"version"` 6 | } 7 | -------------------------------------------------------------------------------- /internal/project/project.go: -------------------------------------------------------------------------------- 1 | package project 2 | 3 | import ( 4 | "context" 5 | "encoding/json" 6 | "errors" 7 | "fmt" 8 | "os" 9 | "os/exec" 10 | "path/filepath" 11 | 12 | "github.com/customrealms/cli/internal/pluginyml" 13 | "gopkg.in/yaml.v3" 14 | ) 15 | 16 | type Project interface { 17 | // Exec executes a command in the project directory. 18 | Exec(ctx context.Context, name string, args ...string) error 19 | // PackageJSON reads the package.json file contents from the project directory. 20 | // If the file does not exist, it returns nil. 21 | PackageJSON() (*PackageJSON, error) 22 | // PluginYML reads the plugin.yml file contents from the project directory. 23 | // If the file does not exist, it returns nil. 24 | PluginYML() (*pluginyml.Plugin, error) 25 | } 26 | 27 | // New creates a new project from the given directory. 28 | func New(dir string) Project { 29 | return &project{dir} 30 | } 31 | 32 | type project struct { 33 | dir string 34 | } 35 | 36 | func (p *project) Exec(ctx context.Context, name string, args ...string) error { 37 | cmd := exec.CommandContext(ctx, name, args...) 38 | cmd.Dir = p.dir 39 | cmd.Stdout = os.Stdout 40 | cmd.Stderr = os.Stderr 41 | return cmd.Run() 42 | } 43 | 44 | func (p *project) PackageJSON() (*PackageJSON, error) { 45 | // Open the file 46 | file, err := os.Open(filepath.Join(p.dir, "package.json")) 47 | if err != nil { 48 | if errors.Is(err, os.ErrNotExist) { 49 | return nil, nil 50 | } 51 | return nil, fmt.Errorf("opening package.json: %w", err) 52 | } 53 | defer file.Close() 54 | 55 | // Decode the json file 56 | var packageJSON PackageJSON 57 | if err := json.NewDecoder(file).Decode(&packageJSON); err != nil { 58 | return nil, fmt.Errorf("decoding package.json: %w", err) 59 | } 60 | return &packageJSON, nil 61 | } 62 | 63 | func (p *project) PluginYML() (*pluginyml.Plugin, error) { 64 | // Open the file 65 | file, err := os.Open(filepath.Join(p.dir, "plugin.yml")) 66 | if err != nil { 67 | if errors.Is(err, os.ErrNotExist) { 68 | return nil, nil 69 | } 70 | return nil, fmt.Errorf("opening plugin.yml: %w", err) 71 | } 72 | defer file.Close() 73 | 74 | // Decode the yaml file 75 | var plugin pluginyml.Plugin 76 | if err := yaml.NewDecoder(file).Decode(&plugin); err != nil { 77 | return nil, fmt.Errorf("decoding plugin.yml: %w", err) 78 | } 79 | return &plugin, nil 80 | } 81 | -------------------------------------------------------------------------------- /internal/serve/serve.go: -------------------------------------------------------------------------------- 1 | package serve 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "io" 7 | "os" 8 | "os/exec" 9 | "path/filepath" 10 | 11 | "github.com/customrealms/cli/internal/minecraft" 12 | "github.com/customrealms/cli/internal/server" 13 | "golang.org/x/sync/errgroup" 14 | ) 15 | 16 | type ServeAction struct { 17 | MinecraftVersion minecraft.Version 18 | PluginJarPath string 19 | ServerJarFetcher server.JarFetcher 20 | } 21 | 22 | func (a *ServeAction) DownloadJarTo(dest string) error { 23 | 24 | // Download the JAR to a reader stream 25 | jarReader, err := a.ServerJarFetcher.Fetch(a.MinecraftVersion) 26 | if err != nil { 27 | return err 28 | } 29 | defer jarReader.Close() 30 | 31 | // Create the destination file for the JAR 32 | file, err := os.Create(dest) 33 | if err != nil { 34 | return err 35 | } 36 | defer file.Close() 37 | 38 | // Copy the JAR to its destination 39 | if _, err := io.Copy(file, jarReader); err != nil { 40 | return err 41 | } 42 | return nil 43 | 44 | } 45 | 46 | func copyFile(from, to string) error { 47 | fromFile, err := os.Open(from) 48 | if err != nil { 49 | return err 50 | } 51 | defer fromFile.Close() 52 | 53 | toFile, err := os.Create(to) 54 | if err != nil { 55 | return err 56 | } 57 | defer toFile.Close() 58 | 59 | if _, err := io.Copy(toFile, fromFile); err != nil { 60 | return err 61 | } 62 | return nil 63 | } 64 | 65 | func (a *ServeAction) Run(ctx context.Context, chanPluginUpdated <-chan struct{}) error { 66 | 67 | // Check if Java is installed on the machine 68 | if _, err := exec.LookPath("java"); err != nil { 69 | fmt.Println("Couldn't find 'java' command on your machine. Make sure Java is installed.") 70 | fmt.Println("Visit https://dev.java/download and download the most recent version.") 71 | return nil 72 | } 73 | 74 | fmt.Println("============================================================") 75 | fmt.Println("Setting up Minecraft server directory...") 76 | fmt.Println("============================================================") 77 | 78 | // Create the temp directory 79 | dir, err := os.MkdirTemp("", "cr-server-*") 80 | if err != nil { 81 | return err 82 | } 83 | defer os.RemoveAll(dir) 84 | 85 | fmt.Println(" -> ", dir) 86 | fmt.Println() 87 | 88 | fmt.Println("============================================================") 89 | fmt.Printf("Downloading JAR file for %s server...\n", a.MinecraftVersion.ServerJarType()) 90 | fmt.Println("============================================================") 91 | 92 | // Create the name of the JAR file 93 | jarBase := fmt.Sprintf("%s-%s.jar", a.MinecraftVersion.ServerJarType(), a.MinecraftVersion) 94 | jarFile := filepath.Join(dir, jarBase) 95 | 96 | // Download the JAR file to the path 97 | if err := a.DownloadJarTo(jarFile); err != nil { 98 | return err 99 | } 100 | 101 | fmt.Println(" -> Done") 102 | fmt.Println() 103 | 104 | fmt.Println("============================================================") 105 | fmt.Println("Copying plugin JAR file to server 'plugins' folder...") 106 | fmt.Println("============================================================") 107 | 108 | // Make the plugin directory 109 | pluginsDir := filepath.Join(dir, "plugins") 110 | if err := os.MkdirAll(pluginsDir, 0777); err != nil { 111 | return err 112 | } 113 | if err := copyFile(a.PluginJarPath, filepath.Join(pluginsDir, filepath.Base(a.PluginJarPath))); err != nil { 114 | return err 115 | } 116 | 117 | // Create the "eula.txt" file 118 | if err := os.WriteFile(filepath.Join(dir, "eula.txt"), []byte("eula=true\n"), 0777); err != nil { 119 | return err 120 | } 121 | 122 | fmt.Println(" -> Done") 123 | fmt.Println() 124 | 125 | fmt.Println("============================================================") 126 | fmt.Println("Launching server...") 127 | fmt.Println("============================================================") 128 | fmt.Println() 129 | 130 | eg, ctx := errgroup.WithContext(ctx) 131 | 132 | chanServerStopped := make(chan struct{}) 133 | eg.Go(func() error { 134 | for { 135 | select { 136 | case <-ctx.Done(): 137 | return ctx.Err() 138 | case <-chanServerStopped: 139 | return nil 140 | case _, ok := <-chanPluginUpdated: 141 | if !ok { 142 | return nil 143 | } 144 | } 145 | 146 | // Copy the plugin file to the server 147 | if err := copyFile(a.PluginJarPath, filepath.Join(pluginsDir, filepath.Base(a.PluginJarPath))); err != nil { 148 | return err 149 | } 150 | fmt.Println("Plugin JAR updated. Run `/reload confirm` to reload the plugin.") 151 | } 152 | }) 153 | eg.Go(func() error { 154 | defer close(chanServerStopped) 155 | 156 | // Run the server 157 | cmd := exec.CommandContext(ctx, "java", "-jar", jarBase, "-nogui") 158 | cmd.Dir = dir 159 | cmd.Stdin = os.Stdin 160 | cmd.Stdout = os.Stdout 161 | cmd.Stderr = os.Stderr 162 | return cmd.Run() 163 | }) 164 | return eg.Wait() 165 | } 166 | -------------------------------------------------------------------------------- /internal/server/fetcher.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "io" 5 | 6 | "github.com/customrealms/cli/internal/minecraft" 7 | ) 8 | 9 | type JarFetcher interface { 10 | Fetch(version minecraft.Version) (io.ReadCloser, error) 11 | } 12 | -------------------------------------------------------------------------------- /internal/server/fetcher_cache.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "io" 7 | "os" 8 | "path" 9 | 10 | "github.com/customrealms/cli/internal/minecraft" 11 | ) 12 | 13 | type cachedFetcher struct { 14 | JarFetcher JarFetcher 15 | cacheDir string 16 | } 17 | 18 | func NewCachedFetcher(fetcher JarFetcher) (JarFetcher, error) { 19 | 20 | // Setup the cache directory 21 | cacheDir, _ := os.UserCacheDir() 22 | cacheDir = path.Join(cacheDir, "cr-cli-cache") 23 | if err := os.MkdirAll(cacheDir, 0777); err != nil { 24 | return nil, err 25 | } 26 | 27 | // Create the cached fetcher instance 28 | return &cachedFetcher{ 29 | JarFetcher: fetcher, 30 | cacheDir: cacheDir, 31 | }, nil 32 | 33 | } 34 | 35 | func (f *cachedFetcher) getJarCacheFilename(version minecraft.Version) string { 36 | return path.Join(f.cacheDir, fmt.Sprintf("%s-%s.jar", version.ServerJarType(), version)) 37 | } 38 | 39 | func (f *cachedFetcher) findJarFile(version minecraft.Version) (io.ReadCloser, error) { 40 | 41 | // Get the filename of the JAR cache 42 | jarCacheFilename := f.getJarCacheFilename(version) 43 | 44 | // Check if the file exists 45 | stat, err := os.Stat(jarCacheFilename) 46 | if err != nil { 47 | if os.IsNotExist(err) { 48 | return nil, nil 49 | } else { 50 | return nil, err 51 | } 52 | } 53 | if stat.IsDir() { 54 | return nil, errors.New("jar cache location is a directory") 55 | } 56 | 57 | // Read the file 58 | return os.Open(jarCacheFilename) 59 | 60 | } 61 | 62 | func (f *cachedFetcher) storeJarFile(reader io.Reader, version minecraft.Version) (string, error) { 63 | 64 | // Get the filename of the JAR cache 65 | jarCacheFilename := f.getJarCacheFilename(version) 66 | 67 | // Create the file for the cache 68 | cacheFile, err := os.Create(jarCacheFilename) 69 | if err != nil { 70 | return "", err 71 | } 72 | defer cacheFile.Close() 73 | 74 | // Copy the jar data to the file 75 | if _, err := io.Copy(cacheFile, reader); err != nil { 76 | return "", err 77 | } 78 | 79 | // Return the jar filename 80 | return jarCacheFilename, nil 81 | 82 | } 83 | 84 | func (f *cachedFetcher) Fetch(version minecraft.Version) (io.ReadCloser, error) { 85 | 86 | // Check for the file in the cache, and return the cached version is there is one 87 | jarReader, err := f.findJarFile(version) 88 | if err != nil { 89 | return nil, err 90 | } 91 | if jarReader != nil { 92 | return jarReader, nil 93 | } 94 | 95 | // Fetch the JAR file from the upstream fetcher 96 | res, err := f.JarFetcher.Fetch(version) 97 | if err != nil { 98 | return nil, err 99 | } 100 | defer res.Close() 101 | 102 | // Store the jar file contents 103 | jarFilename, err := f.storeJarFile(res, version) 104 | if err != nil { 105 | return nil, err 106 | } 107 | 108 | // Open and return the cache file 109 | return os.Open(jarFilename) 110 | 111 | } 112 | -------------------------------------------------------------------------------- /internal/server/fetcher_http.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "io" 5 | "net/http" 6 | 7 | "github.com/customrealms/cli/internal/minecraft" 8 | ) 9 | 10 | type HttpFetcher struct{} 11 | 12 | func (f *HttpFetcher) Fetch(version minecraft.Version) (io.ReadCloser, error) { 13 | 14 | // Fetch the JAR file from the server 15 | res, err := http.Get(version.ServerJarUrl()) 16 | if err != nil { 17 | return nil, err 18 | } 19 | 20 | // Return the body of the response 21 | return res.Body, nil 22 | 23 | } 24 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@customrealms/cli", 3 | "version": "0.5.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@customrealms/cli", 9 | "version": "0.5.0", 10 | "hasInstallScript": true, 11 | "license": "MIT", 12 | "dependencies": { 13 | "@babel/core": "7.24.7", 14 | "@babel/preset-env": "^7.24.7", 15 | "babel-loader": "9.1.3", 16 | "mkdirp": "1.0.4", 17 | "ts-loader": "9.2.6", 18 | "tslib": "2.3.1", 19 | "typescript": "4.4.4", 20 | "webpack": "5.63.0", 21 | "webpack-cli": "5.1.4" 22 | } 23 | }, 24 | "node_modules/@ampproject/remapping": { 25 | "version": "2.3.0", 26 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 27 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 28 | "dependencies": { 29 | "@jridgewell/gen-mapping": "^0.3.5", 30 | "@jridgewell/trace-mapping": "^0.3.24" 31 | }, 32 | "engines": { 33 | "node": ">=6.0.0" 34 | } 35 | }, 36 | "node_modules/@babel/code-frame": { 37 | "version": "7.24.7", 38 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", 39 | "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", 40 | "dependencies": { 41 | "@babel/highlight": "^7.24.7", 42 | "picocolors": "^1.0.0" 43 | }, 44 | "engines": { 45 | "node": ">=6.9.0" 46 | } 47 | }, 48 | "node_modules/@babel/compat-data": { 49 | "version": "7.24.7", 50 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", 51 | "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", 52 | "engines": { 53 | "node": ">=6.9.0" 54 | } 55 | }, 56 | "node_modules/@babel/core": { 57 | "version": "7.24.7", 58 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", 59 | "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", 60 | "dependencies": { 61 | "@ampproject/remapping": "^2.2.0", 62 | "@babel/code-frame": "^7.24.7", 63 | "@babel/generator": "^7.24.7", 64 | "@babel/helper-compilation-targets": "^7.24.7", 65 | "@babel/helper-module-transforms": "^7.24.7", 66 | "@babel/helpers": "^7.24.7", 67 | "@babel/parser": "^7.24.7", 68 | "@babel/template": "^7.24.7", 69 | "@babel/traverse": "^7.24.7", 70 | "@babel/types": "^7.24.7", 71 | "convert-source-map": "^2.0.0", 72 | "debug": "^4.1.0", 73 | "gensync": "^1.0.0-beta.2", 74 | "json5": "^2.2.3", 75 | "semver": "^6.3.1" 76 | }, 77 | "engines": { 78 | "node": ">=6.9.0" 79 | }, 80 | "funding": { 81 | "type": "opencollective", 82 | "url": "https://opencollective.com/babel" 83 | } 84 | }, 85 | "node_modules/@babel/generator": { 86 | "version": "7.24.7", 87 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", 88 | "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", 89 | "dependencies": { 90 | "@babel/types": "^7.24.7", 91 | "@jridgewell/gen-mapping": "^0.3.5", 92 | "@jridgewell/trace-mapping": "^0.3.25", 93 | "jsesc": "^2.5.1" 94 | }, 95 | "engines": { 96 | "node": ">=6.9.0" 97 | } 98 | }, 99 | "node_modules/@babel/helper-annotate-as-pure": { 100 | "version": "7.24.7", 101 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", 102 | "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", 103 | "dependencies": { 104 | "@babel/types": "^7.24.7" 105 | }, 106 | "engines": { 107 | "node": ">=6.9.0" 108 | } 109 | }, 110 | "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { 111 | "version": "7.24.7", 112 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", 113 | "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", 114 | "dependencies": { 115 | "@babel/traverse": "^7.24.7", 116 | "@babel/types": "^7.24.7" 117 | }, 118 | "engines": { 119 | "node": ">=6.9.0" 120 | } 121 | }, 122 | "node_modules/@babel/helper-compilation-targets": { 123 | "version": "7.24.7", 124 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", 125 | "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", 126 | "dependencies": { 127 | "@babel/compat-data": "^7.24.7", 128 | "@babel/helper-validator-option": "^7.24.7", 129 | "browserslist": "^4.22.2", 130 | "lru-cache": "^5.1.1", 131 | "semver": "^6.3.1" 132 | }, 133 | "engines": { 134 | "node": ">=6.9.0" 135 | } 136 | }, 137 | "node_modules/@babel/helper-create-class-features-plugin": { 138 | "version": "7.24.7", 139 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", 140 | "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", 141 | "dependencies": { 142 | "@babel/helper-annotate-as-pure": "^7.24.7", 143 | "@babel/helper-environment-visitor": "^7.24.7", 144 | "@babel/helper-function-name": "^7.24.7", 145 | "@babel/helper-member-expression-to-functions": "^7.24.7", 146 | "@babel/helper-optimise-call-expression": "^7.24.7", 147 | "@babel/helper-replace-supers": "^7.24.7", 148 | "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", 149 | "@babel/helper-split-export-declaration": "^7.24.7", 150 | "semver": "^6.3.1" 151 | }, 152 | "engines": { 153 | "node": ">=6.9.0" 154 | }, 155 | "peerDependencies": { 156 | "@babel/core": "^7.0.0" 157 | } 158 | }, 159 | "node_modules/@babel/helper-create-regexp-features-plugin": { 160 | "version": "7.24.7", 161 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", 162 | "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", 163 | "dependencies": { 164 | "@babel/helper-annotate-as-pure": "^7.24.7", 165 | "regexpu-core": "^5.3.1", 166 | "semver": "^6.3.1" 167 | }, 168 | "engines": { 169 | "node": ">=6.9.0" 170 | }, 171 | "peerDependencies": { 172 | "@babel/core": "^7.0.0" 173 | } 174 | }, 175 | "node_modules/@babel/helper-define-polyfill-provider": { 176 | "version": "0.6.2", 177 | "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", 178 | "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", 179 | "dependencies": { 180 | "@babel/helper-compilation-targets": "^7.22.6", 181 | "@babel/helper-plugin-utils": "^7.22.5", 182 | "debug": "^4.1.1", 183 | "lodash.debounce": "^4.0.8", 184 | "resolve": "^1.14.2" 185 | }, 186 | "peerDependencies": { 187 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 188 | } 189 | }, 190 | "node_modules/@babel/helper-environment-visitor": { 191 | "version": "7.24.7", 192 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", 193 | "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", 194 | "dependencies": { 195 | "@babel/types": "^7.24.7" 196 | }, 197 | "engines": { 198 | "node": ">=6.9.0" 199 | } 200 | }, 201 | "node_modules/@babel/helper-function-name": { 202 | "version": "7.24.7", 203 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", 204 | "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", 205 | "dependencies": { 206 | "@babel/template": "^7.24.7", 207 | "@babel/types": "^7.24.7" 208 | }, 209 | "engines": { 210 | "node": ">=6.9.0" 211 | } 212 | }, 213 | "node_modules/@babel/helper-hoist-variables": { 214 | "version": "7.24.7", 215 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", 216 | "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", 217 | "dependencies": { 218 | "@babel/types": "^7.24.7" 219 | }, 220 | "engines": { 221 | "node": ">=6.9.0" 222 | } 223 | }, 224 | "node_modules/@babel/helper-member-expression-to-functions": { 225 | "version": "7.24.7", 226 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", 227 | "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", 228 | "dependencies": { 229 | "@babel/traverse": "^7.24.7", 230 | "@babel/types": "^7.24.7" 231 | }, 232 | "engines": { 233 | "node": ">=6.9.0" 234 | } 235 | }, 236 | "node_modules/@babel/helper-module-imports": { 237 | "version": "7.24.7", 238 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", 239 | "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", 240 | "dependencies": { 241 | "@babel/traverse": "^7.24.7", 242 | "@babel/types": "^7.24.7" 243 | }, 244 | "engines": { 245 | "node": ">=6.9.0" 246 | } 247 | }, 248 | "node_modules/@babel/helper-module-transforms": { 249 | "version": "7.24.7", 250 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", 251 | "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", 252 | "dependencies": { 253 | "@babel/helper-environment-visitor": "^7.24.7", 254 | "@babel/helper-module-imports": "^7.24.7", 255 | "@babel/helper-simple-access": "^7.24.7", 256 | "@babel/helper-split-export-declaration": "^7.24.7", 257 | "@babel/helper-validator-identifier": "^7.24.7" 258 | }, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | }, 262 | "peerDependencies": { 263 | "@babel/core": "^7.0.0" 264 | } 265 | }, 266 | "node_modules/@babel/helper-optimise-call-expression": { 267 | "version": "7.24.7", 268 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", 269 | "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", 270 | "dependencies": { 271 | "@babel/types": "^7.24.7" 272 | }, 273 | "engines": { 274 | "node": ">=6.9.0" 275 | } 276 | }, 277 | "node_modules/@babel/helper-plugin-utils": { 278 | "version": "7.24.7", 279 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", 280 | "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", 281 | "engines": { 282 | "node": ">=6.9.0" 283 | } 284 | }, 285 | "node_modules/@babel/helper-remap-async-to-generator": { 286 | "version": "7.24.7", 287 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", 288 | "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", 289 | "dependencies": { 290 | "@babel/helper-annotate-as-pure": "^7.24.7", 291 | "@babel/helper-environment-visitor": "^7.24.7", 292 | "@babel/helper-wrap-function": "^7.24.7" 293 | }, 294 | "engines": { 295 | "node": ">=6.9.0" 296 | }, 297 | "peerDependencies": { 298 | "@babel/core": "^7.0.0" 299 | } 300 | }, 301 | "node_modules/@babel/helper-replace-supers": { 302 | "version": "7.24.7", 303 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", 304 | "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", 305 | "dependencies": { 306 | "@babel/helper-environment-visitor": "^7.24.7", 307 | "@babel/helper-member-expression-to-functions": "^7.24.7", 308 | "@babel/helper-optimise-call-expression": "^7.24.7" 309 | }, 310 | "engines": { 311 | "node": ">=6.9.0" 312 | }, 313 | "peerDependencies": { 314 | "@babel/core": "^7.0.0" 315 | } 316 | }, 317 | "node_modules/@babel/helper-simple-access": { 318 | "version": "7.24.7", 319 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", 320 | "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", 321 | "dependencies": { 322 | "@babel/traverse": "^7.24.7", 323 | "@babel/types": "^7.24.7" 324 | }, 325 | "engines": { 326 | "node": ">=6.9.0" 327 | } 328 | }, 329 | "node_modules/@babel/helper-skip-transparent-expression-wrappers": { 330 | "version": "7.24.7", 331 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", 332 | "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", 333 | "dependencies": { 334 | "@babel/traverse": "^7.24.7", 335 | "@babel/types": "^7.24.7" 336 | }, 337 | "engines": { 338 | "node": ">=6.9.0" 339 | } 340 | }, 341 | "node_modules/@babel/helper-split-export-declaration": { 342 | "version": "7.24.7", 343 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", 344 | "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", 345 | "dependencies": { 346 | "@babel/types": "^7.24.7" 347 | }, 348 | "engines": { 349 | "node": ">=6.9.0" 350 | } 351 | }, 352 | "node_modules/@babel/helper-string-parser": { 353 | "version": "7.24.7", 354 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", 355 | "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", 356 | "engines": { 357 | "node": ">=6.9.0" 358 | } 359 | }, 360 | "node_modules/@babel/helper-validator-identifier": { 361 | "version": "7.24.7", 362 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", 363 | "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", 364 | "engines": { 365 | "node": ">=6.9.0" 366 | } 367 | }, 368 | "node_modules/@babel/helper-validator-option": { 369 | "version": "7.24.7", 370 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", 371 | "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", 372 | "engines": { 373 | "node": ">=6.9.0" 374 | } 375 | }, 376 | "node_modules/@babel/helper-wrap-function": { 377 | "version": "7.24.7", 378 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", 379 | "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", 380 | "dependencies": { 381 | "@babel/helper-function-name": "^7.24.7", 382 | "@babel/template": "^7.24.7", 383 | "@babel/traverse": "^7.24.7", 384 | "@babel/types": "^7.24.7" 385 | }, 386 | "engines": { 387 | "node": ">=6.9.0" 388 | } 389 | }, 390 | "node_modules/@babel/helpers": { 391 | "version": "7.24.7", 392 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", 393 | "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", 394 | "dependencies": { 395 | "@babel/template": "^7.24.7", 396 | "@babel/types": "^7.24.7" 397 | }, 398 | "engines": { 399 | "node": ">=6.9.0" 400 | } 401 | }, 402 | "node_modules/@babel/highlight": { 403 | "version": "7.24.7", 404 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", 405 | "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", 406 | "dependencies": { 407 | "@babel/helper-validator-identifier": "^7.24.7", 408 | "chalk": "^2.4.2", 409 | "js-tokens": "^4.0.0", 410 | "picocolors": "^1.0.0" 411 | }, 412 | "engines": { 413 | "node": ">=6.9.0" 414 | } 415 | }, 416 | "node_modules/@babel/parser": { 417 | "version": "7.24.7", 418 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", 419 | "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", 420 | "bin": { 421 | "parser": "bin/babel-parser.js" 422 | }, 423 | "engines": { 424 | "node": ">=6.0.0" 425 | } 426 | }, 427 | "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { 428 | "version": "7.24.7", 429 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", 430 | "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", 431 | "dependencies": { 432 | "@babel/helper-environment-visitor": "^7.24.7", 433 | "@babel/helper-plugin-utils": "^7.24.7" 434 | }, 435 | "engines": { 436 | "node": ">=6.9.0" 437 | }, 438 | "peerDependencies": { 439 | "@babel/core": "^7.0.0" 440 | } 441 | }, 442 | "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { 443 | "version": "7.24.7", 444 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", 445 | "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", 446 | "dependencies": { 447 | "@babel/helper-plugin-utils": "^7.24.7" 448 | }, 449 | "engines": { 450 | "node": ">=6.9.0" 451 | }, 452 | "peerDependencies": { 453 | "@babel/core": "^7.0.0" 454 | } 455 | }, 456 | "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { 457 | "version": "7.24.7", 458 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", 459 | "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", 460 | "dependencies": { 461 | "@babel/helper-plugin-utils": "^7.24.7", 462 | "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", 463 | "@babel/plugin-transform-optional-chaining": "^7.24.7" 464 | }, 465 | "engines": { 466 | "node": ">=6.9.0" 467 | }, 468 | "peerDependencies": { 469 | "@babel/core": "^7.13.0" 470 | } 471 | }, 472 | "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { 473 | "version": "7.24.7", 474 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", 475 | "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", 476 | "dependencies": { 477 | "@babel/helper-environment-visitor": "^7.24.7", 478 | "@babel/helper-plugin-utils": "^7.24.7" 479 | }, 480 | "engines": { 481 | "node": ">=6.9.0" 482 | }, 483 | "peerDependencies": { 484 | "@babel/core": "^7.0.0" 485 | } 486 | }, 487 | "node_modules/@babel/plugin-proposal-private-property-in-object": { 488 | "version": "7.21.0-placeholder-for-preset-env.2", 489 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", 490 | "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", 491 | "engines": { 492 | "node": ">=6.9.0" 493 | }, 494 | "peerDependencies": { 495 | "@babel/core": "^7.0.0-0" 496 | } 497 | }, 498 | "node_modules/@babel/plugin-syntax-async-generators": { 499 | "version": "7.8.4", 500 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 501 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 502 | "dependencies": { 503 | "@babel/helper-plugin-utils": "^7.8.0" 504 | }, 505 | "peerDependencies": { 506 | "@babel/core": "^7.0.0-0" 507 | } 508 | }, 509 | "node_modules/@babel/plugin-syntax-class-properties": { 510 | "version": "7.12.13", 511 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 512 | "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 513 | "dependencies": { 514 | "@babel/helper-plugin-utils": "^7.12.13" 515 | }, 516 | "peerDependencies": { 517 | "@babel/core": "^7.0.0-0" 518 | } 519 | }, 520 | "node_modules/@babel/plugin-syntax-class-static-block": { 521 | "version": "7.14.5", 522 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", 523 | "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", 524 | "dependencies": { 525 | "@babel/helper-plugin-utils": "^7.14.5" 526 | }, 527 | "engines": { 528 | "node": ">=6.9.0" 529 | }, 530 | "peerDependencies": { 531 | "@babel/core": "^7.0.0-0" 532 | } 533 | }, 534 | "node_modules/@babel/plugin-syntax-dynamic-import": { 535 | "version": "7.8.3", 536 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 537 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 538 | "dependencies": { 539 | "@babel/helper-plugin-utils": "^7.8.0" 540 | }, 541 | "peerDependencies": { 542 | "@babel/core": "^7.0.0-0" 543 | } 544 | }, 545 | "node_modules/@babel/plugin-syntax-export-namespace-from": { 546 | "version": "7.8.3", 547 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", 548 | "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", 549 | "dependencies": { 550 | "@babel/helper-plugin-utils": "^7.8.3" 551 | }, 552 | "peerDependencies": { 553 | "@babel/core": "^7.0.0-0" 554 | } 555 | }, 556 | "node_modules/@babel/plugin-syntax-import-assertions": { 557 | "version": "7.24.7", 558 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", 559 | "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", 560 | "dependencies": { 561 | "@babel/helper-plugin-utils": "^7.24.7" 562 | }, 563 | "engines": { 564 | "node": ">=6.9.0" 565 | }, 566 | "peerDependencies": { 567 | "@babel/core": "^7.0.0-0" 568 | } 569 | }, 570 | "node_modules/@babel/plugin-syntax-import-attributes": { 571 | "version": "7.24.7", 572 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", 573 | "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", 574 | "dependencies": { 575 | "@babel/helper-plugin-utils": "^7.24.7" 576 | }, 577 | "engines": { 578 | "node": ">=6.9.0" 579 | }, 580 | "peerDependencies": { 581 | "@babel/core": "^7.0.0-0" 582 | } 583 | }, 584 | "node_modules/@babel/plugin-syntax-import-meta": { 585 | "version": "7.10.4", 586 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", 587 | "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", 588 | "dependencies": { 589 | "@babel/helper-plugin-utils": "^7.10.4" 590 | }, 591 | "peerDependencies": { 592 | "@babel/core": "^7.0.0-0" 593 | } 594 | }, 595 | "node_modules/@babel/plugin-syntax-json-strings": { 596 | "version": "7.8.3", 597 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 598 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 599 | "dependencies": { 600 | "@babel/helper-plugin-utils": "^7.8.0" 601 | }, 602 | "peerDependencies": { 603 | "@babel/core": "^7.0.0-0" 604 | } 605 | }, 606 | "node_modules/@babel/plugin-syntax-logical-assignment-operators": { 607 | "version": "7.10.4", 608 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 609 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 610 | "dependencies": { 611 | "@babel/helper-plugin-utils": "^7.10.4" 612 | }, 613 | "peerDependencies": { 614 | "@babel/core": "^7.0.0-0" 615 | } 616 | }, 617 | "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { 618 | "version": "7.8.3", 619 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 620 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 621 | "dependencies": { 622 | "@babel/helper-plugin-utils": "^7.8.0" 623 | }, 624 | "peerDependencies": { 625 | "@babel/core": "^7.0.0-0" 626 | } 627 | }, 628 | "node_modules/@babel/plugin-syntax-numeric-separator": { 629 | "version": "7.10.4", 630 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 631 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 632 | "dependencies": { 633 | "@babel/helper-plugin-utils": "^7.10.4" 634 | }, 635 | "peerDependencies": { 636 | "@babel/core": "^7.0.0-0" 637 | } 638 | }, 639 | "node_modules/@babel/plugin-syntax-object-rest-spread": { 640 | "version": "7.8.3", 641 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 642 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 643 | "dependencies": { 644 | "@babel/helper-plugin-utils": "^7.8.0" 645 | }, 646 | "peerDependencies": { 647 | "@babel/core": "^7.0.0-0" 648 | } 649 | }, 650 | "node_modules/@babel/plugin-syntax-optional-catch-binding": { 651 | "version": "7.8.3", 652 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 653 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 654 | "dependencies": { 655 | "@babel/helper-plugin-utils": "^7.8.0" 656 | }, 657 | "peerDependencies": { 658 | "@babel/core": "^7.0.0-0" 659 | } 660 | }, 661 | "node_modules/@babel/plugin-syntax-optional-chaining": { 662 | "version": "7.8.3", 663 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 664 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 665 | "dependencies": { 666 | "@babel/helper-plugin-utils": "^7.8.0" 667 | }, 668 | "peerDependencies": { 669 | "@babel/core": "^7.0.0-0" 670 | } 671 | }, 672 | "node_modules/@babel/plugin-syntax-private-property-in-object": { 673 | "version": "7.14.5", 674 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", 675 | "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", 676 | "dependencies": { 677 | "@babel/helper-plugin-utils": "^7.14.5" 678 | }, 679 | "engines": { 680 | "node": ">=6.9.0" 681 | }, 682 | "peerDependencies": { 683 | "@babel/core": "^7.0.0-0" 684 | } 685 | }, 686 | "node_modules/@babel/plugin-syntax-top-level-await": { 687 | "version": "7.14.5", 688 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", 689 | "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", 690 | "dependencies": { 691 | "@babel/helper-plugin-utils": "^7.14.5" 692 | }, 693 | "engines": { 694 | "node": ">=6.9.0" 695 | }, 696 | "peerDependencies": { 697 | "@babel/core": "^7.0.0-0" 698 | } 699 | }, 700 | "node_modules/@babel/plugin-syntax-unicode-sets-regex": { 701 | "version": "7.18.6", 702 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", 703 | "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", 704 | "dependencies": { 705 | "@babel/helper-create-regexp-features-plugin": "^7.18.6", 706 | "@babel/helper-plugin-utils": "^7.18.6" 707 | }, 708 | "engines": { 709 | "node": ">=6.9.0" 710 | }, 711 | "peerDependencies": { 712 | "@babel/core": "^7.0.0" 713 | } 714 | }, 715 | "node_modules/@babel/plugin-transform-arrow-functions": { 716 | "version": "7.24.7", 717 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", 718 | "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", 719 | "dependencies": { 720 | "@babel/helper-plugin-utils": "^7.24.7" 721 | }, 722 | "engines": { 723 | "node": ">=6.9.0" 724 | }, 725 | "peerDependencies": { 726 | "@babel/core": "^7.0.0-0" 727 | } 728 | }, 729 | "node_modules/@babel/plugin-transform-async-generator-functions": { 730 | "version": "7.24.7", 731 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", 732 | "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", 733 | "dependencies": { 734 | "@babel/helper-environment-visitor": "^7.24.7", 735 | "@babel/helper-plugin-utils": "^7.24.7", 736 | "@babel/helper-remap-async-to-generator": "^7.24.7", 737 | "@babel/plugin-syntax-async-generators": "^7.8.4" 738 | }, 739 | "engines": { 740 | "node": ">=6.9.0" 741 | }, 742 | "peerDependencies": { 743 | "@babel/core": "^7.0.0-0" 744 | } 745 | }, 746 | "node_modules/@babel/plugin-transform-async-to-generator": { 747 | "version": "7.24.7", 748 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", 749 | "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", 750 | "dependencies": { 751 | "@babel/helper-module-imports": "^7.24.7", 752 | "@babel/helper-plugin-utils": "^7.24.7", 753 | "@babel/helper-remap-async-to-generator": "^7.24.7" 754 | }, 755 | "engines": { 756 | "node": ">=6.9.0" 757 | }, 758 | "peerDependencies": { 759 | "@babel/core": "^7.0.0-0" 760 | } 761 | }, 762 | "node_modules/@babel/plugin-transform-block-scoped-functions": { 763 | "version": "7.24.7", 764 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", 765 | "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", 766 | "dependencies": { 767 | "@babel/helper-plugin-utils": "^7.24.7" 768 | }, 769 | "engines": { 770 | "node": ">=6.9.0" 771 | }, 772 | "peerDependencies": { 773 | "@babel/core": "^7.0.0-0" 774 | } 775 | }, 776 | "node_modules/@babel/plugin-transform-block-scoping": { 777 | "version": "7.24.7", 778 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", 779 | "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", 780 | "dependencies": { 781 | "@babel/helper-plugin-utils": "^7.24.7" 782 | }, 783 | "engines": { 784 | "node": ">=6.9.0" 785 | }, 786 | "peerDependencies": { 787 | "@babel/core": "^7.0.0-0" 788 | } 789 | }, 790 | "node_modules/@babel/plugin-transform-class-properties": { 791 | "version": "7.24.7", 792 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", 793 | "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", 794 | "dependencies": { 795 | "@babel/helper-create-class-features-plugin": "^7.24.7", 796 | "@babel/helper-plugin-utils": "^7.24.7" 797 | }, 798 | "engines": { 799 | "node": ">=6.9.0" 800 | }, 801 | "peerDependencies": { 802 | "@babel/core": "^7.0.0-0" 803 | } 804 | }, 805 | "node_modules/@babel/plugin-transform-class-static-block": { 806 | "version": "7.24.7", 807 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", 808 | "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", 809 | "dependencies": { 810 | "@babel/helper-create-class-features-plugin": "^7.24.7", 811 | "@babel/helper-plugin-utils": "^7.24.7", 812 | "@babel/plugin-syntax-class-static-block": "^7.14.5" 813 | }, 814 | "engines": { 815 | "node": ">=6.9.0" 816 | }, 817 | "peerDependencies": { 818 | "@babel/core": "^7.12.0" 819 | } 820 | }, 821 | "node_modules/@babel/plugin-transform-classes": { 822 | "version": "7.24.7", 823 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", 824 | "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", 825 | "dependencies": { 826 | "@babel/helper-annotate-as-pure": "^7.24.7", 827 | "@babel/helper-compilation-targets": "^7.24.7", 828 | "@babel/helper-environment-visitor": "^7.24.7", 829 | "@babel/helper-function-name": "^7.24.7", 830 | "@babel/helper-plugin-utils": "^7.24.7", 831 | "@babel/helper-replace-supers": "^7.24.7", 832 | "@babel/helper-split-export-declaration": "^7.24.7", 833 | "globals": "^11.1.0" 834 | }, 835 | "engines": { 836 | "node": ">=6.9.0" 837 | }, 838 | "peerDependencies": { 839 | "@babel/core": "^7.0.0-0" 840 | } 841 | }, 842 | "node_modules/@babel/plugin-transform-computed-properties": { 843 | "version": "7.24.7", 844 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", 845 | "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", 846 | "dependencies": { 847 | "@babel/helper-plugin-utils": "^7.24.7", 848 | "@babel/template": "^7.24.7" 849 | }, 850 | "engines": { 851 | "node": ">=6.9.0" 852 | }, 853 | "peerDependencies": { 854 | "@babel/core": "^7.0.0-0" 855 | } 856 | }, 857 | "node_modules/@babel/plugin-transform-destructuring": { 858 | "version": "7.24.7", 859 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", 860 | "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", 861 | "dependencies": { 862 | "@babel/helper-plugin-utils": "^7.24.7" 863 | }, 864 | "engines": { 865 | "node": ">=6.9.0" 866 | }, 867 | "peerDependencies": { 868 | "@babel/core": "^7.0.0-0" 869 | } 870 | }, 871 | "node_modules/@babel/plugin-transform-dotall-regex": { 872 | "version": "7.24.7", 873 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", 874 | "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", 875 | "dependencies": { 876 | "@babel/helper-create-regexp-features-plugin": "^7.24.7", 877 | "@babel/helper-plugin-utils": "^7.24.7" 878 | }, 879 | "engines": { 880 | "node": ">=6.9.0" 881 | }, 882 | "peerDependencies": { 883 | "@babel/core": "^7.0.0-0" 884 | } 885 | }, 886 | "node_modules/@babel/plugin-transform-duplicate-keys": { 887 | "version": "7.24.7", 888 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", 889 | "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", 890 | "dependencies": { 891 | "@babel/helper-plugin-utils": "^7.24.7" 892 | }, 893 | "engines": { 894 | "node": ">=6.9.0" 895 | }, 896 | "peerDependencies": { 897 | "@babel/core": "^7.0.0-0" 898 | } 899 | }, 900 | "node_modules/@babel/plugin-transform-dynamic-import": { 901 | "version": "7.24.7", 902 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", 903 | "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", 904 | "dependencies": { 905 | "@babel/helper-plugin-utils": "^7.24.7", 906 | "@babel/plugin-syntax-dynamic-import": "^7.8.3" 907 | }, 908 | "engines": { 909 | "node": ">=6.9.0" 910 | }, 911 | "peerDependencies": { 912 | "@babel/core": "^7.0.0-0" 913 | } 914 | }, 915 | "node_modules/@babel/plugin-transform-exponentiation-operator": { 916 | "version": "7.24.7", 917 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", 918 | "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", 919 | "dependencies": { 920 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", 921 | "@babel/helper-plugin-utils": "^7.24.7" 922 | }, 923 | "engines": { 924 | "node": ">=6.9.0" 925 | }, 926 | "peerDependencies": { 927 | "@babel/core": "^7.0.0-0" 928 | } 929 | }, 930 | "node_modules/@babel/plugin-transform-export-namespace-from": { 931 | "version": "7.24.7", 932 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", 933 | "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", 934 | "dependencies": { 935 | "@babel/helper-plugin-utils": "^7.24.7", 936 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3" 937 | }, 938 | "engines": { 939 | "node": ">=6.9.0" 940 | }, 941 | "peerDependencies": { 942 | "@babel/core": "^7.0.0-0" 943 | } 944 | }, 945 | "node_modules/@babel/plugin-transform-for-of": { 946 | "version": "7.24.7", 947 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", 948 | "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", 949 | "dependencies": { 950 | "@babel/helper-plugin-utils": "^7.24.7", 951 | "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" 952 | }, 953 | "engines": { 954 | "node": ">=6.9.0" 955 | }, 956 | "peerDependencies": { 957 | "@babel/core": "^7.0.0-0" 958 | } 959 | }, 960 | "node_modules/@babel/plugin-transform-function-name": { 961 | "version": "7.24.7", 962 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", 963 | "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", 964 | "dependencies": { 965 | "@babel/helper-compilation-targets": "^7.24.7", 966 | "@babel/helper-function-name": "^7.24.7", 967 | "@babel/helper-plugin-utils": "^7.24.7" 968 | }, 969 | "engines": { 970 | "node": ">=6.9.0" 971 | }, 972 | "peerDependencies": { 973 | "@babel/core": "^7.0.0-0" 974 | } 975 | }, 976 | "node_modules/@babel/plugin-transform-json-strings": { 977 | "version": "7.24.7", 978 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", 979 | "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", 980 | "dependencies": { 981 | "@babel/helper-plugin-utils": "^7.24.7", 982 | "@babel/plugin-syntax-json-strings": "^7.8.3" 983 | }, 984 | "engines": { 985 | "node": ">=6.9.0" 986 | }, 987 | "peerDependencies": { 988 | "@babel/core": "^7.0.0-0" 989 | } 990 | }, 991 | "node_modules/@babel/plugin-transform-literals": { 992 | "version": "7.24.7", 993 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", 994 | "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", 995 | "dependencies": { 996 | "@babel/helper-plugin-utils": "^7.24.7" 997 | }, 998 | "engines": { 999 | "node": ">=6.9.0" 1000 | }, 1001 | "peerDependencies": { 1002 | "@babel/core": "^7.0.0-0" 1003 | } 1004 | }, 1005 | "node_modules/@babel/plugin-transform-logical-assignment-operators": { 1006 | "version": "7.24.7", 1007 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", 1008 | "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", 1009 | "dependencies": { 1010 | "@babel/helper-plugin-utils": "^7.24.7", 1011 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" 1012 | }, 1013 | "engines": { 1014 | "node": ">=6.9.0" 1015 | }, 1016 | "peerDependencies": { 1017 | "@babel/core": "^7.0.0-0" 1018 | } 1019 | }, 1020 | "node_modules/@babel/plugin-transform-member-expression-literals": { 1021 | "version": "7.24.7", 1022 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", 1023 | "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", 1024 | "dependencies": { 1025 | "@babel/helper-plugin-utils": "^7.24.7" 1026 | }, 1027 | "engines": { 1028 | "node": ">=6.9.0" 1029 | }, 1030 | "peerDependencies": { 1031 | "@babel/core": "^7.0.0-0" 1032 | } 1033 | }, 1034 | "node_modules/@babel/plugin-transform-modules-amd": { 1035 | "version": "7.24.7", 1036 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", 1037 | "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", 1038 | "dependencies": { 1039 | "@babel/helper-module-transforms": "^7.24.7", 1040 | "@babel/helper-plugin-utils": "^7.24.7" 1041 | }, 1042 | "engines": { 1043 | "node": ">=6.9.0" 1044 | }, 1045 | "peerDependencies": { 1046 | "@babel/core": "^7.0.0-0" 1047 | } 1048 | }, 1049 | "node_modules/@babel/plugin-transform-modules-commonjs": { 1050 | "version": "7.24.7", 1051 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", 1052 | "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", 1053 | "dependencies": { 1054 | "@babel/helper-module-transforms": "^7.24.7", 1055 | "@babel/helper-plugin-utils": "^7.24.7", 1056 | "@babel/helper-simple-access": "^7.24.7" 1057 | }, 1058 | "engines": { 1059 | "node": ">=6.9.0" 1060 | }, 1061 | "peerDependencies": { 1062 | "@babel/core": "^7.0.0-0" 1063 | } 1064 | }, 1065 | "node_modules/@babel/plugin-transform-modules-systemjs": { 1066 | "version": "7.24.7", 1067 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", 1068 | "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", 1069 | "dependencies": { 1070 | "@babel/helper-hoist-variables": "^7.24.7", 1071 | "@babel/helper-module-transforms": "^7.24.7", 1072 | "@babel/helper-plugin-utils": "^7.24.7", 1073 | "@babel/helper-validator-identifier": "^7.24.7" 1074 | }, 1075 | "engines": { 1076 | "node": ">=6.9.0" 1077 | }, 1078 | "peerDependencies": { 1079 | "@babel/core": "^7.0.0-0" 1080 | } 1081 | }, 1082 | "node_modules/@babel/plugin-transform-modules-umd": { 1083 | "version": "7.24.7", 1084 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", 1085 | "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", 1086 | "dependencies": { 1087 | "@babel/helper-module-transforms": "^7.24.7", 1088 | "@babel/helper-plugin-utils": "^7.24.7" 1089 | }, 1090 | "engines": { 1091 | "node": ">=6.9.0" 1092 | }, 1093 | "peerDependencies": { 1094 | "@babel/core": "^7.0.0-0" 1095 | } 1096 | }, 1097 | "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { 1098 | "version": "7.24.7", 1099 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", 1100 | "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", 1101 | "dependencies": { 1102 | "@babel/helper-create-regexp-features-plugin": "^7.24.7", 1103 | "@babel/helper-plugin-utils": "^7.24.7" 1104 | }, 1105 | "engines": { 1106 | "node": ">=6.9.0" 1107 | }, 1108 | "peerDependencies": { 1109 | "@babel/core": "^7.0.0" 1110 | } 1111 | }, 1112 | "node_modules/@babel/plugin-transform-new-target": { 1113 | "version": "7.24.7", 1114 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", 1115 | "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", 1116 | "dependencies": { 1117 | "@babel/helper-plugin-utils": "^7.24.7" 1118 | }, 1119 | "engines": { 1120 | "node": ">=6.9.0" 1121 | }, 1122 | "peerDependencies": { 1123 | "@babel/core": "^7.0.0-0" 1124 | } 1125 | }, 1126 | "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { 1127 | "version": "7.24.7", 1128 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", 1129 | "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", 1130 | "dependencies": { 1131 | "@babel/helper-plugin-utils": "^7.24.7", 1132 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" 1133 | }, 1134 | "engines": { 1135 | "node": ">=6.9.0" 1136 | }, 1137 | "peerDependencies": { 1138 | "@babel/core": "^7.0.0-0" 1139 | } 1140 | }, 1141 | "node_modules/@babel/plugin-transform-numeric-separator": { 1142 | "version": "7.24.7", 1143 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", 1144 | "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", 1145 | "dependencies": { 1146 | "@babel/helper-plugin-utils": "^7.24.7", 1147 | "@babel/plugin-syntax-numeric-separator": "^7.10.4" 1148 | }, 1149 | "engines": { 1150 | "node": ">=6.9.0" 1151 | }, 1152 | "peerDependencies": { 1153 | "@babel/core": "^7.0.0-0" 1154 | } 1155 | }, 1156 | "node_modules/@babel/plugin-transform-object-rest-spread": { 1157 | "version": "7.24.7", 1158 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", 1159 | "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", 1160 | "dependencies": { 1161 | "@babel/helper-compilation-targets": "^7.24.7", 1162 | "@babel/helper-plugin-utils": "^7.24.7", 1163 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1164 | "@babel/plugin-transform-parameters": "^7.24.7" 1165 | }, 1166 | "engines": { 1167 | "node": ">=6.9.0" 1168 | }, 1169 | "peerDependencies": { 1170 | "@babel/core": "^7.0.0-0" 1171 | } 1172 | }, 1173 | "node_modules/@babel/plugin-transform-object-super": { 1174 | "version": "7.24.7", 1175 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", 1176 | "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", 1177 | "dependencies": { 1178 | "@babel/helper-plugin-utils": "^7.24.7", 1179 | "@babel/helper-replace-supers": "^7.24.7" 1180 | }, 1181 | "engines": { 1182 | "node": ">=6.9.0" 1183 | }, 1184 | "peerDependencies": { 1185 | "@babel/core": "^7.0.0-0" 1186 | } 1187 | }, 1188 | "node_modules/@babel/plugin-transform-optional-catch-binding": { 1189 | "version": "7.24.7", 1190 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", 1191 | "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", 1192 | "dependencies": { 1193 | "@babel/helper-plugin-utils": "^7.24.7", 1194 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" 1195 | }, 1196 | "engines": { 1197 | "node": ">=6.9.0" 1198 | }, 1199 | "peerDependencies": { 1200 | "@babel/core": "^7.0.0-0" 1201 | } 1202 | }, 1203 | "node_modules/@babel/plugin-transform-optional-chaining": { 1204 | "version": "7.24.7", 1205 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", 1206 | "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", 1207 | "dependencies": { 1208 | "@babel/helper-plugin-utils": "^7.24.7", 1209 | "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", 1210 | "@babel/plugin-syntax-optional-chaining": "^7.8.3" 1211 | }, 1212 | "engines": { 1213 | "node": ">=6.9.0" 1214 | }, 1215 | "peerDependencies": { 1216 | "@babel/core": "^7.0.0-0" 1217 | } 1218 | }, 1219 | "node_modules/@babel/plugin-transform-parameters": { 1220 | "version": "7.24.7", 1221 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", 1222 | "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", 1223 | "dependencies": { 1224 | "@babel/helper-plugin-utils": "^7.24.7" 1225 | }, 1226 | "engines": { 1227 | "node": ">=6.9.0" 1228 | }, 1229 | "peerDependencies": { 1230 | "@babel/core": "^7.0.0-0" 1231 | } 1232 | }, 1233 | "node_modules/@babel/plugin-transform-private-methods": { 1234 | "version": "7.24.7", 1235 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", 1236 | "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", 1237 | "dependencies": { 1238 | "@babel/helper-create-class-features-plugin": "^7.24.7", 1239 | "@babel/helper-plugin-utils": "^7.24.7" 1240 | }, 1241 | "engines": { 1242 | "node": ">=6.9.0" 1243 | }, 1244 | "peerDependencies": { 1245 | "@babel/core": "^7.0.0-0" 1246 | } 1247 | }, 1248 | "node_modules/@babel/plugin-transform-private-property-in-object": { 1249 | "version": "7.24.7", 1250 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", 1251 | "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", 1252 | "dependencies": { 1253 | "@babel/helper-annotate-as-pure": "^7.24.7", 1254 | "@babel/helper-create-class-features-plugin": "^7.24.7", 1255 | "@babel/helper-plugin-utils": "^7.24.7", 1256 | "@babel/plugin-syntax-private-property-in-object": "^7.14.5" 1257 | }, 1258 | "engines": { 1259 | "node": ">=6.9.0" 1260 | }, 1261 | "peerDependencies": { 1262 | "@babel/core": "^7.0.0-0" 1263 | } 1264 | }, 1265 | "node_modules/@babel/plugin-transform-property-literals": { 1266 | "version": "7.24.7", 1267 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", 1268 | "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", 1269 | "dependencies": { 1270 | "@babel/helper-plugin-utils": "^7.24.7" 1271 | }, 1272 | "engines": { 1273 | "node": ">=6.9.0" 1274 | }, 1275 | "peerDependencies": { 1276 | "@babel/core": "^7.0.0-0" 1277 | } 1278 | }, 1279 | "node_modules/@babel/plugin-transform-regenerator": { 1280 | "version": "7.24.7", 1281 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", 1282 | "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", 1283 | "dependencies": { 1284 | "@babel/helper-plugin-utils": "^7.24.7", 1285 | "regenerator-transform": "^0.15.2" 1286 | }, 1287 | "engines": { 1288 | "node": ">=6.9.0" 1289 | }, 1290 | "peerDependencies": { 1291 | "@babel/core": "^7.0.0-0" 1292 | } 1293 | }, 1294 | "node_modules/@babel/plugin-transform-reserved-words": { 1295 | "version": "7.24.7", 1296 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", 1297 | "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", 1298 | "dependencies": { 1299 | "@babel/helper-plugin-utils": "^7.24.7" 1300 | }, 1301 | "engines": { 1302 | "node": ">=6.9.0" 1303 | }, 1304 | "peerDependencies": { 1305 | "@babel/core": "^7.0.0-0" 1306 | } 1307 | }, 1308 | "node_modules/@babel/plugin-transform-shorthand-properties": { 1309 | "version": "7.24.7", 1310 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", 1311 | "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", 1312 | "dependencies": { 1313 | "@babel/helper-plugin-utils": "^7.24.7" 1314 | }, 1315 | "engines": { 1316 | "node": ">=6.9.0" 1317 | }, 1318 | "peerDependencies": { 1319 | "@babel/core": "^7.0.0-0" 1320 | } 1321 | }, 1322 | "node_modules/@babel/plugin-transform-spread": { 1323 | "version": "7.24.7", 1324 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", 1325 | "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", 1326 | "dependencies": { 1327 | "@babel/helper-plugin-utils": "^7.24.7", 1328 | "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" 1329 | }, 1330 | "engines": { 1331 | "node": ">=6.9.0" 1332 | }, 1333 | "peerDependencies": { 1334 | "@babel/core": "^7.0.0-0" 1335 | } 1336 | }, 1337 | "node_modules/@babel/plugin-transform-sticky-regex": { 1338 | "version": "7.24.7", 1339 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", 1340 | "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", 1341 | "dependencies": { 1342 | "@babel/helper-plugin-utils": "^7.24.7" 1343 | }, 1344 | "engines": { 1345 | "node": ">=6.9.0" 1346 | }, 1347 | "peerDependencies": { 1348 | "@babel/core": "^7.0.0-0" 1349 | } 1350 | }, 1351 | "node_modules/@babel/plugin-transform-template-literals": { 1352 | "version": "7.24.7", 1353 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", 1354 | "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", 1355 | "dependencies": { 1356 | "@babel/helper-plugin-utils": "^7.24.7" 1357 | }, 1358 | "engines": { 1359 | "node": ">=6.9.0" 1360 | }, 1361 | "peerDependencies": { 1362 | "@babel/core": "^7.0.0-0" 1363 | } 1364 | }, 1365 | "node_modules/@babel/plugin-transform-typeof-symbol": { 1366 | "version": "7.24.7", 1367 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", 1368 | "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", 1369 | "dependencies": { 1370 | "@babel/helper-plugin-utils": "^7.24.7" 1371 | }, 1372 | "engines": { 1373 | "node": ">=6.9.0" 1374 | }, 1375 | "peerDependencies": { 1376 | "@babel/core": "^7.0.0-0" 1377 | } 1378 | }, 1379 | "node_modules/@babel/plugin-transform-unicode-escapes": { 1380 | "version": "7.24.7", 1381 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", 1382 | "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", 1383 | "dependencies": { 1384 | "@babel/helper-plugin-utils": "^7.24.7" 1385 | }, 1386 | "engines": { 1387 | "node": ">=6.9.0" 1388 | }, 1389 | "peerDependencies": { 1390 | "@babel/core": "^7.0.0-0" 1391 | } 1392 | }, 1393 | "node_modules/@babel/plugin-transform-unicode-property-regex": { 1394 | "version": "7.24.7", 1395 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", 1396 | "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", 1397 | "dependencies": { 1398 | "@babel/helper-create-regexp-features-plugin": "^7.24.7", 1399 | "@babel/helper-plugin-utils": "^7.24.7" 1400 | }, 1401 | "engines": { 1402 | "node": ">=6.9.0" 1403 | }, 1404 | "peerDependencies": { 1405 | "@babel/core": "^7.0.0-0" 1406 | } 1407 | }, 1408 | "node_modules/@babel/plugin-transform-unicode-regex": { 1409 | "version": "7.24.7", 1410 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", 1411 | "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", 1412 | "dependencies": { 1413 | "@babel/helper-create-regexp-features-plugin": "^7.24.7", 1414 | "@babel/helper-plugin-utils": "^7.24.7" 1415 | }, 1416 | "engines": { 1417 | "node": ">=6.9.0" 1418 | }, 1419 | "peerDependencies": { 1420 | "@babel/core": "^7.0.0-0" 1421 | } 1422 | }, 1423 | "node_modules/@babel/plugin-transform-unicode-sets-regex": { 1424 | "version": "7.24.7", 1425 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", 1426 | "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", 1427 | "dependencies": { 1428 | "@babel/helper-create-regexp-features-plugin": "^7.24.7", 1429 | "@babel/helper-plugin-utils": "^7.24.7" 1430 | }, 1431 | "engines": { 1432 | "node": ">=6.9.0" 1433 | }, 1434 | "peerDependencies": { 1435 | "@babel/core": "^7.0.0" 1436 | } 1437 | }, 1438 | "node_modules/@babel/preset-env": { 1439 | "version": "7.24.7", 1440 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", 1441 | "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", 1442 | "dependencies": { 1443 | "@babel/compat-data": "^7.24.7", 1444 | "@babel/helper-compilation-targets": "^7.24.7", 1445 | "@babel/helper-plugin-utils": "^7.24.7", 1446 | "@babel/helper-validator-option": "^7.24.7", 1447 | "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", 1448 | "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", 1449 | "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", 1450 | "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", 1451 | "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", 1452 | "@babel/plugin-syntax-async-generators": "^7.8.4", 1453 | "@babel/plugin-syntax-class-properties": "^7.12.13", 1454 | "@babel/plugin-syntax-class-static-block": "^7.14.5", 1455 | "@babel/plugin-syntax-dynamic-import": "^7.8.3", 1456 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3", 1457 | "@babel/plugin-syntax-import-assertions": "^7.24.7", 1458 | "@babel/plugin-syntax-import-attributes": "^7.24.7", 1459 | "@babel/plugin-syntax-import-meta": "^7.10.4", 1460 | "@babel/plugin-syntax-json-strings": "^7.8.3", 1461 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", 1462 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 1463 | "@babel/plugin-syntax-numeric-separator": "^7.10.4", 1464 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1465 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 1466 | "@babel/plugin-syntax-optional-chaining": "^7.8.3", 1467 | "@babel/plugin-syntax-private-property-in-object": "^7.14.5", 1468 | "@babel/plugin-syntax-top-level-await": "^7.14.5", 1469 | "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", 1470 | "@babel/plugin-transform-arrow-functions": "^7.24.7", 1471 | "@babel/plugin-transform-async-generator-functions": "^7.24.7", 1472 | "@babel/plugin-transform-async-to-generator": "^7.24.7", 1473 | "@babel/plugin-transform-block-scoped-functions": "^7.24.7", 1474 | "@babel/plugin-transform-block-scoping": "^7.24.7", 1475 | "@babel/plugin-transform-class-properties": "^7.24.7", 1476 | "@babel/plugin-transform-class-static-block": "^7.24.7", 1477 | "@babel/plugin-transform-classes": "^7.24.7", 1478 | "@babel/plugin-transform-computed-properties": "^7.24.7", 1479 | "@babel/plugin-transform-destructuring": "^7.24.7", 1480 | "@babel/plugin-transform-dotall-regex": "^7.24.7", 1481 | "@babel/plugin-transform-duplicate-keys": "^7.24.7", 1482 | "@babel/plugin-transform-dynamic-import": "^7.24.7", 1483 | "@babel/plugin-transform-exponentiation-operator": "^7.24.7", 1484 | "@babel/plugin-transform-export-namespace-from": "^7.24.7", 1485 | "@babel/plugin-transform-for-of": "^7.24.7", 1486 | "@babel/plugin-transform-function-name": "^7.24.7", 1487 | "@babel/plugin-transform-json-strings": "^7.24.7", 1488 | "@babel/plugin-transform-literals": "^7.24.7", 1489 | "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", 1490 | "@babel/plugin-transform-member-expression-literals": "^7.24.7", 1491 | "@babel/plugin-transform-modules-amd": "^7.24.7", 1492 | "@babel/plugin-transform-modules-commonjs": "^7.24.7", 1493 | "@babel/plugin-transform-modules-systemjs": "^7.24.7", 1494 | "@babel/plugin-transform-modules-umd": "^7.24.7", 1495 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", 1496 | "@babel/plugin-transform-new-target": "^7.24.7", 1497 | "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", 1498 | "@babel/plugin-transform-numeric-separator": "^7.24.7", 1499 | "@babel/plugin-transform-object-rest-spread": "^7.24.7", 1500 | "@babel/plugin-transform-object-super": "^7.24.7", 1501 | "@babel/plugin-transform-optional-catch-binding": "^7.24.7", 1502 | "@babel/plugin-transform-optional-chaining": "^7.24.7", 1503 | "@babel/plugin-transform-parameters": "^7.24.7", 1504 | "@babel/plugin-transform-private-methods": "^7.24.7", 1505 | "@babel/plugin-transform-private-property-in-object": "^7.24.7", 1506 | "@babel/plugin-transform-property-literals": "^7.24.7", 1507 | "@babel/plugin-transform-regenerator": "^7.24.7", 1508 | "@babel/plugin-transform-reserved-words": "^7.24.7", 1509 | "@babel/plugin-transform-shorthand-properties": "^7.24.7", 1510 | "@babel/plugin-transform-spread": "^7.24.7", 1511 | "@babel/plugin-transform-sticky-regex": "^7.24.7", 1512 | "@babel/plugin-transform-template-literals": "^7.24.7", 1513 | "@babel/plugin-transform-typeof-symbol": "^7.24.7", 1514 | "@babel/plugin-transform-unicode-escapes": "^7.24.7", 1515 | "@babel/plugin-transform-unicode-property-regex": "^7.24.7", 1516 | "@babel/plugin-transform-unicode-regex": "^7.24.7", 1517 | "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", 1518 | "@babel/preset-modules": "0.1.6-no-external-plugins", 1519 | "babel-plugin-polyfill-corejs2": "^0.4.10", 1520 | "babel-plugin-polyfill-corejs3": "^0.10.4", 1521 | "babel-plugin-polyfill-regenerator": "^0.6.1", 1522 | "core-js-compat": "^3.31.0", 1523 | "semver": "^6.3.1" 1524 | }, 1525 | "engines": { 1526 | "node": ">=6.9.0" 1527 | }, 1528 | "peerDependencies": { 1529 | "@babel/core": "^7.0.0-0" 1530 | } 1531 | }, 1532 | "node_modules/@babel/preset-modules": { 1533 | "version": "0.1.6-no-external-plugins", 1534 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", 1535 | "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", 1536 | "dependencies": { 1537 | "@babel/helper-plugin-utils": "^7.0.0", 1538 | "@babel/types": "^7.4.4", 1539 | "esutils": "^2.0.2" 1540 | }, 1541 | "peerDependencies": { 1542 | "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" 1543 | } 1544 | }, 1545 | "node_modules/@babel/regjsgen": { 1546 | "version": "0.8.0", 1547 | "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", 1548 | "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" 1549 | }, 1550 | "node_modules/@babel/runtime": { 1551 | "version": "7.24.7", 1552 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", 1553 | "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", 1554 | "dependencies": { 1555 | "regenerator-runtime": "^0.14.0" 1556 | }, 1557 | "engines": { 1558 | "node": ">=6.9.0" 1559 | } 1560 | }, 1561 | "node_modules/@babel/template": { 1562 | "version": "7.24.7", 1563 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", 1564 | "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", 1565 | "dependencies": { 1566 | "@babel/code-frame": "^7.24.7", 1567 | "@babel/parser": "^7.24.7", 1568 | "@babel/types": "^7.24.7" 1569 | }, 1570 | "engines": { 1571 | "node": ">=6.9.0" 1572 | } 1573 | }, 1574 | "node_modules/@babel/traverse": { 1575 | "version": "7.24.7", 1576 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", 1577 | "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", 1578 | "dependencies": { 1579 | "@babel/code-frame": "^7.24.7", 1580 | "@babel/generator": "^7.24.7", 1581 | "@babel/helper-environment-visitor": "^7.24.7", 1582 | "@babel/helper-function-name": "^7.24.7", 1583 | "@babel/helper-hoist-variables": "^7.24.7", 1584 | "@babel/helper-split-export-declaration": "^7.24.7", 1585 | "@babel/parser": "^7.24.7", 1586 | "@babel/types": "^7.24.7", 1587 | "debug": "^4.3.1", 1588 | "globals": "^11.1.0" 1589 | }, 1590 | "engines": { 1591 | "node": ">=6.9.0" 1592 | } 1593 | }, 1594 | "node_modules/@babel/types": { 1595 | "version": "7.24.7", 1596 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", 1597 | "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", 1598 | "dependencies": { 1599 | "@babel/helper-string-parser": "^7.24.7", 1600 | "@babel/helper-validator-identifier": "^7.24.7", 1601 | "to-fast-properties": "^2.0.0" 1602 | }, 1603 | "engines": { 1604 | "node": ">=6.9.0" 1605 | } 1606 | }, 1607 | "node_modules/@discoveryjs/json-ext": { 1608 | "version": "0.5.7", 1609 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", 1610 | "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", 1611 | "engines": { 1612 | "node": ">=10.0.0" 1613 | } 1614 | }, 1615 | "node_modules/@jridgewell/gen-mapping": { 1616 | "version": "0.3.5", 1617 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 1618 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 1619 | "dependencies": { 1620 | "@jridgewell/set-array": "^1.2.1", 1621 | "@jridgewell/sourcemap-codec": "^1.4.10", 1622 | "@jridgewell/trace-mapping": "^0.3.24" 1623 | }, 1624 | "engines": { 1625 | "node": ">=6.0.0" 1626 | } 1627 | }, 1628 | "node_modules/@jridgewell/resolve-uri": { 1629 | "version": "3.1.2", 1630 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1631 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1632 | "engines": { 1633 | "node": ">=6.0.0" 1634 | } 1635 | }, 1636 | "node_modules/@jridgewell/set-array": { 1637 | "version": "1.2.1", 1638 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 1639 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 1640 | "engines": { 1641 | "node": ">=6.0.0" 1642 | } 1643 | }, 1644 | "node_modules/@jridgewell/source-map": { 1645 | "version": "0.3.6", 1646 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", 1647 | "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", 1648 | "dependencies": { 1649 | "@jridgewell/gen-mapping": "^0.3.5", 1650 | "@jridgewell/trace-mapping": "^0.3.25" 1651 | } 1652 | }, 1653 | "node_modules/@jridgewell/sourcemap-codec": { 1654 | "version": "1.4.15", 1655 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 1656 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 1657 | }, 1658 | "node_modules/@jridgewell/trace-mapping": { 1659 | "version": "0.3.25", 1660 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1661 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1662 | "dependencies": { 1663 | "@jridgewell/resolve-uri": "^3.1.0", 1664 | "@jridgewell/sourcemap-codec": "^1.4.14" 1665 | } 1666 | }, 1667 | "node_modules/@types/eslint": { 1668 | "version": "8.56.10", 1669 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", 1670 | "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", 1671 | "dependencies": { 1672 | "@types/estree": "*", 1673 | "@types/json-schema": "*" 1674 | } 1675 | }, 1676 | "node_modules/@types/eslint-scope": { 1677 | "version": "3.7.7", 1678 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", 1679 | "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", 1680 | "dependencies": { 1681 | "@types/eslint": "*", 1682 | "@types/estree": "*" 1683 | } 1684 | }, 1685 | "node_modules/@types/estree": { 1686 | "version": "0.0.50", 1687 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", 1688 | "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" 1689 | }, 1690 | "node_modules/@types/json-schema": { 1691 | "version": "7.0.15", 1692 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1693 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" 1694 | }, 1695 | "node_modules/@types/node": { 1696 | "version": "20.14.5", 1697 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", 1698 | "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", 1699 | "dependencies": { 1700 | "undici-types": "~5.26.4" 1701 | } 1702 | }, 1703 | "node_modules/@webassemblyjs/ast": { 1704 | "version": "1.11.1", 1705 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", 1706 | "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", 1707 | "dependencies": { 1708 | "@webassemblyjs/helper-numbers": "1.11.1", 1709 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1" 1710 | } 1711 | }, 1712 | "node_modules/@webassemblyjs/floating-point-hex-parser": { 1713 | "version": "1.11.1", 1714 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", 1715 | "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" 1716 | }, 1717 | "node_modules/@webassemblyjs/helper-api-error": { 1718 | "version": "1.11.1", 1719 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", 1720 | "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" 1721 | }, 1722 | "node_modules/@webassemblyjs/helper-buffer": { 1723 | "version": "1.11.1", 1724 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", 1725 | "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" 1726 | }, 1727 | "node_modules/@webassemblyjs/helper-numbers": { 1728 | "version": "1.11.1", 1729 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", 1730 | "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", 1731 | "dependencies": { 1732 | "@webassemblyjs/floating-point-hex-parser": "1.11.1", 1733 | "@webassemblyjs/helper-api-error": "1.11.1", 1734 | "@xtuc/long": "4.2.2" 1735 | } 1736 | }, 1737 | "node_modules/@webassemblyjs/helper-wasm-bytecode": { 1738 | "version": "1.11.1", 1739 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", 1740 | "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" 1741 | }, 1742 | "node_modules/@webassemblyjs/helper-wasm-section": { 1743 | "version": "1.11.1", 1744 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", 1745 | "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", 1746 | "dependencies": { 1747 | "@webassemblyjs/ast": "1.11.1", 1748 | "@webassemblyjs/helper-buffer": "1.11.1", 1749 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1750 | "@webassemblyjs/wasm-gen": "1.11.1" 1751 | } 1752 | }, 1753 | "node_modules/@webassemblyjs/ieee754": { 1754 | "version": "1.11.1", 1755 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", 1756 | "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", 1757 | "dependencies": { 1758 | "@xtuc/ieee754": "^1.2.0" 1759 | } 1760 | }, 1761 | "node_modules/@webassemblyjs/leb128": { 1762 | "version": "1.11.1", 1763 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", 1764 | "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", 1765 | "dependencies": { 1766 | "@xtuc/long": "4.2.2" 1767 | } 1768 | }, 1769 | "node_modules/@webassemblyjs/utf8": { 1770 | "version": "1.11.1", 1771 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", 1772 | "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" 1773 | }, 1774 | "node_modules/@webassemblyjs/wasm-edit": { 1775 | "version": "1.11.1", 1776 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", 1777 | "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", 1778 | "dependencies": { 1779 | "@webassemblyjs/ast": "1.11.1", 1780 | "@webassemblyjs/helper-buffer": "1.11.1", 1781 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1782 | "@webassemblyjs/helper-wasm-section": "1.11.1", 1783 | "@webassemblyjs/wasm-gen": "1.11.1", 1784 | "@webassemblyjs/wasm-opt": "1.11.1", 1785 | "@webassemblyjs/wasm-parser": "1.11.1", 1786 | "@webassemblyjs/wast-printer": "1.11.1" 1787 | } 1788 | }, 1789 | "node_modules/@webassemblyjs/wasm-gen": { 1790 | "version": "1.11.1", 1791 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", 1792 | "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", 1793 | "dependencies": { 1794 | "@webassemblyjs/ast": "1.11.1", 1795 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1796 | "@webassemblyjs/ieee754": "1.11.1", 1797 | "@webassemblyjs/leb128": "1.11.1", 1798 | "@webassemblyjs/utf8": "1.11.1" 1799 | } 1800 | }, 1801 | "node_modules/@webassemblyjs/wasm-opt": { 1802 | "version": "1.11.1", 1803 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", 1804 | "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", 1805 | "dependencies": { 1806 | "@webassemblyjs/ast": "1.11.1", 1807 | "@webassemblyjs/helper-buffer": "1.11.1", 1808 | "@webassemblyjs/wasm-gen": "1.11.1", 1809 | "@webassemblyjs/wasm-parser": "1.11.1" 1810 | } 1811 | }, 1812 | "node_modules/@webassemblyjs/wasm-parser": { 1813 | "version": "1.11.1", 1814 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", 1815 | "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", 1816 | "dependencies": { 1817 | "@webassemblyjs/ast": "1.11.1", 1818 | "@webassemblyjs/helper-api-error": "1.11.1", 1819 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1", 1820 | "@webassemblyjs/ieee754": "1.11.1", 1821 | "@webassemblyjs/leb128": "1.11.1", 1822 | "@webassemblyjs/utf8": "1.11.1" 1823 | } 1824 | }, 1825 | "node_modules/@webassemblyjs/wast-printer": { 1826 | "version": "1.11.1", 1827 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", 1828 | "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", 1829 | "dependencies": { 1830 | "@webassemblyjs/ast": "1.11.1", 1831 | "@xtuc/long": "4.2.2" 1832 | } 1833 | }, 1834 | "node_modules/@webpack-cli/configtest": { 1835 | "version": "2.1.1", 1836 | "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", 1837 | "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", 1838 | "engines": { 1839 | "node": ">=14.15.0" 1840 | }, 1841 | "peerDependencies": { 1842 | "webpack": "5.x.x", 1843 | "webpack-cli": "5.x.x" 1844 | } 1845 | }, 1846 | "node_modules/@webpack-cli/info": { 1847 | "version": "2.0.2", 1848 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", 1849 | "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", 1850 | "engines": { 1851 | "node": ">=14.15.0" 1852 | }, 1853 | "peerDependencies": { 1854 | "webpack": "5.x.x", 1855 | "webpack-cli": "5.x.x" 1856 | } 1857 | }, 1858 | "node_modules/@webpack-cli/serve": { 1859 | "version": "2.0.5", 1860 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", 1861 | "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", 1862 | "engines": { 1863 | "node": ">=14.15.0" 1864 | }, 1865 | "peerDependencies": { 1866 | "webpack": "5.x.x", 1867 | "webpack-cli": "5.x.x" 1868 | }, 1869 | "peerDependenciesMeta": { 1870 | "webpack-dev-server": { 1871 | "optional": true 1872 | } 1873 | } 1874 | }, 1875 | "node_modules/@xtuc/ieee754": { 1876 | "version": "1.2.0", 1877 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 1878 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" 1879 | }, 1880 | "node_modules/@xtuc/long": { 1881 | "version": "4.2.2", 1882 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 1883 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" 1884 | }, 1885 | "node_modules/acorn": { 1886 | "version": "8.12.0", 1887 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", 1888 | "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", 1889 | "bin": { 1890 | "acorn": "bin/acorn" 1891 | }, 1892 | "engines": { 1893 | "node": ">=0.4.0" 1894 | } 1895 | }, 1896 | "node_modules/acorn-import-assertions": { 1897 | "version": "1.9.0", 1898 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", 1899 | "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", 1900 | "peerDependencies": { 1901 | "acorn": "^8" 1902 | } 1903 | }, 1904 | "node_modules/ajv": { 1905 | "version": "8.16.0", 1906 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", 1907 | "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", 1908 | "dependencies": { 1909 | "fast-deep-equal": "^3.1.3", 1910 | "json-schema-traverse": "^1.0.0", 1911 | "require-from-string": "^2.0.2", 1912 | "uri-js": "^4.4.1" 1913 | }, 1914 | "funding": { 1915 | "type": "github", 1916 | "url": "https://github.com/sponsors/epoberezkin" 1917 | } 1918 | }, 1919 | "node_modules/ajv-formats": { 1920 | "version": "2.1.1", 1921 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 1922 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 1923 | "dependencies": { 1924 | "ajv": "^8.0.0" 1925 | }, 1926 | "peerDependencies": { 1927 | "ajv": "^8.0.0" 1928 | }, 1929 | "peerDependenciesMeta": { 1930 | "ajv": { 1931 | "optional": true 1932 | } 1933 | } 1934 | }, 1935 | "node_modules/ajv-keywords": { 1936 | "version": "5.1.0", 1937 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 1938 | "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 1939 | "dependencies": { 1940 | "fast-deep-equal": "^3.1.3" 1941 | }, 1942 | "peerDependencies": { 1943 | "ajv": "^8.8.2" 1944 | } 1945 | }, 1946 | "node_modules/ansi-styles": { 1947 | "version": "3.2.1", 1948 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1949 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1950 | "dependencies": { 1951 | "color-convert": "^1.9.0" 1952 | }, 1953 | "engines": { 1954 | "node": ">=4" 1955 | } 1956 | }, 1957 | "node_modules/babel-loader": { 1958 | "version": "9.1.3", 1959 | "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", 1960 | "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", 1961 | "dependencies": { 1962 | "find-cache-dir": "^4.0.0", 1963 | "schema-utils": "^4.0.0" 1964 | }, 1965 | "engines": { 1966 | "node": ">= 14.15.0" 1967 | }, 1968 | "peerDependencies": { 1969 | "@babel/core": "^7.12.0", 1970 | "webpack": ">=5" 1971 | } 1972 | }, 1973 | "node_modules/babel-plugin-polyfill-corejs2": { 1974 | "version": "0.4.11", 1975 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", 1976 | "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", 1977 | "dependencies": { 1978 | "@babel/compat-data": "^7.22.6", 1979 | "@babel/helper-define-polyfill-provider": "^0.6.2", 1980 | "semver": "^6.3.1" 1981 | }, 1982 | "peerDependencies": { 1983 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 1984 | } 1985 | }, 1986 | "node_modules/babel-plugin-polyfill-corejs3": { 1987 | "version": "0.10.4", 1988 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", 1989 | "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", 1990 | "dependencies": { 1991 | "@babel/helper-define-polyfill-provider": "^0.6.1", 1992 | "core-js-compat": "^3.36.1" 1993 | }, 1994 | "peerDependencies": { 1995 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 1996 | } 1997 | }, 1998 | "node_modules/babel-plugin-polyfill-regenerator": { 1999 | "version": "0.6.2", 2000 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", 2001 | "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", 2002 | "dependencies": { 2003 | "@babel/helper-define-polyfill-provider": "^0.6.2" 2004 | }, 2005 | "peerDependencies": { 2006 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 2007 | } 2008 | }, 2009 | "node_modules/braces": { 2010 | "version": "3.0.3", 2011 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 2012 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 2013 | "dependencies": { 2014 | "fill-range": "^7.1.1" 2015 | }, 2016 | "engines": { 2017 | "node": ">=8" 2018 | } 2019 | }, 2020 | "node_modules/browserslist": { 2021 | "version": "4.23.1", 2022 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", 2023 | "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", 2024 | "funding": [ 2025 | { 2026 | "type": "opencollective", 2027 | "url": "https://opencollective.com/browserslist" 2028 | }, 2029 | { 2030 | "type": "tidelift", 2031 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2032 | }, 2033 | { 2034 | "type": "github", 2035 | "url": "https://github.com/sponsors/ai" 2036 | } 2037 | ], 2038 | "dependencies": { 2039 | "caniuse-lite": "^1.0.30001629", 2040 | "electron-to-chromium": "^1.4.796", 2041 | "node-releases": "^2.0.14", 2042 | "update-browserslist-db": "^1.0.16" 2043 | }, 2044 | "bin": { 2045 | "browserslist": "cli.js" 2046 | }, 2047 | "engines": { 2048 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2049 | } 2050 | }, 2051 | "node_modules/buffer-from": { 2052 | "version": "1.1.2", 2053 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 2054 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 2055 | }, 2056 | "node_modules/caniuse-lite": { 2057 | "version": "1.0.30001636", 2058 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", 2059 | "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", 2060 | "funding": [ 2061 | { 2062 | "type": "opencollective", 2063 | "url": "https://opencollective.com/browserslist" 2064 | }, 2065 | { 2066 | "type": "tidelift", 2067 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 2068 | }, 2069 | { 2070 | "type": "github", 2071 | "url": "https://github.com/sponsors/ai" 2072 | } 2073 | ] 2074 | }, 2075 | "node_modules/chalk": { 2076 | "version": "2.4.2", 2077 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2078 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2079 | "dependencies": { 2080 | "ansi-styles": "^3.2.1", 2081 | "escape-string-regexp": "^1.0.5", 2082 | "supports-color": "^5.3.0" 2083 | }, 2084 | "engines": { 2085 | "node": ">=4" 2086 | } 2087 | }, 2088 | "node_modules/chrome-trace-event": { 2089 | "version": "1.0.4", 2090 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", 2091 | "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", 2092 | "engines": { 2093 | "node": ">=6.0" 2094 | } 2095 | }, 2096 | "node_modules/clone-deep": { 2097 | "version": "4.0.1", 2098 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 2099 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 2100 | "dependencies": { 2101 | "is-plain-object": "^2.0.4", 2102 | "kind-of": "^6.0.2", 2103 | "shallow-clone": "^3.0.0" 2104 | }, 2105 | "engines": { 2106 | "node": ">=6" 2107 | } 2108 | }, 2109 | "node_modules/color-convert": { 2110 | "version": "1.9.3", 2111 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2112 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2113 | "dependencies": { 2114 | "color-name": "1.1.3" 2115 | } 2116 | }, 2117 | "node_modules/color-name": { 2118 | "version": "1.1.3", 2119 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2120 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 2121 | }, 2122 | "node_modules/colorette": { 2123 | "version": "2.0.20", 2124 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", 2125 | "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" 2126 | }, 2127 | "node_modules/commander": { 2128 | "version": "2.20.3", 2129 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 2130 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 2131 | }, 2132 | "node_modules/common-path-prefix": { 2133 | "version": "3.0.0", 2134 | "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", 2135 | "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" 2136 | }, 2137 | "node_modules/convert-source-map": { 2138 | "version": "2.0.0", 2139 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2140 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" 2141 | }, 2142 | "node_modules/core-js-compat": { 2143 | "version": "3.37.1", 2144 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", 2145 | "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", 2146 | "dependencies": { 2147 | "browserslist": "^4.23.0" 2148 | }, 2149 | "funding": { 2150 | "type": "opencollective", 2151 | "url": "https://opencollective.com/core-js" 2152 | } 2153 | }, 2154 | "node_modules/cross-spawn": { 2155 | "version": "7.0.3", 2156 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 2157 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 2158 | "dependencies": { 2159 | "path-key": "^3.1.0", 2160 | "shebang-command": "^2.0.0", 2161 | "which": "^2.0.1" 2162 | }, 2163 | "engines": { 2164 | "node": ">= 8" 2165 | } 2166 | }, 2167 | "node_modules/debug": { 2168 | "version": "4.3.5", 2169 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 2170 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 2171 | "dependencies": { 2172 | "ms": "2.1.2" 2173 | }, 2174 | "engines": { 2175 | "node": ">=6.0" 2176 | }, 2177 | "peerDependenciesMeta": { 2178 | "supports-color": { 2179 | "optional": true 2180 | } 2181 | } 2182 | }, 2183 | "node_modules/electron-to-chromium": { 2184 | "version": "1.4.805", 2185 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz", 2186 | "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==" 2187 | }, 2188 | "node_modules/enhanced-resolve": { 2189 | "version": "5.17.0", 2190 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", 2191 | "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", 2192 | "dependencies": { 2193 | "graceful-fs": "^4.2.4", 2194 | "tapable": "^2.2.0" 2195 | }, 2196 | "engines": { 2197 | "node": ">=10.13.0" 2198 | } 2199 | }, 2200 | "node_modules/envinfo": { 2201 | "version": "7.13.0", 2202 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", 2203 | "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", 2204 | "bin": { 2205 | "envinfo": "dist/cli.js" 2206 | }, 2207 | "engines": { 2208 | "node": ">=4" 2209 | } 2210 | }, 2211 | "node_modules/es-module-lexer": { 2212 | "version": "0.9.3", 2213 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", 2214 | "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" 2215 | }, 2216 | "node_modules/escalade": { 2217 | "version": "3.1.2", 2218 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 2219 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 2220 | "engines": { 2221 | "node": ">=6" 2222 | } 2223 | }, 2224 | "node_modules/escape-string-regexp": { 2225 | "version": "1.0.5", 2226 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2227 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2228 | "engines": { 2229 | "node": ">=0.8.0" 2230 | } 2231 | }, 2232 | "node_modules/eslint-scope": { 2233 | "version": "5.1.1", 2234 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 2235 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 2236 | "dependencies": { 2237 | "esrecurse": "^4.3.0", 2238 | "estraverse": "^4.1.1" 2239 | }, 2240 | "engines": { 2241 | "node": ">=8.0.0" 2242 | } 2243 | }, 2244 | "node_modules/esrecurse": { 2245 | "version": "4.3.0", 2246 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2247 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2248 | "dependencies": { 2249 | "estraverse": "^5.2.0" 2250 | }, 2251 | "engines": { 2252 | "node": ">=4.0" 2253 | } 2254 | }, 2255 | "node_modules/esrecurse/node_modules/estraverse": { 2256 | "version": "5.3.0", 2257 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2258 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2259 | "engines": { 2260 | "node": ">=4.0" 2261 | } 2262 | }, 2263 | "node_modules/estraverse": { 2264 | "version": "4.3.0", 2265 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 2266 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 2267 | "engines": { 2268 | "node": ">=4.0" 2269 | } 2270 | }, 2271 | "node_modules/esutils": { 2272 | "version": "2.0.3", 2273 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2274 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2275 | "engines": { 2276 | "node": ">=0.10.0" 2277 | } 2278 | }, 2279 | "node_modules/events": { 2280 | "version": "3.3.0", 2281 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 2282 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 2283 | "engines": { 2284 | "node": ">=0.8.x" 2285 | } 2286 | }, 2287 | "node_modules/fast-deep-equal": { 2288 | "version": "3.1.3", 2289 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2290 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 2291 | }, 2292 | "node_modules/fast-json-stable-stringify": { 2293 | "version": "2.1.0", 2294 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2295 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 2296 | }, 2297 | "node_modules/fastest-levenshtein": { 2298 | "version": "1.0.16", 2299 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 2300 | "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 2301 | "engines": { 2302 | "node": ">= 4.9.1" 2303 | } 2304 | }, 2305 | "node_modules/fill-range": { 2306 | "version": "7.1.1", 2307 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2308 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2309 | "dependencies": { 2310 | "to-regex-range": "^5.0.1" 2311 | }, 2312 | "engines": { 2313 | "node": ">=8" 2314 | } 2315 | }, 2316 | "node_modules/find-cache-dir": { 2317 | "version": "4.0.0", 2318 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", 2319 | "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", 2320 | "dependencies": { 2321 | "common-path-prefix": "^3.0.0", 2322 | "pkg-dir": "^7.0.0" 2323 | }, 2324 | "engines": { 2325 | "node": ">=14.16" 2326 | }, 2327 | "funding": { 2328 | "url": "https://github.com/sponsors/sindresorhus" 2329 | } 2330 | }, 2331 | "node_modules/find-up": { 2332 | "version": "6.3.0", 2333 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", 2334 | "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", 2335 | "dependencies": { 2336 | "locate-path": "^7.1.0", 2337 | "path-exists": "^5.0.0" 2338 | }, 2339 | "engines": { 2340 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2341 | }, 2342 | "funding": { 2343 | "url": "https://github.com/sponsors/sindresorhus" 2344 | } 2345 | }, 2346 | "node_modules/flat": { 2347 | "version": "5.0.2", 2348 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 2349 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 2350 | "bin": { 2351 | "flat": "cli.js" 2352 | } 2353 | }, 2354 | "node_modules/function-bind": { 2355 | "version": "1.1.2", 2356 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2357 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 2358 | "funding": { 2359 | "url": "https://github.com/sponsors/ljharb" 2360 | } 2361 | }, 2362 | "node_modules/gensync": { 2363 | "version": "1.0.0-beta.2", 2364 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2365 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2366 | "engines": { 2367 | "node": ">=6.9.0" 2368 | } 2369 | }, 2370 | "node_modules/glob-to-regexp": { 2371 | "version": "0.4.1", 2372 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 2373 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" 2374 | }, 2375 | "node_modules/globals": { 2376 | "version": "11.12.0", 2377 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2378 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2379 | "engines": { 2380 | "node": ">=4" 2381 | } 2382 | }, 2383 | "node_modules/graceful-fs": { 2384 | "version": "4.2.11", 2385 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2386 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 2387 | }, 2388 | "node_modules/has-flag": { 2389 | "version": "3.0.0", 2390 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2391 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2392 | "engines": { 2393 | "node": ">=4" 2394 | } 2395 | }, 2396 | "node_modules/hasown": { 2397 | "version": "2.0.2", 2398 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2399 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2400 | "dependencies": { 2401 | "function-bind": "^1.1.2" 2402 | }, 2403 | "engines": { 2404 | "node": ">= 0.4" 2405 | } 2406 | }, 2407 | "node_modules/import-local": { 2408 | "version": "3.1.0", 2409 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 2410 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 2411 | "dependencies": { 2412 | "pkg-dir": "^4.2.0", 2413 | "resolve-cwd": "^3.0.0" 2414 | }, 2415 | "bin": { 2416 | "import-local-fixture": "fixtures/cli.js" 2417 | }, 2418 | "engines": { 2419 | "node": ">=8" 2420 | }, 2421 | "funding": { 2422 | "url": "https://github.com/sponsors/sindresorhus" 2423 | } 2424 | }, 2425 | "node_modules/import-local/node_modules/find-up": { 2426 | "version": "4.1.0", 2427 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 2428 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 2429 | "dependencies": { 2430 | "locate-path": "^5.0.0", 2431 | "path-exists": "^4.0.0" 2432 | }, 2433 | "engines": { 2434 | "node": ">=8" 2435 | } 2436 | }, 2437 | "node_modules/import-local/node_modules/locate-path": { 2438 | "version": "5.0.0", 2439 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2440 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2441 | "dependencies": { 2442 | "p-locate": "^4.1.0" 2443 | }, 2444 | "engines": { 2445 | "node": ">=8" 2446 | } 2447 | }, 2448 | "node_modules/import-local/node_modules/p-limit": { 2449 | "version": "2.3.0", 2450 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2451 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2452 | "dependencies": { 2453 | "p-try": "^2.0.0" 2454 | }, 2455 | "engines": { 2456 | "node": ">=6" 2457 | }, 2458 | "funding": { 2459 | "url": "https://github.com/sponsors/sindresorhus" 2460 | } 2461 | }, 2462 | "node_modules/import-local/node_modules/p-locate": { 2463 | "version": "4.1.0", 2464 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2465 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2466 | "dependencies": { 2467 | "p-limit": "^2.2.0" 2468 | }, 2469 | "engines": { 2470 | "node": ">=8" 2471 | } 2472 | }, 2473 | "node_modules/import-local/node_modules/path-exists": { 2474 | "version": "4.0.0", 2475 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2476 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2477 | "engines": { 2478 | "node": ">=8" 2479 | } 2480 | }, 2481 | "node_modules/import-local/node_modules/pkg-dir": { 2482 | "version": "4.2.0", 2483 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2484 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2485 | "dependencies": { 2486 | "find-up": "^4.0.0" 2487 | }, 2488 | "engines": { 2489 | "node": ">=8" 2490 | } 2491 | }, 2492 | "node_modules/interpret": { 2493 | "version": "3.1.1", 2494 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", 2495 | "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", 2496 | "engines": { 2497 | "node": ">=10.13.0" 2498 | } 2499 | }, 2500 | "node_modules/is-core-module": { 2501 | "version": "2.13.1", 2502 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 2503 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 2504 | "dependencies": { 2505 | "hasown": "^2.0.0" 2506 | }, 2507 | "funding": { 2508 | "url": "https://github.com/sponsors/ljharb" 2509 | } 2510 | }, 2511 | "node_modules/is-number": { 2512 | "version": "7.0.0", 2513 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2514 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2515 | "engines": { 2516 | "node": ">=0.12.0" 2517 | } 2518 | }, 2519 | "node_modules/is-plain-object": { 2520 | "version": "2.0.4", 2521 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 2522 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 2523 | "dependencies": { 2524 | "isobject": "^3.0.1" 2525 | }, 2526 | "engines": { 2527 | "node": ">=0.10.0" 2528 | } 2529 | }, 2530 | "node_modules/isexe": { 2531 | "version": "2.0.0", 2532 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2533 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 2534 | }, 2535 | "node_modules/isobject": { 2536 | "version": "3.0.1", 2537 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2538 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 2539 | "engines": { 2540 | "node": ">=0.10.0" 2541 | } 2542 | }, 2543 | "node_modules/jest-worker": { 2544 | "version": "27.5.1", 2545 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 2546 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 2547 | "dependencies": { 2548 | "@types/node": "*", 2549 | "merge-stream": "^2.0.0", 2550 | "supports-color": "^8.0.0" 2551 | }, 2552 | "engines": { 2553 | "node": ">= 10.13.0" 2554 | } 2555 | }, 2556 | "node_modules/jest-worker/node_modules/has-flag": { 2557 | "version": "4.0.0", 2558 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2559 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2560 | "engines": { 2561 | "node": ">=8" 2562 | } 2563 | }, 2564 | "node_modules/jest-worker/node_modules/supports-color": { 2565 | "version": "8.1.1", 2566 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2567 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2568 | "dependencies": { 2569 | "has-flag": "^4.0.0" 2570 | }, 2571 | "engines": { 2572 | "node": ">=10" 2573 | }, 2574 | "funding": { 2575 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2576 | } 2577 | }, 2578 | "node_modules/js-tokens": { 2579 | "version": "4.0.0", 2580 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2581 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 2582 | }, 2583 | "node_modules/jsesc": { 2584 | "version": "2.5.2", 2585 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2586 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2587 | "bin": { 2588 | "jsesc": "bin/jsesc" 2589 | }, 2590 | "engines": { 2591 | "node": ">=4" 2592 | } 2593 | }, 2594 | "node_modules/json-parse-better-errors": { 2595 | "version": "1.0.2", 2596 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 2597 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 2598 | }, 2599 | "node_modules/json-schema-traverse": { 2600 | "version": "1.0.0", 2601 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 2602 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 2603 | }, 2604 | "node_modules/json5": { 2605 | "version": "2.2.3", 2606 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2607 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2608 | "bin": { 2609 | "json5": "lib/cli.js" 2610 | }, 2611 | "engines": { 2612 | "node": ">=6" 2613 | } 2614 | }, 2615 | "node_modules/kind-of": { 2616 | "version": "6.0.3", 2617 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 2618 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 2619 | "engines": { 2620 | "node": ">=0.10.0" 2621 | } 2622 | }, 2623 | "node_modules/loader-runner": { 2624 | "version": "4.3.0", 2625 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 2626 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 2627 | "engines": { 2628 | "node": ">=6.11.5" 2629 | } 2630 | }, 2631 | "node_modules/locate-path": { 2632 | "version": "7.2.0", 2633 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", 2634 | "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", 2635 | "dependencies": { 2636 | "p-locate": "^6.0.0" 2637 | }, 2638 | "engines": { 2639 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2640 | }, 2641 | "funding": { 2642 | "url": "https://github.com/sponsors/sindresorhus" 2643 | } 2644 | }, 2645 | "node_modules/lodash.debounce": { 2646 | "version": "4.0.8", 2647 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 2648 | "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" 2649 | }, 2650 | "node_modules/lru-cache": { 2651 | "version": "5.1.1", 2652 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2653 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2654 | "dependencies": { 2655 | "yallist": "^3.0.2" 2656 | } 2657 | }, 2658 | "node_modules/merge-stream": { 2659 | "version": "2.0.0", 2660 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2661 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 2662 | }, 2663 | "node_modules/micromatch": { 2664 | "version": "4.0.7", 2665 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", 2666 | "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", 2667 | "dependencies": { 2668 | "braces": "^3.0.3", 2669 | "picomatch": "^2.3.1" 2670 | }, 2671 | "engines": { 2672 | "node": ">=8.6" 2673 | } 2674 | }, 2675 | "node_modules/mime-db": { 2676 | "version": "1.52.0", 2677 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2678 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2679 | "engines": { 2680 | "node": ">= 0.6" 2681 | } 2682 | }, 2683 | "node_modules/mime-types": { 2684 | "version": "2.1.35", 2685 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2686 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2687 | "dependencies": { 2688 | "mime-db": "1.52.0" 2689 | }, 2690 | "engines": { 2691 | "node": ">= 0.6" 2692 | } 2693 | }, 2694 | "node_modules/mkdirp": { 2695 | "version": "1.0.4", 2696 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2697 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2698 | "bin": { 2699 | "mkdirp": "bin/cmd.js" 2700 | }, 2701 | "engines": { 2702 | "node": ">=10" 2703 | } 2704 | }, 2705 | "node_modules/ms": { 2706 | "version": "2.1.2", 2707 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2708 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2709 | }, 2710 | "node_modules/neo-async": { 2711 | "version": "2.6.2", 2712 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 2713 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 2714 | }, 2715 | "node_modules/node-releases": { 2716 | "version": "2.0.14", 2717 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", 2718 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" 2719 | }, 2720 | "node_modules/p-limit": { 2721 | "version": "4.0.0", 2722 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", 2723 | "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", 2724 | "dependencies": { 2725 | "yocto-queue": "^1.0.0" 2726 | }, 2727 | "engines": { 2728 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2729 | }, 2730 | "funding": { 2731 | "url": "https://github.com/sponsors/sindresorhus" 2732 | } 2733 | }, 2734 | "node_modules/p-locate": { 2735 | "version": "6.0.0", 2736 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", 2737 | "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", 2738 | "dependencies": { 2739 | "p-limit": "^4.0.0" 2740 | }, 2741 | "engines": { 2742 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2743 | }, 2744 | "funding": { 2745 | "url": "https://github.com/sponsors/sindresorhus" 2746 | } 2747 | }, 2748 | "node_modules/p-try": { 2749 | "version": "2.2.0", 2750 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2751 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2752 | "engines": { 2753 | "node": ">=6" 2754 | } 2755 | }, 2756 | "node_modules/path-exists": { 2757 | "version": "5.0.0", 2758 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", 2759 | "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", 2760 | "engines": { 2761 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2762 | } 2763 | }, 2764 | "node_modules/path-key": { 2765 | "version": "3.1.1", 2766 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2767 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2768 | "engines": { 2769 | "node": ">=8" 2770 | } 2771 | }, 2772 | "node_modules/path-parse": { 2773 | "version": "1.0.7", 2774 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2775 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 2776 | }, 2777 | "node_modules/picocolors": { 2778 | "version": "1.0.1", 2779 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 2780 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" 2781 | }, 2782 | "node_modules/picomatch": { 2783 | "version": "2.3.1", 2784 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2785 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2786 | "engines": { 2787 | "node": ">=8.6" 2788 | }, 2789 | "funding": { 2790 | "url": "https://github.com/sponsors/jonschlinkert" 2791 | } 2792 | }, 2793 | "node_modules/pkg-dir": { 2794 | "version": "7.0.0", 2795 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", 2796 | "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", 2797 | "dependencies": { 2798 | "find-up": "^6.3.0" 2799 | }, 2800 | "engines": { 2801 | "node": ">=14.16" 2802 | }, 2803 | "funding": { 2804 | "url": "https://github.com/sponsors/sindresorhus" 2805 | } 2806 | }, 2807 | "node_modules/punycode": { 2808 | "version": "2.3.1", 2809 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2810 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2811 | "engines": { 2812 | "node": ">=6" 2813 | } 2814 | }, 2815 | "node_modules/randombytes": { 2816 | "version": "2.1.0", 2817 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2818 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2819 | "dependencies": { 2820 | "safe-buffer": "^5.1.0" 2821 | } 2822 | }, 2823 | "node_modules/rechoir": { 2824 | "version": "0.8.0", 2825 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", 2826 | "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", 2827 | "dependencies": { 2828 | "resolve": "^1.20.0" 2829 | }, 2830 | "engines": { 2831 | "node": ">= 10.13.0" 2832 | } 2833 | }, 2834 | "node_modules/regenerate": { 2835 | "version": "1.4.2", 2836 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", 2837 | "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" 2838 | }, 2839 | "node_modules/regenerate-unicode-properties": { 2840 | "version": "10.1.1", 2841 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", 2842 | "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", 2843 | "dependencies": { 2844 | "regenerate": "^1.4.2" 2845 | }, 2846 | "engines": { 2847 | "node": ">=4" 2848 | } 2849 | }, 2850 | "node_modules/regenerator-runtime": { 2851 | "version": "0.14.1", 2852 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 2853 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" 2854 | }, 2855 | "node_modules/regenerator-transform": { 2856 | "version": "0.15.2", 2857 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", 2858 | "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", 2859 | "dependencies": { 2860 | "@babel/runtime": "^7.8.4" 2861 | } 2862 | }, 2863 | "node_modules/regexpu-core": { 2864 | "version": "5.3.2", 2865 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", 2866 | "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", 2867 | "dependencies": { 2868 | "@babel/regjsgen": "^0.8.0", 2869 | "regenerate": "^1.4.2", 2870 | "regenerate-unicode-properties": "^10.1.0", 2871 | "regjsparser": "^0.9.1", 2872 | "unicode-match-property-ecmascript": "^2.0.0", 2873 | "unicode-match-property-value-ecmascript": "^2.1.0" 2874 | }, 2875 | "engines": { 2876 | "node": ">=4" 2877 | } 2878 | }, 2879 | "node_modules/regjsparser": { 2880 | "version": "0.9.1", 2881 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", 2882 | "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", 2883 | "dependencies": { 2884 | "jsesc": "~0.5.0" 2885 | }, 2886 | "bin": { 2887 | "regjsparser": "bin/parser" 2888 | } 2889 | }, 2890 | "node_modules/regjsparser/node_modules/jsesc": { 2891 | "version": "0.5.0", 2892 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 2893 | "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", 2894 | "bin": { 2895 | "jsesc": "bin/jsesc" 2896 | } 2897 | }, 2898 | "node_modules/require-from-string": { 2899 | "version": "2.0.2", 2900 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2901 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2902 | "engines": { 2903 | "node": ">=0.10.0" 2904 | } 2905 | }, 2906 | "node_modules/resolve": { 2907 | "version": "1.22.8", 2908 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 2909 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 2910 | "dependencies": { 2911 | "is-core-module": "^2.13.0", 2912 | "path-parse": "^1.0.7", 2913 | "supports-preserve-symlinks-flag": "^1.0.0" 2914 | }, 2915 | "bin": { 2916 | "resolve": "bin/resolve" 2917 | }, 2918 | "funding": { 2919 | "url": "https://github.com/sponsors/ljharb" 2920 | } 2921 | }, 2922 | "node_modules/resolve-cwd": { 2923 | "version": "3.0.0", 2924 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 2925 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 2926 | "dependencies": { 2927 | "resolve-from": "^5.0.0" 2928 | }, 2929 | "engines": { 2930 | "node": ">=8" 2931 | } 2932 | }, 2933 | "node_modules/resolve-from": { 2934 | "version": "5.0.0", 2935 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2936 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2937 | "engines": { 2938 | "node": ">=8" 2939 | } 2940 | }, 2941 | "node_modules/safe-buffer": { 2942 | "version": "5.2.1", 2943 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2944 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2945 | "funding": [ 2946 | { 2947 | "type": "github", 2948 | "url": "https://github.com/sponsors/feross" 2949 | }, 2950 | { 2951 | "type": "patreon", 2952 | "url": "https://www.patreon.com/feross" 2953 | }, 2954 | { 2955 | "type": "consulting", 2956 | "url": "https://feross.org/support" 2957 | } 2958 | ] 2959 | }, 2960 | "node_modules/schema-utils": { 2961 | "version": "4.2.0", 2962 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", 2963 | "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", 2964 | "dependencies": { 2965 | "@types/json-schema": "^7.0.9", 2966 | "ajv": "^8.9.0", 2967 | "ajv-formats": "^2.1.1", 2968 | "ajv-keywords": "^5.1.0" 2969 | }, 2970 | "engines": { 2971 | "node": ">= 12.13.0" 2972 | }, 2973 | "funding": { 2974 | "type": "opencollective", 2975 | "url": "https://opencollective.com/webpack" 2976 | } 2977 | }, 2978 | "node_modules/semver": { 2979 | "version": "6.3.1", 2980 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2981 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2982 | "bin": { 2983 | "semver": "bin/semver.js" 2984 | } 2985 | }, 2986 | "node_modules/serialize-javascript": { 2987 | "version": "6.0.2", 2988 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 2989 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 2990 | "dependencies": { 2991 | "randombytes": "^2.1.0" 2992 | } 2993 | }, 2994 | "node_modules/shallow-clone": { 2995 | "version": "3.0.1", 2996 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 2997 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 2998 | "dependencies": { 2999 | "kind-of": "^6.0.2" 3000 | }, 3001 | "engines": { 3002 | "node": ">=8" 3003 | } 3004 | }, 3005 | "node_modules/shebang-command": { 3006 | "version": "2.0.0", 3007 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3008 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3009 | "dependencies": { 3010 | "shebang-regex": "^3.0.0" 3011 | }, 3012 | "engines": { 3013 | "node": ">=8" 3014 | } 3015 | }, 3016 | "node_modules/shebang-regex": { 3017 | "version": "3.0.0", 3018 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3019 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3020 | "engines": { 3021 | "node": ">=8" 3022 | } 3023 | }, 3024 | "node_modules/source-map": { 3025 | "version": "0.6.1", 3026 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3027 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3028 | "engines": { 3029 | "node": ">=0.10.0" 3030 | } 3031 | }, 3032 | "node_modules/source-map-support": { 3033 | "version": "0.5.21", 3034 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 3035 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 3036 | "dependencies": { 3037 | "buffer-from": "^1.0.0", 3038 | "source-map": "^0.6.0" 3039 | } 3040 | }, 3041 | "node_modules/supports-color": { 3042 | "version": "5.5.0", 3043 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3044 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3045 | "dependencies": { 3046 | "has-flag": "^3.0.0" 3047 | }, 3048 | "engines": { 3049 | "node": ">=4" 3050 | } 3051 | }, 3052 | "node_modules/supports-preserve-symlinks-flag": { 3053 | "version": "1.0.0", 3054 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3055 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3056 | "engines": { 3057 | "node": ">= 0.4" 3058 | }, 3059 | "funding": { 3060 | "url": "https://github.com/sponsors/ljharb" 3061 | } 3062 | }, 3063 | "node_modules/tapable": { 3064 | "version": "2.2.1", 3065 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 3066 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 3067 | "engines": { 3068 | "node": ">=6" 3069 | } 3070 | }, 3071 | "node_modules/terser": { 3072 | "version": "5.31.1", 3073 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", 3074 | "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", 3075 | "dependencies": { 3076 | "@jridgewell/source-map": "^0.3.3", 3077 | "acorn": "^8.8.2", 3078 | "commander": "^2.20.0", 3079 | "source-map-support": "~0.5.20" 3080 | }, 3081 | "bin": { 3082 | "terser": "bin/terser" 3083 | }, 3084 | "engines": { 3085 | "node": ">=10" 3086 | } 3087 | }, 3088 | "node_modules/terser-webpack-plugin": { 3089 | "version": "5.3.10", 3090 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", 3091 | "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", 3092 | "dependencies": { 3093 | "@jridgewell/trace-mapping": "^0.3.20", 3094 | "jest-worker": "^27.4.5", 3095 | "schema-utils": "^3.1.1", 3096 | "serialize-javascript": "^6.0.1", 3097 | "terser": "^5.26.0" 3098 | }, 3099 | "engines": { 3100 | "node": ">= 10.13.0" 3101 | }, 3102 | "funding": { 3103 | "type": "opencollective", 3104 | "url": "https://opencollective.com/webpack" 3105 | }, 3106 | "peerDependencies": { 3107 | "webpack": "^5.1.0" 3108 | }, 3109 | "peerDependenciesMeta": { 3110 | "@swc/core": { 3111 | "optional": true 3112 | }, 3113 | "esbuild": { 3114 | "optional": true 3115 | }, 3116 | "uglify-js": { 3117 | "optional": true 3118 | } 3119 | } 3120 | }, 3121 | "node_modules/terser-webpack-plugin/node_modules/ajv": { 3122 | "version": "6.12.6", 3123 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 3124 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 3125 | "dependencies": { 3126 | "fast-deep-equal": "^3.1.1", 3127 | "fast-json-stable-stringify": "^2.0.0", 3128 | "json-schema-traverse": "^0.4.1", 3129 | "uri-js": "^4.2.2" 3130 | }, 3131 | "funding": { 3132 | "type": "github", 3133 | "url": "https://github.com/sponsors/epoberezkin" 3134 | } 3135 | }, 3136 | "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { 3137 | "version": "3.5.2", 3138 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 3139 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 3140 | "peerDependencies": { 3141 | "ajv": "^6.9.1" 3142 | } 3143 | }, 3144 | "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { 3145 | "version": "0.4.1", 3146 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3147 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 3148 | }, 3149 | "node_modules/terser-webpack-plugin/node_modules/schema-utils": { 3150 | "version": "3.3.0", 3151 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", 3152 | "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", 3153 | "dependencies": { 3154 | "@types/json-schema": "^7.0.8", 3155 | "ajv": "^6.12.5", 3156 | "ajv-keywords": "^3.5.2" 3157 | }, 3158 | "engines": { 3159 | "node": ">= 10.13.0" 3160 | }, 3161 | "funding": { 3162 | "type": "opencollective", 3163 | "url": "https://opencollective.com/webpack" 3164 | } 3165 | }, 3166 | "node_modules/to-fast-properties": { 3167 | "version": "2.0.0", 3168 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3169 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 3170 | "engines": { 3171 | "node": ">=4" 3172 | } 3173 | }, 3174 | "node_modules/to-regex-range": { 3175 | "version": "5.0.1", 3176 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3177 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3178 | "dependencies": { 3179 | "is-number": "^7.0.0" 3180 | }, 3181 | "engines": { 3182 | "node": ">=8.0" 3183 | } 3184 | }, 3185 | "node_modules/ts-loader": { 3186 | "version": "9.2.6", 3187 | "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", 3188 | "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", 3189 | "dependencies": { 3190 | "chalk": "^4.1.0", 3191 | "enhanced-resolve": "^5.0.0", 3192 | "micromatch": "^4.0.0", 3193 | "semver": "^7.3.4" 3194 | }, 3195 | "engines": { 3196 | "node": ">=12.0.0" 3197 | }, 3198 | "peerDependencies": { 3199 | "typescript": "*", 3200 | "webpack": "^5.0.0" 3201 | } 3202 | }, 3203 | "node_modules/ts-loader/node_modules/ansi-styles": { 3204 | "version": "4.3.0", 3205 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3206 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3207 | "dependencies": { 3208 | "color-convert": "^2.0.1" 3209 | }, 3210 | "engines": { 3211 | "node": ">=8" 3212 | }, 3213 | "funding": { 3214 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3215 | } 3216 | }, 3217 | "node_modules/ts-loader/node_modules/chalk": { 3218 | "version": "4.1.2", 3219 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 3220 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 3221 | "dependencies": { 3222 | "ansi-styles": "^4.1.0", 3223 | "supports-color": "^7.1.0" 3224 | }, 3225 | "engines": { 3226 | "node": ">=10" 3227 | }, 3228 | "funding": { 3229 | "url": "https://github.com/chalk/chalk?sponsor=1" 3230 | } 3231 | }, 3232 | "node_modules/ts-loader/node_modules/color-convert": { 3233 | "version": "2.0.1", 3234 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3235 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3236 | "dependencies": { 3237 | "color-name": "~1.1.4" 3238 | }, 3239 | "engines": { 3240 | "node": ">=7.0.0" 3241 | } 3242 | }, 3243 | "node_modules/ts-loader/node_modules/color-name": { 3244 | "version": "1.1.4", 3245 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3246 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 3247 | }, 3248 | "node_modules/ts-loader/node_modules/has-flag": { 3249 | "version": "4.0.0", 3250 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3251 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3252 | "engines": { 3253 | "node": ">=8" 3254 | } 3255 | }, 3256 | "node_modules/ts-loader/node_modules/semver": { 3257 | "version": "7.6.2", 3258 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", 3259 | "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", 3260 | "bin": { 3261 | "semver": "bin/semver.js" 3262 | }, 3263 | "engines": { 3264 | "node": ">=10" 3265 | } 3266 | }, 3267 | "node_modules/ts-loader/node_modules/supports-color": { 3268 | "version": "7.2.0", 3269 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3270 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3271 | "dependencies": { 3272 | "has-flag": "^4.0.0" 3273 | }, 3274 | "engines": { 3275 | "node": ">=8" 3276 | } 3277 | }, 3278 | "node_modules/tslib": { 3279 | "version": "2.3.1", 3280 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 3281 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 3282 | }, 3283 | "node_modules/typescript": { 3284 | "version": "4.4.4", 3285 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", 3286 | "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", 3287 | "bin": { 3288 | "tsc": "bin/tsc", 3289 | "tsserver": "bin/tsserver" 3290 | }, 3291 | "engines": { 3292 | "node": ">=4.2.0" 3293 | } 3294 | }, 3295 | "node_modules/undici-types": { 3296 | "version": "5.26.5", 3297 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 3298 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 3299 | }, 3300 | "node_modules/unicode-canonical-property-names-ecmascript": { 3301 | "version": "2.0.0", 3302 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", 3303 | "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", 3304 | "engines": { 3305 | "node": ">=4" 3306 | } 3307 | }, 3308 | "node_modules/unicode-match-property-ecmascript": { 3309 | "version": "2.0.0", 3310 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", 3311 | "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", 3312 | "dependencies": { 3313 | "unicode-canonical-property-names-ecmascript": "^2.0.0", 3314 | "unicode-property-aliases-ecmascript": "^2.0.0" 3315 | }, 3316 | "engines": { 3317 | "node": ">=4" 3318 | } 3319 | }, 3320 | "node_modules/unicode-match-property-value-ecmascript": { 3321 | "version": "2.1.0", 3322 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", 3323 | "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", 3324 | "engines": { 3325 | "node": ">=4" 3326 | } 3327 | }, 3328 | "node_modules/unicode-property-aliases-ecmascript": { 3329 | "version": "2.1.0", 3330 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", 3331 | "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", 3332 | "engines": { 3333 | "node": ">=4" 3334 | } 3335 | }, 3336 | "node_modules/update-browserslist-db": { 3337 | "version": "1.0.16", 3338 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", 3339 | "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", 3340 | "funding": [ 3341 | { 3342 | "type": "opencollective", 3343 | "url": "https://opencollective.com/browserslist" 3344 | }, 3345 | { 3346 | "type": "tidelift", 3347 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3348 | }, 3349 | { 3350 | "type": "github", 3351 | "url": "https://github.com/sponsors/ai" 3352 | } 3353 | ], 3354 | "dependencies": { 3355 | "escalade": "^3.1.2", 3356 | "picocolors": "^1.0.1" 3357 | }, 3358 | "bin": { 3359 | "update-browserslist-db": "cli.js" 3360 | }, 3361 | "peerDependencies": { 3362 | "browserslist": ">= 4.21.0" 3363 | } 3364 | }, 3365 | "node_modules/uri-js": { 3366 | "version": "4.4.1", 3367 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3368 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3369 | "dependencies": { 3370 | "punycode": "^2.1.0" 3371 | } 3372 | }, 3373 | "node_modules/watchpack": { 3374 | "version": "2.4.1", 3375 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", 3376 | "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", 3377 | "dependencies": { 3378 | "glob-to-regexp": "^0.4.1", 3379 | "graceful-fs": "^4.1.2" 3380 | }, 3381 | "engines": { 3382 | "node": ">=10.13.0" 3383 | } 3384 | }, 3385 | "node_modules/webpack": { 3386 | "version": "5.63.0", 3387 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.63.0.tgz", 3388 | "integrity": "sha512-HYrw6bkj/MDmphAXvqLEvn2fVoDZsYu6O638WjK6lSNgIpjb5jl/KtOrqJyU9EC/ZV9mLUmZW5h4mASB+CVA4A==", 3389 | "dependencies": { 3390 | "@types/eslint-scope": "^3.7.0", 3391 | "@types/estree": "^0.0.50", 3392 | "@webassemblyjs/ast": "1.11.1", 3393 | "@webassemblyjs/wasm-edit": "1.11.1", 3394 | "@webassemblyjs/wasm-parser": "1.11.1", 3395 | "acorn": "^8.4.1", 3396 | "acorn-import-assertions": "^1.7.6", 3397 | "browserslist": "^4.14.5", 3398 | "chrome-trace-event": "^1.0.2", 3399 | "enhanced-resolve": "^5.8.3", 3400 | "es-module-lexer": "^0.9.0", 3401 | "eslint-scope": "5.1.1", 3402 | "events": "^3.2.0", 3403 | "glob-to-regexp": "^0.4.1", 3404 | "graceful-fs": "^4.2.4", 3405 | "json-parse-better-errors": "^1.0.2", 3406 | "loader-runner": "^4.2.0", 3407 | "mime-types": "^2.1.27", 3408 | "neo-async": "^2.6.2", 3409 | "schema-utils": "^3.1.0", 3410 | "tapable": "^2.1.1", 3411 | "terser-webpack-plugin": "^5.1.3", 3412 | "watchpack": "^2.2.0", 3413 | "webpack-sources": "^3.2.0" 3414 | }, 3415 | "bin": { 3416 | "webpack": "bin/webpack.js" 3417 | }, 3418 | "engines": { 3419 | "node": ">=10.13.0" 3420 | }, 3421 | "funding": { 3422 | "type": "opencollective", 3423 | "url": "https://opencollective.com/webpack" 3424 | }, 3425 | "peerDependenciesMeta": { 3426 | "webpack-cli": { 3427 | "optional": true 3428 | } 3429 | } 3430 | }, 3431 | "node_modules/webpack-cli": { 3432 | "version": "5.1.4", 3433 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", 3434 | "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", 3435 | "dependencies": { 3436 | "@discoveryjs/json-ext": "^0.5.0", 3437 | "@webpack-cli/configtest": "^2.1.1", 3438 | "@webpack-cli/info": "^2.0.2", 3439 | "@webpack-cli/serve": "^2.0.5", 3440 | "colorette": "^2.0.14", 3441 | "commander": "^10.0.1", 3442 | "cross-spawn": "^7.0.3", 3443 | "envinfo": "^7.7.3", 3444 | "fastest-levenshtein": "^1.0.12", 3445 | "import-local": "^3.0.2", 3446 | "interpret": "^3.1.1", 3447 | "rechoir": "^0.8.0", 3448 | "webpack-merge": "^5.7.3" 3449 | }, 3450 | "bin": { 3451 | "webpack-cli": "bin/cli.js" 3452 | }, 3453 | "engines": { 3454 | "node": ">=14.15.0" 3455 | }, 3456 | "funding": { 3457 | "type": "opencollective", 3458 | "url": "https://opencollective.com/webpack" 3459 | }, 3460 | "peerDependencies": { 3461 | "webpack": "5.x.x" 3462 | }, 3463 | "peerDependenciesMeta": { 3464 | "@webpack-cli/generators": { 3465 | "optional": true 3466 | }, 3467 | "webpack-bundle-analyzer": { 3468 | "optional": true 3469 | }, 3470 | "webpack-dev-server": { 3471 | "optional": true 3472 | } 3473 | } 3474 | }, 3475 | "node_modules/webpack-cli/node_modules/commander": { 3476 | "version": "10.0.1", 3477 | "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", 3478 | "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", 3479 | "engines": { 3480 | "node": ">=14" 3481 | } 3482 | }, 3483 | "node_modules/webpack-merge": { 3484 | "version": "5.10.0", 3485 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", 3486 | "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", 3487 | "dependencies": { 3488 | "clone-deep": "^4.0.1", 3489 | "flat": "^5.0.2", 3490 | "wildcard": "^2.0.0" 3491 | }, 3492 | "engines": { 3493 | "node": ">=10.0.0" 3494 | } 3495 | }, 3496 | "node_modules/webpack-sources": { 3497 | "version": "3.2.3", 3498 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 3499 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 3500 | "engines": { 3501 | "node": ">=10.13.0" 3502 | } 3503 | }, 3504 | "node_modules/webpack/node_modules/ajv": { 3505 | "version": "6.12.6", 3506 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 3507 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 3508 | "dependencies": { 3509 | "fast-deep-equal": "^3.1.1", 3510 | "fast-json-stable-stringify": "^2.0.0", 3511 | "json-schema-traverse": "^0.4.1", 3512 | "uri-js": "^4.2.2" 3513 | }, 3514 | "funding": { 3515 | "type": "github", 3516 | "url": "https://github.com/sponsors/epoberezkin" 3517 | } 3518 | }, 3519 | "node_modules/webpack/node_modules/ajv-keywords": { 3520 | "version": "3.5.2", 3521 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 3522 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 3523 | "peerDependencies": { 3524 | "ajv": "^6.9.1" 3525 | } 3526 | }, 3527 | "node_modules/webpack/node_modules/json-schema-traverse": { 3528 | "version": "0.4.1", 3529 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3530 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 3531 | }, 3532 | "node_modules/webpack/node_modules/schema-utils": { 3533 | "version": "3.3.0", 3534 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", 3535 | "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", 3536 | "dependencies": { 3537 | "@types/json-schema": "^7.0.8", 3538 | "ajv": "^6.12.5", 3539 | "ajv-keywords": "^3.5.2" 3540 | }, 3541 | "engines": { 3542 | "node": ">= 10.13.0" 3543 | }, 3544 | "funding": { 3545 | "type": "opencollective", 3546 | "url": "https://opencollective.com/webpack" 3547 | } 3548 | }, 3549 | "node_modules/which": { 3550 | "version": "2.0.2", 3551 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3552 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3553 | "dependencies": { 3554 | "isexe": "^2.0.0" 3555 | }, 3556 | "bin": { 3557 | "node-which": "bin/node-which" 3558 | }, 3559 | "engines": { 3560 | "node": ">= 8" 3561 | } 3562 | }, 3563 | "node_modules/wildcard": { 3564 | "version": "2.0.1", 3565 | "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", 3566 | "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" 3567 | }, 3568 | "node_modules/yallist": { 3569 | "version": "3.1.1", 3570 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3571 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 3572 | }, 3573 | "node_modules/yocto-queue": { 3574 | "version": "1.0.0", 3575 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", 3576 | "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", 3577 | "engines": { 3578 | "node": ">=12.20" 3579 | }, 3580 | "funding": { 3581 | "url": "https://github.com/sponsors/sindresorhus" 3582 | } 3583 | } 3584 | } 3585 | } 3586 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@customrealms/cli", 3 | "version": "2.0.0", 4 | "description": "", 5 | "scripts": { 6 | "postinstall": "node postinstall.js install", 7 | "preuninstall": "node postinstall.js uninstall" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/customrealms/cli.git" 12 | }, 13 | "publishConfig": { 14 | "access": "public" 15 | }, 16 | "keywords": [], 17 | "author": "Conner Douglass", 18 | "license": "MIT", 19 | "goBinary": { 20 | "name": "crx", 21 | "path": "./bin" 22 | }, 23 | "files": [ 24 | "dist", 25 | "postinstall.js" 26 | ], 27 | "dependencies": { 28 | "@babel/core": "7.24.7", 29 | "@babel/preset-env": "^7.24.7", 30 | "babel-loader": "9.1.3", 31 | "mkdirp": "1.0.4", 32 | "ts-loader": "9.2.6", 33 | "tslib": "2.3.1", 34 | "typescript": "4.4.4", 35 | "webpack": "5.63.0", 36 | "webpack-cli": "5.1.4" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /postinstall.js: -------------------------------------------------------------------------------- 1 | // Thanks to author of https://github.com/sanathkr/go-npm, we were able to modify his code to work with private packages 2 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 3 | 4 | const path = require('path'); 5 | const mkdirp = require('mkdirp'); 6 | const fs = require('fs'); 7 | 8 | // Mapping from Node's `process.arch` to Golang's GOARCH 9 | var ARCH_MAPPING = { 10 | "ia32": "386", 11 | "x64": "amd64_v1", 12 | "arm": "arm", 13 | "arm64": "arm64" 14 | }; 15 | 16 | // Mapping between Node's `process.platform` to Golang's GOOS 17 | var PLATFORM_MAPPING = { 18 | "darwin": "darwin", 19 | "linux": "linux", 20 | "win32": "windows", 21 | "freebsd": "freebsd" 22 | }; 23 | 24 | async function getInstallationPath() { 25 | 26 | // `npm bin` will output the path where binary files should be installed 27 | 28 | // const value = await execShellCommand("npm bin -g"); 29 | const value = "../../.bin" 30 | 31 | var dir = null; 32 | if (!value || value.length === 0) { 33 | 34 | // We couldn't infer path from `npm bin`. Let's try to get it from 35 | // Environment variables set by NPM when it runs. 36 | // npm_config_prefix points to NPM's installation directory where `bin` folder is available 37 | // Ex: /Users/foo/.nvm/versions/node/v4.3.0 38 | var env = process.env; 39 | if (env && env.npm_config_prefix) { 40 | dir = path.join(env.npm_config_prefix, "bin"); 41 | } 42 | } else { 43 | dir = value.trim(); 44 | } 45 | 46 | await mkdirp(dir); 47 | return dir; 48 | } 49 | 50 | async function verifyAndPlaceBinary(binName, binPath, callback) { 51 | if (!fs.existsSync(path.join(binPath, binName))) return callback('Downloaded binary does not contain the binary specified in configuration - ' + binName); 52 | 53 | // Get installation path for executables under node 54 | const installationPath = await getInstallationPath(); 55 | // Copy the executable to the path 56 | fs.rename(path.join(binPath, binName), path.join(installationPath, binName),(err)=>{ 57 | if(!err){ 58 | console.info("Installed cli successfully"); 59 | callback(null); 60 | }else{ 61 | callback(err); 62 | } 63 | }); 64 | } 65 | 66 | function validateConfiguration(packageJson) { 67 | 68 | if (!packageJson.version) { 69 | return "'version' property must be specified"; 70 | } 71 | 72 | if (!packageJson.goBinary || _typeof(packageJson.goBinary) !== "object") { 73 | return "'goBinary' property must be defined and be an object"; 74 | } 75 | 76 | if (!packageJson.goBinary.name) { 77 | return "'name' property is necessary"; 78 | } 79 | 80 | if (!packageJson.goBinary.path) { 81 | return "'path' property is necessary"; 82 | } 83 | } 84 | 85 | function parsePackageJson() { 86 | if (!(process.arch in ARCH_MAPPING)) { 87 | console.error("Installation is not supported for this architecture: " + process.arch); 88 | return; 89 | } 90 | 91 | if (!(process.platform in PLATFORM_MAPPING)) { 92 | console.error("Installation is not supported for this platform: " + process.platform); 93 | return; 94 | } 95 | 96 | var packageJsonPath = path.join(".", "package.json"); 97 | if (!fs.existsSync(packageJsonPath)) { 98 | console.error("Unable to find package.json. " + "Please run this script at root of the package you want to be installed"); 99 | return; 100 | } 101 | 102 | var packageJson = JSON.parse(fs.readFileSync(packageJsonPath)); 103 | var error = validateConfiguration(packageJson); 104 | if (error && error.length > 0) { 105 | console.error("Invalid package.json: " + error); 106 | return; 107 | } 108 | 109 | // We have validated the config. It exists in all its glory 110 | var binName = packageJson.goBinary.name; 111 | var binPath = packageJson.goBinary.path; 112 | var version = packageJson.version; 113 | if (version[0] === 'v') version = version.substr(1); // strip the 'v' if necessary v0.0.1 => 0.0.1 114 | 115 | // Binary name on Windows has .exe suffix 116 | if (process.platform === "win32") { 117 | binName += ".exe"; 118 | } 119 | 120 | 121 | return { 122 | binName: binName, 123 | binPath: binPath, 124 | version: version 125 | }; 126 | } 127 | 128 | /** 129 | * Reads the configuration from application's package.json, 130 | * validates properties, copied the binary from the package and stores at 131 | * ./bin in the package's root. NPM already has support to install binary files 132 | * specific locations when invoked with "npm install -g" 133 | * 134 | * See: https://docs.npmjs.com/files/package.json#bin 135 | */ 136 | var INVALID_INPUT = "Invalid inputs"; 137 | async function install(callback) { 138 | 139 | var opts = parsePackageJson(); 140 | if (!opts) return callback(INVALID_INPUT); 141 | mkdirp.sync(opts.binPath); 142 | console.info(`Copying the relevant binary for your platform ${process.platform} (${process.arch})`); 143 | 144 | // Map the process platform and arch strings to the Go version 145 | const platform = PLATFORM_MAPPING[process.platform]; 146 | const arch = ARCH_MAPPING[process.arch]; 147 | 148 | // Get the path to the binary within the package 149 | const src = path.join( 150 | 'dist', 151 | `customrealms-cli_${platform}_${arch}`, 152 | opts.binName, 153 | ); 154 | 155 | // Copy the binary to its destination path 156 | fs.copyFileSync(src, path.join(opts.binPath, opts.binName)); 157 | // await execShellCommand(`cp ${src} ${opts.binPath}/${opts.binName}`); 158 | await verifyAndPlaceBinary(opts.binName, opts.binPath, callback); 159 | } 160 | 161 | async function uninstall(callback) { 162 | var opts = parsePackageJson(); 163 | try { 164 | const installationPath = await getInstallationPath(); 165 | fs.unlink(path.join(installationPath, opts.binName),(err)=>{ 166 | if(err){ 167 | return callback(err); 168 | } 169 | }); 170 | } catch (ex) { 171 | // Ignore errors when deleting the file. 172 | } 173 | console.info("Uninstalled cli successfully"); 174 | return callback(null); 175 | } 176 | 177 | // Parse command line arguments and call the right method 178 | var actions = { 179 | "install": install, 180 | "uninstall": uninstall 181 | }; 182 | /** 183 | * Executes a shell command and return it as a Promise. 184 | * @param cmd {string} 185 | * @return {Promise} 186 | */ 187 | function execShellCommand(cmd) { 188 | const exec = require('child_process').exec; 189 | return new Promise((resolve, reject) => { 190 | exec(cmd, (error, stdout, stderr) => { 191 | if (error) { 192 | console.warn(error); 193 | } 194 | resolve(stdout? stdout : stderr); 195 | }); 196 | }); 197 | } 198 | 199 | var argv = process.argv; 200 | if (argv && argv.length > 2) { 201 | var cmd = process.argv[2]; 202 | if (!actions[cmd]) { 203 | console.log("Invalid command. `install` and `uninstall` are the only supported commands"); 204 | process.exit(1); 205 | } 206 | 207 | actions[cmd](function (err) { 208 | if (err) { 209 | console.error(err); 210 | process.exit(1); 211 | } else { 212 | process.exit(0); 213 | } 214 | }); 215 | } --------------------------------------------------------------------------------