From 0461b59150b517b32fc6f2ee6e1751161417c7e3 Mon Sep 17 00:00:00 2001 From: Tom Wright Date: Sat, 8 Aug 2020 00:21:39 +0100 Subject: [PATCH 1/5] Rework some things to prepare for the cleanup of old diagrams --- cmd/app/main.go | 73 ++++++------------------------------- go.mod | 2 + go.sum | 2 + internal/cleanup_service.go | 41 +++++++++++++++++++++ internal/generator.go | 10 +++++ internal/http.go | 4 +- internal/http_service.go | 47 ++++++++++++++++++++++++ 7 files changed, 115 insertions(+), 64 deletions(-) create mode 100644 go.sum create mode 100644 internal/cleanup_service.go create mode 100644 internal/http_service.go diff --git a/cmd/app/main.go b/cmd/app/main.go index 3a115dd..f040261 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -1,61 +1,14 @@ package main import ( + "context" "flag" "fmt" + "github.com/tomwright/lifetime" "github.com/tomwright/mermaid-server/internal" - "log" - "net/http" "os" ) -var testInput = []byte(` -graph TB - - subgraph "Jira" - createTicket["Create ticket"] - updateTicket["Update ticket"] - fireWebhook["Fire webhook"] - - createTicket-->fireWebhook - updateTicket-->fireWebhook - end - - subgraph "Jira Webhook" - receiveWebhook["Receive webhook"] - storeEvent["Store event in immutable list"] - publishNewStoredEventEvent["Publish message to notify system of new event"] - - createEvent["Create internal event that will be stored"] - setCreatedAt["Set created at date to now"] - setSourceJira["Set source to Jira webhook"] - - receiveWebhook-->createEvent-->setCreatedAt-->setSourceJira-->storeEvent - storeEvent-->publishNewStoredEventEvent - end - - fireWebhook-->receiveWebhook - - subgraph "Play Event" - publishEventUpdated["Publish message to notify system of new status"] - - verifyEventSource["Verify event source"] - parsePayload["Parse event payload using source to determine structure"] - findEventHandler["Find the handler for the specific event type + version"] - getLatestPersistedState["Get latest persisted state"] - changeInMemoryStateUsingEventData["Change in-memory state using event data"] - persistUpdatedState["Persist updated state"] - - verifyEventSource-->parsePayload - parsePayload-->findEventHandler - findEventHandler-->getLatestPersistedState-->changeInMemoryStateUsingEventData-->persistUpdatedState - - persistUpdatedState-->publishEventUpdated - end - - publishNewStoredEventEvent-->verifyEventSource -`) - func main() { mermaid := flag.String("mermaid", "", "The full path to the mermaidcli executable.") in := flag.String("in", "", "Directory to store input files.") @@ -81,20 +34,16 @@ func main() { cache := internal.NewDiagramCache() generator := internal.NewGenerator(cache, *mermaid, *in, *out, *puppeteer) - httpHandler := internal.GenerateHTTPHandler(generator) + httpService := internal.NewHTTPService(generator) + cleanupService := internal.NewCleanupService(generator) - r := http.NewServeMux() - r.Handle("/generate", http.HandlerFunc(httpHandler)) + lt := lifetime.New(context.Background()).Init() - httpServer := &http.Server{ - Addr: ":80", - Handler: r, - } - log.Printf("Listening on address %s", httpServer.Addr) - if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { - log.Printf("Could not listen for http connections: %s", err) - os.Exit(1) - } + // Start the http service. + lt.Start(httpService) + // Start the cleanup service. + lt.Start(cleanupService) - log.Printf("Shutdown") + // Wait for all routines to stop running. + lt.Wait() } diff --git a/go.mod b/go.mod index b85d516..902a778 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/tomwright/mermaid-server go 1.13 + +require github.com/tomwright/lifetime v1.0.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..f176d16 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/tomwright/lifetime v1.0.0 h1:Yzj+Td38eUUdZ1ewvOegywFBmKyaCh+8HjKBmeXw6OM= +github.com/tomwright/lifetime v1.0.0/go.mod h1:GUCHgRaR/zStvtJiOd3B4gIZayeiz3TgApC9kNYAOQI= diff --git a/internal/cleanup_service.go b/internal/cleanup_service.go new file mode 100644 index 0000000..2858857 --- /dev/null +++ b/internal/cleanup_service.go @@ -0,0 +1,41 @@ +package internal + +import ( + "log" + "time" +) + +// NewCleanupService returns a service that can be used cleanup old diagrams. +func NewCleanupService(generator Generator) *cleanupService { + return &cleanupService{ + generator: generator, + stopCh: make(chan struct{}), + } +} + +// cleanupService is a service that can be used cleanup old diagrams. +type cleanupService struct { + generator Generator + stopCh chan struct{} +} + +// Start starts the cleanup service. +func (s *cleanupService) Start() error { + for { + if err := s.generator.CleanUp(time.Hour); err != nil { + log.Printf("error when cleaning up: %s", err.Error()) + } + + select { + case <-time.After(time.Minute * 5): + continue + case <-s.stopCh: + return nil + } + } +} + +// Stop stops the cleanup service. +func (s *cleanupService) Stop() { + close(s.stopCh) +} diff --git a/internal/generator.go b/internal/generator.go index 1419c15..1468edc 100644 --- a/internal/generator.go +++ b/internal/generator.go @@ -8,14 +8,18 @@ import ( "log" "os" "os/exec" + "time" ) // Generator provides the ability to generate a diagram. type Generator interface { // Generate generates the given diagram. Generate(diagram *Diagram) error + // CleanUp removes any diagrams that haven't used within the given duration. + CleanUp(duration time.Duration) error } +// NewGenerator returns a generator that can be used to generate diagrams. func NewGenerator(cache DiagramCache, mermaidCLIPath string, inPath string, outPath string, puppeteerConfigPath string) Generator { return &cachingGenerator{ cache: cache, @@ -102,3 +106,9 @@ func (c cachingGenerator) generate(diagram *Diagram) error { return nil } + +// CleanUp removes any diagrams that haven't used within the given duration. +func (c cachingGenerator) CleanUp(duration time.Duration) error { + // todo : loop through all cached diagrams and delete any that haven't been used within duration. + return nil +} diff --git a/internal/http.go b/internal/http.go index ccb28c6..ea55d65 100644 --- a/internal/http.go +++ b/internal/http.go @@ -80,8 +80,8 @@ func getDiagramFromPOST(rw http.ResponseWriter, r *http.Request) *Diagram { return d } -// GenerateHTTPHandler returns a HTTP handler used to generate a diagram. -func GenerateHTTPHandler(generator Generator) func(rw http.ResponseWriter, r *http.Request) { +// generateHTTPHandler returns a HTTP handler used to generate a diagram. +func generateHTTPHandler(generator Generator) func(rw http.ResponseWriter, r *http.Request) { return func(rw http.ResponseWriter, r *http.Request) { var diagram *Diagram diff --git a/internal/http_service.go b/internal/http_service.go new file mode 100644 index 0000000..934552a --- /dev/null +++ b/internal/http_service.go @@ -0,0 +1,47 @@ +package internal + +import ( + "net/http" +) + +// NewHTTPService returns a service that can be used to start a http server +// that will generate diagrams. +func NewHTTPService(generator Generator) *httpService { + return &httpService{ + generator: generator, + } +} + +// httpService is a service that can be used to start a http server +// that will generate diagrams. +type httpService struct { + httpServer *http.Server + generator Generator +} + +// Start starts the HTTP server. +func (s *httpService) Start() error { + httpHandler := generateHTTPHandler(s.generator) + + r := http.NewServeMux() + r.Handle("/generate", http.HandlerFunc(httpHandler)) + + s.httpServer = &http.Server{ + Addr: ":80", + Handler: r, + } + + if err := s.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { + if err != http.ErrServerClosed { + return err + } + } + + return nil +} + +func (s *httpService) Stop() { + if s != nil { + _ = s.httpServer.Close() + } +} From f1f2012a95fb8e345f4457e22c06c3341ba51b12 Mon Sep 17 00:00:00 2001 From: Tom Wright Date: Sun, 9 Aug 2020 10:59:05 +0100 Subject: [PATCH 2/5] Add remaining code for diagram cleanup --- .github/workflows/build.yaml | 26 ++++++++++++++++++++++ .github/workflows/test.yaml | 24 ++++++++++++++++++++ internal/cache.go | 28 +++++++++++++++++++++++ internal/diagram.go | 25 ++++++++++++++++++++- internal/generator.go | 43 +++++++++++++++++++++++++++++++++++- 5 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/build.yaml create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..0e43d0a --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,26 @@ +on: + push: + tags: + - 'v*.*.*' +name: Build +jobs: + build: + strategy: + matrix: + go-version: [1.13.x] + platform: [ubuntu-latest] + runs-on: ${{ matrix.platform }} + steps: + - name: Checkout code + uses: actions/checkout@v1 + - name: Set env + run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF:10} + - name: Build + run: docker build + -t tomwright/mermaid-server:latest \ + -t tomwright/mermaid-server:${{ env.RELEASE_VERSION }} \ + -f Dockerfile . + - name: Login + run: echo ${{ secrets.DOCKER_PASS }} | docker login -u${{ secrets.DOCKER_USER }} --password-stdin + - name: Push + run: docker push tomwright/mermaid-server:latest && docker push tomwright/mermaid-server:${{ env.RELEASE_VERSION }} \ No newline at end of file diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..a177814 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,24 @@ +on: [push, pull_request] +name: Test +jobs: + test: + strategy: + matrix: + go-version: [1.13.x] + platform: [ubuntu-latest] + runs-on: ${{ matrix.platform }} + steps: + - name: Install Go + uses: actions/setup-go@v1 + with: + go-version: ${{ matrix.go-version }} + - name: Checkout code + uses: actions/checkout@v1 + - uses: actions/cache@v1 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Test + run: go test -race ./... \ No newline at end of file diff --git a/internal/cache.go b/internal/cache.go index 2c57da7..78ccf6f 100644 --- a/internal/cache.go +++ b/internal/cache.go @@ -10,6 +10,10 @@ type DiagramCache interface { Has(diagram *Diagram) (bool, error) // Get returns a cached version of the given diagram description. Get(diagram *Diagram) (*Diagram, error) + // GetAll returns all of the cached diagrams. + GetAll() ([]*Diagram, error) + // Delete deletes a cached version of the given diagram. + Delete(diagram *Diagram) error } // NewDiagramCache returns an implementation of DiagramCache. @@ -57,3 +61,27 @@ func (c *inMemoryDiagramCache) Get(diagram *Diagram) (*Diagram, error) { } return nil, nil } + +// GetAll returns all of the cached diagrams. +func (c *inMemoryDiagramCache) GetAll() ([]*Diagram, error) { + res := make([]*Diagram, len(c.idToDiagram)) + i := 0 + for _, diagram := range c.idToDiagram { + res[i] = diagram + i++ + } + return res, nil +} + +// Delete deletes a cached version of the given diagram. +func (c *inMemoryDiagramCache) Delete(diagram *Diagram) error { + id, err := diagram.ID() + if err != nil { + return err + } + if _, ok := c.idToDiagram[id]; ok { + delete(c.idToDiagram, id) + return nil + } + return nil +} diff --git a/internal/diagram.go b/internal/diagram.go index 3d73de9..32c2fe3 100644 --- a/internal/diagram.go +++ b/internal/diagram.go @@ -5,22 +5,45 @@ import ( "encoding/base64" "encoding/hex" "strings" + "sync" + "time" ) // NewDiagram returns a new diagram. func NewDiagram(description []byte) *Diagram { return &Diagram{ description: []byte(strings.TrimSpace(string(description))), + lastTouched: time.Now(), + mu: &sync.RWMutex{}, } } +// Diagram represents a single diagram. type Diagram struct { - // iD is the ID of the Diagram + // id is the ID of the Diagram id string // description is the description of the diagram. description []byte // Output is the filepath to the output file. Output string + // mu is a mutex to protect the last touched value. + mu *sync.RWMutex + // lastTouched is the time that the diagram was last used. + lastTouched time.Time +} + +// Touch updates the last touched time of the diagram. +func (d *Diagram) Touch() { + d.mu.Lock() + defer d.mu.Unlock() + d.lastTouched = time.Now() +} + +// TouchedInDuration returns true if the diagram has been touched in the given duration. +func (d *Diagram) TouchedInDuration(duration time.Duration) bool { + d.mu.Lock() + defer d.mu.Unlock() + return time.Now().Add(-duration).Before(d.lastTouched) } // ID returns an ID for the diagram. diff --git a/internal/generator.go b/internal/generator.go index 1468edc..64128ea 100644 --- a/internal/generator.go +++ b/internal/generator.go @@ -51,8 +51,17 @@ func (c cachingGenerator) Generate(diagram *Diagram) error { return fmt.Errorf("cache.Get failed: %w", err) } *diagram = *cached + + // Update diagram last touched date + diagram.Touch() + if err := c.cache.Store(diagram); err != nil { + return fmt.Errorf("cache.Store failed: %w", err) + } + return nil } + + diagram.Touch() if err := c.generate(diagram); err != nil { return fmt.Errorf("cachingGenerater.generate failed: %w", err) } @@ -109,6 +118,38 @@ func (c cachingGenerator) generate(diagram *Diagram) error { // CleanUp removes any diagrams that haven't used within the given duration. func (c cachingGenerator) CleanUp(duration time.Duration) error { - // todo : loop through all cached diagrams and delete any that haven't been used within duration. + diagrams, err := c.cache.GetAll() + if err != nil { + return fmt.Errorf("could not get cached diagrams: %w", err) + } + for _, d := range diagrams { + if !d.TouchedInDuration(duration) { + if err := c.delete(d); err != nil { + return fmt.Errorf("could not delete diagram: %w", err) + } + } + } + return nil +} + +// delete removes any diagrams that haven't used within the given duration. +func (c cachingGenerator) delete(diagram *Diagram) error { + id, err := diagram.ID() + if err != nil { + return fmt.Errorf("cannot get diagram ID: %w", err) + } + inPath := fmt.Sprintf("%s/%s.mmd", c.inPath, id) + outPath := fmt.Sprintf("%s/%s.svg", c.outPath, id) + + if err := os.Remove(inPath); err != nil { + return fmt.Errorf("could not delete diagram input: %w", err) + } + if err := os.Remove(outPath); err != nil { + return fmt.Errorf("could not delete diagram output: %w", err) + } + if err := c.cache.Delete(diagram); err != nil { + return fmt.Errorf("could not remove diagram from cache: %w", err) + } + return nil } From 2faebcd5b449c9ae849d665b635694d6a85a5f7b Mon Sep 17 00:00:00 2001 From: Tom Wright Date: Sun, 9 Aug 2020 11:04:33 +0100 Subject: [PATCH 3/5] Update readme --- README.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50b0cfe..4ad4bfa 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,11 @@ Start the HTTP server: go run cmd/app/main.go --mermaid=./mermaidcli/node_modules/.bin/mmdc --in=./in --out=./out ``` -Send CURL request to generate a diagram via `POST`: +### Diagram creation + +#### POST + +Send a CURL request to generate a diagram via `POST`: ``` curl --location --request POST 'http://localhost:80/generate' \ --header 'Content-Type: text/plain' \ @@ -33,9 +37,16 @@ curl --location --request POST 'http://localhost:80/generate' \ ' ``` -Or send CURL request to generate a diagram via `GET`... send in url encoded data under the `data` query param: +#### GET + +Send a CURL request to generate a diagram via `GET`... send in url encoded data under the `data` query param: ``` curl --location --request GET 'http://localhost:80/generate?data=graph%20LR%0A%0A%20%20%20%20A--%3EB%0A%20%20%20%20B--%3EC%0A%20%20%20%20C--%3ED%0A%20%20%20%20C--%3EF%0A' ``` -![Example request in Postman](example.png "Example request in Postman") \ No newline at end of file +![Example request in Postman](example.png "Example request in Postman") + +### Caching + +All generated diagram input and output will be cached for 1 hour. The cache time is reset whenever a cached diagram is accessed. + \ No newline at end of file From 6f4c18d324d375abea0439264cd83e9bce95250a Mon Sep 17 00:00:00 2001 From: Tom Wright Date: Sun, 9 Aug 2020 11:17:41 +0100 Subject: [PATCH 4/5] Update log messages --- internal/generator.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/generator.go b/internal/generator.go index 64128ea..65130f1 100644 --- a/internal/generator.go +++ b/internal/generator.go @@ -109,7 +109,7 @@ func (c cachingGenerator) generate(diagram *Diagram) error { if err := cmd.Run(); err != nil { return fmt.Errorf("failed when executing mermaid: %w: %s: %s", err, string(stdOut.Bytes()), string(stdErr.Bytes())) } - log.Printf("generated with output: %s: %s", string(stdOut.Bytes()), string(stdErr.Bytes())) + log.Printf("Generated: %s: %s: %s", id, string(stdOut.Bytes()), string(stdErr.Bytes())) diagram.Output = outPath @@ -118,6 +118,7 @@ func (c cachingGenerator) generate(diagram *Diagram) error { // CleanUp removes any diagrams that haven't used within the given duration. func (c cachingGenerator) CleanUp(duration time.Duration) error { + log.Printf("Running cleanup") diagrams, err := c.cache.GetAll() if err != nil { return fmt.Errorf("could not get cached diagrams: %w", err) @@ -138,6 +139,9 @@ func (c cachingGenerator) delete(diagram *Diagram) error { if err != nil { return fmt.Errorf("cannot get diagram ID: %w", err) } + + log.Printf("Cleaning up diagram: %s", id) + inPath := fmt.Sprintf("%s/%s.mmd", c.inPath, id) outPath := fmt.Sprintf("%s/%s.svg", c.outPath, id) From 8ae99344d15b289ae48479c28cb58a6da3272936 Mon Sep 17 00:00:00 2001 From: Tom Wright Date: Sun, 9 Aug 2020 11:32:58 +0100 Subject: [PATCH 5/5] Add some missing dependencies in the dockerfile --- Dockerfile | 6 +- mermaidcli/package-lock.json | 363 +++++++++++++++++++++-------------- mermaidcli/package.json | 2 +- 3 files changed, 229 insertions(+), 142 deletions(-) diff --git a/Dockerfile b/Dockerfile index 108d443..807144e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,8 +20,8 @@ COPY ./mermaidcli/* ./ RUN npm install ENV DEBIAN_FRONTEND=noninteractive -RUN apt update 2>/dev/null && \ - apt install -y --no-install-recommends \ +RUN apt-get update 2>/dev/null && \ + apt-get install -y --no-install-recommends \ ca-certificates \ gconf-service \ libasound2 \ @@ -55,6 +55,8 @@ RUN apt update 2>/dev/null && \ libxrender1 \ libxss1 \ libxtst6 \ + libxcb-dri3-0 \ + libgbm1 \ ca-certificates \ fonts-liberation \ libappindicator1 \ diff --git a/mermaidcli/package-lock.json b/mermaidcli/package-lock.json index b8da70a..c87ff8c 100644 --- a/mermaidcli/package-lock.json +++ b/mermaidcli/package-lock.json @@ -5,13 +5,13 @@ "requires": true, "dependencies": { "@mermaid-js/mermaid-cli": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/@mermaid-js/mermaid-cli/-/mermaid-cli-8.4.8.tgz", - "integrity": "sha512-25Ichye2lpNso9Dylrm5a+SJWZ5rpuPxVw1OVdcl9ZoTDGxdE3AyTfcCjoT5oKVfDUd+Uu2ONUsfJBtw42I8uw==", + "version": "8.6.4", + "resolved": "https://registry.npmjs.org/@mermaid-js/mermaid-cli/-/mermaid-cli-8.6.4.tgz", + "integrity": "sha512-0brpKK5Emvc6A9wCeZG01iNsfp3pvLR6SGYQE8iZY+qLzlEJX/wPoDEQ1oEgMD9bn+99wIS1wUOhDTOIMISK+w==", "requires": { - "chalk": "^3.0.0", - "commander": "^4.0.1", - "puppeteer": "^2.0.0" + "chalk": "^4.1.0", + "commander": "^6.0.0", + "puppeteer": "^5.0.0" } }, "@types/color-name": { @@ -19,10 +19,20 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=" + "@types/node": { + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "optional": true + }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "optional": true, + "requires": { + "@types/node": "*" + } }, "agent-base": { "version": "5.1.1", @@ -38,16 +48,26 @@ "color-convert": "^2.0.1" } }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -57,25 +77,34 @@ "concat-map": "0.0.1" } }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -90,31 +119,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz", + "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -123,30 +136,28 @@ "ms": "^2.1.1" } }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "devtools-protocol": { + "version": "0.0.781568", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.781568.tgz", + "integrity": "sha512-9Uqnzy6m6zEStluH9iyJ3iHyaQziFnMnLeC8vK0eN6smiJmIx7+yB64d67C2lH/LZra+5cGscJAJsNXO+MdPMg==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "once": "^1.4.0" + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "fd-slicer": { @@ -157,11 +168,33 @@ "pend": "~1.2.0" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -189,6 +222,11 @@ "debug": "4" } }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -203,28 +241,18 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, "minimatch": { "version": "3.0.4", @@ -234,18 +262,10 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "ms": { "version": "2.1.2", @@ -260,6 +280,32 @@ "wrappy": "1" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -270,10 +316,13 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } }, "progress": { "version": "2.0.3", @@ -285,56 +334,63 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "puppeteer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.2.1.tgz", + "integrity": "sha512-PZoZG7u+T6N1GFWBQmGVG162Ak5MAy8nYSVpeeQrwJK2oYUlDWpHEJPcd/zopyuEMTv7DiztS1blgny1txR2qw==", "requires": { - "@types/mime-types": "^2.1.0", "debug": "^4.1.0", - "extract-zip": "^1.6.6", + "devtools-protocol": "0.0.781568", + "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", - "mime-types": "^2.1.25", + "pkg-dir": "^4.2.0", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "supports-color": { @@ -345,10 +401,42 @@ "has-flag": "^4.0.0" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", + "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } }, "util-deprecate": { "version": "1.0.2", @@ -361,12 +449,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" }, "yauzl": { "version": "2.10.0", diff --git a/mermaidcli/package.json b/mermaidcli/package.json index 7a5c563..863f04a 100644 --- a/mermaidcli/package.json +++ b/mermaidcli/package.json @@ -9,6 +9,6 @@ "author": "", "license": "ISC", "dependencies": { - "@mermaid-js/mermaid-cli": "^8.5.1-2" + "@mermaid-js/mermaid-cli": "^8.6.4" } }