From d839c536423ee651f52fa03f76695120ec159296 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Tue, 22 Aug 2023 10:56:32 +0200 Subject: [PATCH 001/120] Add initial structure --- internal/tagger/apps/gromacs.txt | 0 internal/tagger/apps/openfoam.txt | 0 internal/tagger/apps/vasp.txt | 0 internal/tagger/detectApp.go | 20 ++++++++++++++++++++ internal/tagger/tagger.go | 17 +++++++++++++++++ 5 files changed, 37 insertions(+) create mode 100644 internal/tagger/apps/gromacs.txt create mode 100644 internal/tagger/apps/openfoam.txt create mode 100644 internal/tagger/apps/vasp.txt create mode 100644 internal/tagger/detectApp.go create mode 100644 internal/tagger/tagger.go diff --git a/internal/tagger/apps/gromacs.txt b/internal/tagger/apps/gromacs.txt new file mode 100644 index 0000000..e69de29 diff --git a/internal/tagger/apps/openfoam.txt b/internal/tagger/apps/openfoam.txt new file mode 100644 index 0000000..e69de29 diff --git a/internal/tagger/apps/vasp.txt b/internal/tagger/apps/vasp.txt new file mode 100644 index 0000000..e69de29 diff --git a/internal/tagger/detectApp.go b/internal/tagger/detectApp.go new file mode 100644 index 0000000..298151b --- /dev/null +++ b/internal/tagger/detectApp.go @@ -0,0 +1,20 @@ +// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg. +// All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. +package tagger + +const tagType = "app" + +type appInfo struct { + tag string + strings []string +} +type AppTagger struct { + apps []appInfo +} + +func (t *AppTagger) Register() error { + + return nil +} diff --git a/internal/tagger/tagger.go b/internal/tagger/tagger.go new file mode 100644 index 0000000..52a369b --- /dev/null +++ b/internal/tagger/tagger.go @@ -0,0 +1,17 @@ +// Copyright (C) 2023 NHR@FAU, University Erlangen-Nuremberg. +// All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. +package tagger + +import "github.com/ClusterCockpit/cc-backend/pkg/schema" + +type Tagger interface { + Register() error + Match(job *schema.Job) +} + +func Init() error { + + return nil +} From dc0d9fe038a0a940d1b00ceb24f259721e3a293c Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Wed, 27 Sep 2023 15:01:08 +0200 Subject: [PATCH 002/120] Add more tags to test db --- internal/repository/testdata/job.db | Bin 114688 -> 114688 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/internal/repository/testdata/job.db b/internal/repository/testdata/job.db index 4b00aa55f041b70f717177bc7baef9eb69d1a226..4685f7f85704574eab5cbd27a08f41eb71bf719d 100644 GIT binary patch delta 240 zcmZo@U~gz(-@xL)!Nk9ff&V7|w#|Y9tN4`_nOGUbMU4v*OEU5^Q*u&`42+C*4J>ty z%oPlctV}Je49zFs^w$RJy3fFWpZ^_D*JXZwJ{ECNMz|iP$?xLDxS07jGVnj;Kh3`p zsAe&LtOPR)Bd0M7vVq1{1_oA!h7wF58CDD#15-&x7Dh&6RwiUApern`Of0z=7#NuO oUo-H(=KsY16KKUjt@f&b=aL4ou9lW+QK1NrY5_}>BfPxvRlix=Z!5MW^7{{n>X y!D2G3oD2*MJe+Jml8uvv3rK-geC7v2po&NQ0&I-TKtWzcHYSLgriNt=j1B+{bsGKv From ba7cc9168e74a925c06ac108355b221d5fdf0e88 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 28 Sep 2023 10:20:20 +0200 Subject: [PATCH 003/120] feat: add automatic application detection and tagging --- internal/repository/job_test.go | 30 +++++++++------ internal/repository/tags.go | 13 +++++++ internal/tagger/apps/gromacs.txt | 3 ++ internal/tagger/apps/openfoam.txt | 1 + internal/tagger/apps/vasp.txt | 2 + internal/tagger/detectApp.go | 64 +++++++++++++++++++++++++++++++ internal/tagger/detectApp_test.go | 59 ++++++++++++++++++++++++++++ 7 files changed, 161 insertions(+), 11 deletions(-) create mode 100644 internal/tagger/detectApp_test.go diff --git a/internal/repository/job_test.go b/internal/repository/job_test.go index c3f76a7..986365c 100644 --- a/internal/repository/job_test.go +++ b/internal/repository/job_test.go @@ -16,9 +16,7 @@ func TestFind(t *testing.T) { jobId, cluster, startTime := int64(398998), "fritz", int64(1675957496) job, err := r.Find(&jobId, &cluster, &startTime) - if err != nil { - t.Fatal(err) - } + noErr(t, err) // fmt.Printf("%+v", job) @@ -31,9 +29,7 @@ func TestFindById(t *testing.T) { r := setup(t) job, err := r.FindById(5) - if err != nil { - t.Fatal(err) - } + noErr(t, err) // fmt.Printf("%+v", job) @@ -46,14 +42,26 @@ func TestGetTags(t *testing.T) { r := setup(t) tags, counts, err := r.CountTags(nil) - if err != nil { - t.Fatal(err) - } + noErr(t, err) fmt.Printf("TAGS %+v \n", tags) // fmt.Printf("COUNTS %+v \n", counts) - if counts["bandwidth"] != 0 { - t.Errorf("wrong tag count \ngot: %d \nwant: 0", counts["bandwidth"]) + if counts["bandwidth"] != 2 { + t.Errorf("wrong tag count \ngot: %d \nwant: 2", counts["bandwidth"]) + } +} + +func TestHasTag(t *testing.T) { + r := setup(t) + + if !r.HasTag(5, "util", "bandwidth") { + t.Errorf("Expected has tag") + } + if r.HasTag(4, "patho", "idle") { + t.Errorf("Expected has not tag") + } + if !r.HasTag(5, "patho", "idle") { + t.Errorf("Expected has tag") } } diff --git a/internal/repository/tags.go b/internal/repository/tags.go index 52bc836..a6a41b6 100644 --- a/internal/repository/tags.go +++ b/internal/repository/tags.go @@ -134,6 +134,19 @@ func (r *JobRepository) AddTagOrCreate(jobId int64, tagType string, tagName stri return tagId, nil } +func (r *JobRepository) HasTag(jobId int64, tagType string, tagName string) bool { + var id int64 + q := sq.Select("id").From("tag").Join("jobtag ON jobtag.tag_id = tag.id"). + Where("jobtag.job_id = ?", jobId).Where("tag.tag_type = ?", tagType). + Where("tag.tag_name = ?", tagName) + err := q.RunWith(r.stmtCache).QueryRow().Scan(&id) + if err != nil { + return false + } else { + return true + } +} + // TagId returns the database id of the tag with the specified type and name. func (r *JobRepository) TagId(tagType string, tagName string) (tagId int64, exists bool) { exists = true diff --git a/internal/tagger/apps/gromacs.txt b/internal/tagger/apps/gromacs.txt index e69de29..d8c0829 100644 --- a/internal/tagger/apps/gromacs.txt +++ b/internal/tagger/apps/gromacs.txt @@ -0,0 +1,3 @@ +GROMACS +gromacs +GMX diff --git a/internal/tagger/apps/openfoam.txt b/internal/tagger/apps/openfoam.txt index e69de29..542d645 100644 --- a/internal/tagger/apps/openfoam.txt +++ b/internal/tagger/apps/openfoam.txt @@ -0,0 +1 @@ +openfoam diff --git a/internal/tagger/apps/vasp.txt b/internal/tagger/apps/vasp.txt index e69de29..eec9092 100644 --- a/internal/tagger/apps/vasp.txt +++ b/internal/tagger/apps/vasp.txt @@ -0,0 +1,2 @@ +VASP +vasp diff --git a/internal/tagger/detectApp.go b/internal/tagger/detectApp.go index 298151b..714fd27 100644 --- a/internal/tagger/detectApp.go +++ b/internal/tagger/detectApp.go @@ -4,17 +4,81 @@ // license that can be found in the LICENSE file. package tagger +import ( + "bufio" + "embed" + "fmt" + "path/filepath" + "strings" + + "github.com/ClusterCockpit/cc-backend/internal/repository" + "github.com/ClusterCockpit/cc-backend/pkg/log" + "github.com/ClusterCockpit/cc-backend/pkg/schema" +) + const tagType = "app" +//go:embed apps/* +var appFiles embed.FS + type appInfo struct { tag string strings []string } + type AppTagger struct { apps []appInfo } func (t *AppTagger) Register() error { + files, err := appFiles.ReadDir("apps") + if err != nil { + return fmt.Errorf("error reading app folder: %#v", err) + } + t.apps = make([]appInfo, 0) + + for _, fn := range files { + fns := fn.Name() + log.Debugf("Process: %s", fns) + f, err := appFiles.Open(fmt.Sprintf("apps/%s", fns)) + if err != nil { + return fmt.Errorf("error opening app file %s: %#v", fns, err) + } + scanner := bufio.NewScanner(f) + ai := appInfo{tag: strings.TrimSuffix(fns, filepath.Ext(fns)), strings: make([]string, 0)} + + for scanner.Scan() { + ai.strings = append(ai.strings, scanner.Text()) + } + t.apps = append(t.apps, ai) + } return nil } + +func (t *AppTagger) Match(job *schema.Job) { + r := repository.GetJobRepository() + meta, err := r.FetchMetadata(job) + if err != nil { + log.Error("cannot fetch meta data") + } + jobscript, ok := meta["jobScript"] + if ok { + id := job.ID + + out: + for _, a := range t.apps { + tag := a.tag + for _, s := range a.strings { + if strings.Contains(jobscript, s) { + if !r.HasTag(id, tagType, tag) { + r.AddTagOrCreate(id, tagType, tag) + break out + } + } + } + } + } else { + log.Infof("Cannot extract job script for job: %d on %s", job.JobID, job.Cluster) + } +} diff --git a/internal/tagger/detectApp_test.go b/internal/tagger/detectApp_test.go new file mode 100644 index 0000000..54a8dfd --- /dev/null +++ b/internal/tagger/detectApp_test.go @@ -0,0 +1,59 @@ +// Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg. +// All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. +package tagger + +import ( + "testing" + + "github.com/ClusterCockpit/cc-backend/internal/repository" + "github.com/ClusterCockpit/cc-backend/pkg/log" +) + +func setup(tb testing.TB) *repository.JobRepository { + tb.Helper() + log.Init("warn", true) + dbfile := "../repository/testdata/job.db" + err := repository.MigrateDB("sqlite3", dbfile) + noErr(tb, err) + repository.Connect("sqlite3", dbfile) + return repository.GetJobRepository() +} + +func noErr(tb testing.TB, err error) { + tb.Helper() + + if err != nil { + tb.Fatal("Error is not nil:", err) + } +} + +func TestRegister(t *testing.T) { + var tagger AppTagger + + err := tagger.Register() + noErr(t, err) + + if len(tagger.apps) != 3 { + t.Errorf("wrong summary for diagnostic \ngot: %d \nwant: 3", len(tagger.apps)) + } +} + +func TestMatch(t *testing.T) { + r := setup(t) + + job, err := r.FindById(5) + noErr(t, err) + + var tagger AppTagger + + err = tagger.Register() + noErr(t, err) + + tagger.Match(job) + + if !r.HasTag(5, "app", "vasp") { + t.Errorf("missing tag vasp") + } +} From 2502989ca2c33d654f923687db8c53c5b44c8b5b Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Thu, 28 Sep 2023 10:20:35 +0200 Subject: [PATCH 004/120] Refactor --- pkg/schema/validate.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/schema/validate.go b/pkg/schema/validate.go index aec234c..77b6dbb 100644 --- a/pkg/schema/validate.go +++ b/pkg/schema/validate.go @@ -28,12 +28,13 @@ const ( //go:embed schemas/* var schemaFiles embed.FS -func Validate(k Kind, r io.Reader) (err error) { +func Validate(k Kind, r io.Reader) error { jsonschema.Loaders["embedfs"] = func(s string) (io.ReadCloser, error) { f := filepath.Join("schemas", strings.Split(s, "//")[1]) return schemaFiles.Open(f) } var s *jsonschema.Schema + var err error switch k { case Meta: @@ -54,7 +55,7 @@ func Validate(k Kind, r io.Reader) (err error) { } var v interface{} - if err := json.NewDecoder(r).Decode(&v); err != nil { + if err = json.NewDecoder(r).Decode(&v); err != nil { log.Warnf("Error while decoding raw json schema: %#v", err) return err } From efbe53b6b45a79fe432814189a5e99b2a9dbbaa4 Mon Sep 17 00:00:00 2001 From: AmritanshuV <88365075+AmritanshuV@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:40:57 +0200 Subject: [PATCH 005/120] Rules --- internal/tagger/rules.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 internal/tagger/rules.json diff --git a/internal/tagger/rules.json b/internal/tagger/rules.json new file mode 100644 index 0000000..c88afb4 --- /dev/null +++ b/internal/tagger/rules.json @@ -0,0 +1,21 @@ +{ + "and": [ + { + "in": [ + "a40", + { + "var": "metaData.jobScript" + } + ] + }, + { + ">": [ + { + "var": "statistics.clock.min" + }, + 2000 + ] + } + ] + } + \ No newline at end of file From 5681062f01e37b4248310d4c751a6ca08379e1fa Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Mon, 3 Feb 2025 17:31:01 +0100 Subject: [PATCH 006/120] Initial migration to Svelte5 via full syntax compatability - updated all dependencies - removed svelte-chartjs wrapper from dependencies - sveltestrap causes compilation warnings (once) - Header.svelte uses new Svelte5 syntax as example - fixed most initial compilation warnings except circular dependencies with TBD cause --- web/frontend/package-lock.json | 772 ++++++++++-------- web/frontend/package.json | 21 +- web/frontend/src/Analysis.root.svelte | 1 + web/frontend/src/Header.svelte | 34 +- web/frontend/src/Status.root.svelte | 2 + web/frontend/src/analysis.entrypoint.js | 3 +- web/frontend/src/config.entrypoint.js | 3 +- web/frontend/src/config/admin/AddUser.svelte | 14 +- .../src/generic/joblist/JobInfo.svelte | 6 +- .../src/generic/joblist/Pagination.svelte | 6 +- .../src/generic/plots/Histogram.svelte | 2 +- .../src/generic/plots/MetricPlot.svelte | 2 +- web/frontend/src/generic/plots/Pie.svelte | 40 +- web/frontend/src/generic/plots/Polar.svelte | 42 +- .../src/generic/plots/Roofline.svelte | 2 +- .../src/generic/select/MetricSelection.svelte | 11 +- web/frontend/src/header.entrypoint.js | 9 +- web/frontend/src/job.entrypoint.js | 3 +- web/frontend/src/job/JobSummary.svelte | 1 + web/frontend/src/job/StatsTableEntry.svelte | 38 +- web/frontend/src/jobs.entrypoint.js | 3 +- web/frontend/src/list.entrypoint.js | 3 +- web/frontend/src/node.entrypoint.js | 3 +- web/frontend/src/status.entrypoint.js | 3 +- web/frontend/src/systems.entrypoint.js | 3 +- .../src/systems/nodelist/NodeListRow.svelte | 2 +- web/frontend/src/user.entrypoint.js | 3 +- 27 files changed, 561 insertions(+), 471 deletions(-) diff --git a/web/frontend/package-lock.json b/web/frontend/package-lock.json index 4b89d34..2507e9a 100644 --- a/web/frontend/package-lock.json +++ b/web/frontend/package-lock.json @@ -9,32 +9,31 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@rollup/plugin-replace": "^5.0.7", - "@sveltestrap/sveltestrap": "^6.2.7", + "@rollup/plugin-replace": "^6.0.2", + "@sveltestrap/sveltestrap": "^7.0.3", "@urql/svelte": "^4.2.2", - "chart.js": "^4.4.6", - "date-fns": "^2.30.0", - "graphql": "^16.9.0", - "mathjs": "^12.4.3", - "svelte-chartjs": "^3.1.5", + "chart.js": "^4.4.7", + "date-fns": "^4.1.0", + "graphql": "^16.10.0", + "mathjs": "^14.2.0", "uplot": "^1.6.31", "wonka": "^6.3.4" }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.8", - "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-terser": "^0.4.4", "@timohausmann/quadtree-js": "^1.2.6", - "rollup": "^4.27.4", + "rollup": "^4.34.1", "rollup-plugin-css-only": "^4.5.2", "rollup-plugin-svelte": "^7.2.2", - "svelte": "^4.2.19" + "svelte": "^5.19.6" } }, "node_modules/@0no-co/graphql.web": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.11.tgz", - "integrity": "sha512-xuSJ9WXwTmtngWkbdEoopMo6F8NLtjy84UNAMsAr5C3/2SgAL/dEU10TMqTIsipqPQ8HA/7WzeqQ9DEQxSvPPA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.13.tgz", + "integrity": "sha512-jqYxOevheVTU1S36ZdzAkJIdvRp2m3OYIG5SEoKDw5NI8eVwkoI0D/Q3DYNGmXCxkA6CQuoa7zvMiDPTLqUNuw==", "license": "MIT", "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" @@ -59,9 +58,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -71,9 +70,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -135,6 +134,19 @@ "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, + "node_modules/@lambdatest/node-tunnel": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@lambdatest/node-tunnel/-/node-tunnel-4.0.8.tgz", + "integrity": "sha512-IY42aDD4Ryqjug9V4wpCjckKpHjC2zrU/XhhorR5ztX088XITRFKUo8U6+gOjy/V8kAB+EgDuIXfK0izXbt9Ow==", + "license": "ISC", + "dependencies": { + "adm-zip": "^0.5.10", + "axios": "^1.6.2", + "get-port": "^1.0.0", + "https-proxy-agent": "^5.0.0", + "split": "^1.0.1" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -146,21 +158,22 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.8", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", - "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", + "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "glob": "^8.0.3", + "fdir": "^6.2.0", "is-reference": "1.2.1", - "magic-string": "^0.30.3" + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0 || 14 >= 14.17" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" @@ -172,9 +185,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", + "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", "dev": true, "license": "MIT", "dependencies": { @@ -197,9 +210,9 @@ } }, "node_modules/@rollup/plugin-replace": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz", - "integrity": "sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", + "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -241,9 +254,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -263,9 +276,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", - "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.1.tgz", + "integrity": "sha512-kwctwVlswSEsr4ljpmxKrRKp1eG1v2NAhlzFzDf1x1OdYaMjBYjDCbHkzWm57ZXzTwqn8stMXgROrnMw8dJK3w==", "cpu": [ "arm" ], @@ -277,9 +290,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", - "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.1.tgz", + "integrity": "sha512-4H5ZtZitBPlbPsTv6HBB8zh1g5d0T8TzCmpndQdqq20Ugle/nroOyDMf9p7f88Gsu8vBLU78/cuh8FYHZqdXxw==", "cpu": [ "arm64" ], @@ -291,9 +304,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", - "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.1.tgz", + "integrity": "sha512-f2AJ7Qwx9z25hikXvg+asco8Sfuc5NCLg8rmqQBIOUoWys5sb/ZX9RkMZDPdnnDevXAMJA5AWLnRBmgdXGEUiA==", "cpu": [ "arm64" ], @@ -305,9 +318,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", - "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.1.tgz", + "integrity": "sha512-+/2JBrRfISCsWE4aEFXxd+7k9nWGXA8+wh7ZUHn/u8UDXOU9LN+QYKKhd57sIn6WRcorOnlqPMYFIwie/OHXWw==", "cpu": [ "x64" ], @@ -319,9 +332,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", - "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.1.tgz", + "integrity": "sha512-SUeB0pYjIXwT2vfAMQ7E4ERPq9VGRrPR7Z+S4AMssah5EHIilYqjWQoTn5dkDtuIJUSTs8H+C9dwoEcg3b0sCA==", "cpu": [ "arm64" ], @@ -333,9 +346,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", - "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.1.tgz", + "integrity": "sha512-L3T66wAZiB/ooiPbxz0s6JEX6Sr2+HfgPSK+LMuZkaGZFAFCQAHiP3dbyqovYdNaiUXcl9TlgnIbcsIicAnOZg==", "cpu": [ "x64" ], @@ -347,9 +360,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", - "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.1.tgz", + "integrity": "sha512-UBXdQ4+ATARuFgsFrQ+tAsKvBi/Hly99aSVdeCUiHV9dRTTpMU7OrM3WXGys1l40wKVNiOl0QYY6cZQJ2xhKlQ==", "cpu": [ "arm" ], @@ -361,9 +374,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", - "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.1.tgz", + "integrity": "sha512-m/yfZ25HGdcCSwmopEJm00GP7xAUyVcBPjttGLRAqZ60X/bB4Qn6gP7XTwCIU6bITeKmIhhwZ4AMh2XLro+4+w==", "cpu": [ "arm" ], @@ -375,9 +388,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", - "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.1.tgz", + "integrity": "sha512-Wy+cUmFuvziNL9qWRRzboNprqSQ/n38orbjRvd6byYWridp5TJ3CD+0+HUsbcWVSNz9bxkDUkyASGP0zS7GAvg==", "cpu": [ "arm64" ], @@ -389,9 +402,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", - "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.1.tgz", + "integrity": "sha512-CQ3MAGgiFmQW5XJX5W3wnxOBxKwFlUAgSXFA2SwgVRjrIiVt5LHfcQLeNSHKq5OEZwv+VCBwlD1+YKCjDG8cpg==", "cpu": [ "arm64" ], @@ -402,10 +415,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.1.tgz", + "integrity": "sha512-rSzb1TsY4lSwH811cYC3OC2O2mzNMhM13vcnA7/0T6Mtreqr3/qs6WMDriMRs8yvHDI54qxHgOk8EV5YRAHFbw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", - "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.1.tgz", + "integrity": "sha512-fwr0n6NS0pG3QxxlqVYpfiY64Fd1Dqd8Cecje4ILAV01ROMp4aEdCj5ssHjRY3UwU7RJmeWd5fi89DBqMaTawg==", "cpu": [ "ppc64" ], @@ -417,9 +444,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", - "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.1.tgz", + "integrity": "sha512-4uJb9qz7+Z/yUp5RPxDGGGUcoh0PnKF33QyWgEZ3X/GocpWb6Mb+skDh59FEt5d8+Skxqs9mng6Swa6B2AmQZg==", "cpu": [ "riscv64" ], @@ -431,9 +458,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", - "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.1.tgz", + "integrity": "sha512-QlIo8ndocWBEnfmkYqj8vVtIUpIqJjfqKggjy7IdUncnt8BGixte1wDON7NJEvLg3Kzvqxtbo8tk+U1acYEBlw==", "cpu": [ "s390x" ], @@ -445,9 +472,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", - "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.1.tgz", + "integrity": "sha512-hzpleiKtq14GWjz3ahWvJXgU1DQC9DteiwcsY4HgqUJUGxZThlL66MotdUEK9zEo0PK/2ADeZGM9LIondE302A==", "cpu": [ "x64" ], @@ -459,9 +486,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", - "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.1.tgz", + "integrity": "sha512-jqtKrO715hDlvUcEsPn55tZt2TEiBvBtCMkUuU0R6fO/WPT7lO9AONjPbd8II7/asSiNVQHCMn4OLGigSuxVQA==", "cpu": [ "x64" ], @@ -473,9 +500,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", - "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.1.tgz", + "integrity": "sha512-RnHy7yFf2Wz8Jj1+h8klB93N0NHNHXFhNwAmiy9zJdpY7DE01VbEVtPdrK1kkILeIbHGRJjvfBDBhnxBr8kD4g==", "cpu": [ "arm64" ], @@ -487,9 +514,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", - "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.1.tgz", + "integrity": "sha512-i7aT5HdiZIcd7quhzvwQ2oAuX7zPYrYfkrd1QFfs28Po/i0q6kas/oRrzGlDhAEyug+1UfUtkWdmoVlLJj5x9Q==", "cpu": [ "ia32" ], @@ -501,9 +528,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", - "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.1.tgz", + "integrity": "sha512-k3MVFD9Oq+laHkw2N2v7ILgoa9017ZMF/inTtHzyTVZjYs9cSH18sdyAf6spBAJIGwJ5UaC7et2ZH1WCdlhkMw==", "cpu": [ "x64" ], @@ -515,9 +542,9 @@ ] }, "node_modules/@sveltestrap/sveltestrap": { - "version": "6.2.7", - "resolved": "https://registry.npmjs.org/@sveltestrap/sveltestrap/-/sveltestrap-6.2.7.tgz", - "integrity": "sha512-WwLLfAFUb42BGuRrf3Vbct30bQMzlEMMipN/MfxhjuLTmLQeW9muVJfPyvjtWS+mY+RjkSCoHvAp/ZobP1NLlQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@sveltestrap/sveltestrap/-/sveltestrap-7.0.3.tgz", + "integrity": "sha512-lvZpVlq7pHVxJbjq2d6JAAr/Z1mkSaPOw3pwpZiuQ9FK97/Pr66m5Bf9qZIc1FUkLnbNiDtRAbhVyR8LVdr3FQ==", "license": "MIT", "dependencies": { "@popperjs/core": "^2.11.8" @@ -547,9 +574,9 @@ "license": "MIT" }, "node_modules/@urql/core": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.0.8.tgz", - "integrity": "sha512-1GOnUw7/a9bzkcM0+U8U5MmxW2A7FE5YquuEmcJzTtW5tIs2EoS4F2ITpuKBjRBbyRjZgO860nWFPo1m4JImGA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.1.0.tgz", + "integrity": "sha512-yC3sw8yqjbX45GbXxfiBY8GLYCiyW/hLBbQF9l3TJrv4ro00Y0ChkKaD9I2KntRxAVm9IYBqh0awX8fwWAe/Yw==", "license": "MIT", "dependencies": { "@0no-co/graphql.web": "^1.0.5", @@ -582,6 +609,36 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-typescript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", + "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", + "license": "MIT", + "peerDependencies": { + "acorn": ">=8.9.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -591,6 +648,23 @@ "node": ">= 0.4" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -600,23 +674,6 @@ "node": ">= 0.4" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -625,9 +682,9 @@ "license": "MIT" }, "node_modules/chart.js": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz", - "integrity": "sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz", + "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -636,26 +693,25 @@ "pnpm": ">=8" } }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" + "engines": { + "node": ">=6" } }, - "node_modules/code-red/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/commander": { @@ -685,39 +741,37 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.21.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=0.11" + "node": ">=6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", "license": "MIT" }, "node_modules/deepmerge": { @@ -730,37 +784,103 @@ "node": ">=0.10.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/escape-latex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", "license": "MIT" }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, + "node_modules/esrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.3.tgz", + "integrity": "sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, - "node_modules/fraction.js": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.4.tgz", - "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==", + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, "license": "MIT", - "engines": { - "node": "*" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.2.1.tgz", + "integrity": "sha512-Ah6t/7YCYjrPUFUFsOsRLMXAdnYM+aQwmojD2Ayb/Ezr82SwES0vuyQ8qZ3QO8n9j7W14VJuVZZet8U3bhSdQQ==", + "license": "MIT", + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } }, "node_modules/fsevents": { "version": "2.3.3", @@ -787,31 +907,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "node_modules/get-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-1.0.0.tgz", + "integrity": "sha512-vg59F3kcXBOtcIijwtdAyCxFocyv/fVkGQvw1kVGrxFO1U4SSGkGjrbASg5DN3TVekVle/jltwOjYRnZWc1YdA==", + "license": "MIT", + "bin": { + "get-port": "cli.js" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -830,29 +941,23 @@ "node": ">= 0.4" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -895,29 +1000,30 @@ "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.14", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", - "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/mathjs": { - "version": "12.4.3", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.3.tgz", - "integrity": "sha512-oHdGPDbp7gO873xxG90RLq36IuicuKvbpr/bBG5g9c8Obm/VsKVrK9uoRZZHUodohzlnmCEqfDzbR3LH6m+aAQ==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-14.2.0.tgz", + "integrity": "sha512-CcJV1cQwRSrQIAAX3sWejFPUvUsQnTZYisEEuoMBw3gMDJDQzvKQlrul/vjKAbdtW7zaDzPCl04h1sf0wh41TA==", "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.24.4", - "complex.js": "^2.1.1", + "@babel/runtime": "^7.25.7", + "@lambdatest/node-tunnel": "^4.0.8", + "complex.js": "^2.2.5", "decimal.js": "^10.4.3", "escape-latex": "^1.2.0", - "fraction.js": "4.3.4", + "fraction.js": "^5.2.1", "javascript-natural-sort": "^0.7.1", "seedrandom": "^3.0.5", "tiny-emitter": "^2.1.0", - "typed-function": "^4.1.1" + "typed-function": "^4.2.1" }, "bin": { "mathjs": "bin/cli.js" @@ -926,34 +1032,32 @@ "node": ">= 18" } }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "license": "CC0-1.0" + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/path-parse": { "version": "1.0.7", @@ -962,35 +1066,6 @@ "dev": true, "license": "MIT" }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/periscopic/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/periscopic/node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, "node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", @@ -1003,6 +1078,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1020,27 +1101,30 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { @@ -1048,9 +1132,9 @@ } }, "node_modules/rollup": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", - "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", + "version": "4.34.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.1.tgz", + "integrity": "sha512-iYZ/+PcdLYSGfH3S+dGahlW/RWmsqDhLgj1BT9DH/xXJ0ggZN7xkdP9wipPNjjNLczI+fmMLmTB9pye+d2r4GQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1064,24 +1148,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.27.4", - "@rollup/rollup-android-arm64": "4.27.4", - "@rollup/rollup-darwin-arm64": "4.27.4", - "@rollup/rollup-darwin-x64": "4.27.4", - "@rollup/rollup-freebsd-arm64": "4.27.4", - "@rollup/rollup-freebsd-x64": "4.27.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", - "@rollup/rollup-linux-arm-musleabihf": "4.27.4", - "@rollup/rollup-linux-arm64-gnu": "4.27.4", - "@rollup/rollup-linux-arm64-musl": "4.27.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", - "@rollup/rollup-linux-riscv64-gnu": "4.27.4", - "@rollup/rollup-linux-s390x-gnu": "4.27.4", - "@rollup/rollup-linux-x64-gnu": "4.27.4", - "@rollup/rollup-linux-x64-musl": "4.27.4", - "@rollup/rollup-win32-arm64-msvc": "4.27.4", - "@rollup/rollup-win32-ia32-msvc": "4.27.4", - "@rollup/rollup-win32-x64-msvc": "4.27.4", + "@rollup/rollup-android-arm-eabi": "4.34.1", + "@rollup/rollup-android-arm64": "4.34.1", + "@rollup/rollup-darwin-arm64": "4.34.1", + "@rollup/rollup-darwin-x64": "4.34.1", + "@rollup/rollup-freebsd-arm64": "4.34.1", + "@rollup/rollup-freebsd-x64": "4.34.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.1", + "@rollup/rollup-linux-arm-musleabihf": "4.34.1", + "@rollup/rollup-linux-arm64-gnu": "4.34.1", + "@rollup/rollup-linux-arm64-musl": "4.34.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.1", + "@rollup/rollup-linux-riscv64-gnu": "4.34.1", + "@rollup/rollup-linux-s390x-gnu": "4.34.1", + "@rollup/rollup-linux-x64-gnu": "4.34.1", + "@rollup/rollup-linux-x64-musl": "4.34.1", + "@rollup/rollup-win32-arm64-msvc": "4.34.1", + "@rollup/rollup-win32-ia32-msvc": "4.34.1", + "@rollup/rollup-win32-x64-msvc": "4.34.1", "fsevents": "~2.3.2" } }, @@ -1200,15 +1285,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -1220,6 +1296,18 @@ "source-map": "^0.6.0" } }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -1234,47 +1322,28 @@ } }, "node_modules/svelte": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", - "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", + "version": "5.19.6", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.19.6.tgz", + "integrity": "sha512-6ydekB3qyqUal+UhfMjmVOjRGtxysR8vuiMhi2nwuBtPJWnctVlsGspjVFB05qmR+TXI1emuqtZt81c0XiFleA==", "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/estree": "^1.0.1", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "acorn-typescript": "^1.4.13", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^1.4.3", + "is-reference": "^3.0.3", "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" }, "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-chartjs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/svelte-chartjs/-/svelte-chartjs-3.1.5.tgz", - "integrity": "sha512-ka2zh7v5FiwfAX1oMflZ0HkNkgjHjFqANgRyC+vNYXfxtx2ku68Zo+2KgbKeBH2nS1ThDqkIACPzGxy4T0UaoA==", - "license": "MIT", - "peerDependencies": { - "chart.js": "^3.5.0 || ^4.0.0", - "svelte": "^4.0.0" - } - }, - "node_modules/svelte/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "node": ">=18" } }, "node_modules/svelte/node_modules/is-reference": { @@ -1287,9 +1356,9 @@ } }, "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1305,6 +1374,12 @@ "node": ">=10" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, "node_modules/tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", @@ -1332,12 +1407,11 @@ "integrity": "sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==", "license": "MIT" }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "node_modules/zimmerframe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", + "license": "MIT" } } } diff --git a/web/frontend/package.json b/web/frontend/package.json index 389ffe6..6a52004 100644 --- a/web/frontend/package.json +++ b/web/frontend/package.json @@ -7,24 +7,23 @@ "dev": "rollup -c -w" }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.8", - "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-commonjs": "^28.0.2", + "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-terser": "^0.4.4", "@timohausmann/quadtree-js": "^1.2.6", - "rollup": "^4.27.4", + "rollup": "^4.34.1", "rollup-plugin-css-only": "^4.5.2", "rollup-plugin-svelte": "^7.2.2", - "svelte": "^4.2.19" + "svelte": "^5.19.6" }, "dependencies": { - "@rollup/plugin-replace": "^5.0.7", - "@sveltestrap/sveltestrap": "^6.2.7", + "@rollup/plugin-replace": "^6.0.2", + "@sveltestrap/sveltestrap": "^7.0.3", "@urql/svelte": "^4.2.2", - "chart.js": "^4.4.6", - "date-fns": "^2.30.0", - "graphql": "^16.9.0", - "mathjs": "^12.4.3", - "svelte-chartjs": "^3.1.5", + "chart.js": "^4.4.7", + "date-fns": "^4.1.0", + "graphql": "^16.10.0", + "mathjs": "^14.2.0", "uplot": "^1.6.31", "wonka": "^6.3.4" } diff --git a/web/frontend/src/Analysis.root.svelte b/web/frontend/src/Analysis.root.svelte index 40757d3..b90a614 100644 --- a/web/frontend/src/Analysis.root.svelte +++ b/web/frontend/src/Analysis.root.svelte @@ -386,6 +386,7 @@ {$topQuery.error.message} {:else} @@ -23,14 +24,15 @@ import NavbarLinks from "./header/NavbarLinks.svelte"; import NavbarTools from "./header/NavbarTools.svelte"; - export let username; - export let authlevel; - export let clusters; - export let subClusters; - export let roles; + let { username, authlevel, clusters, subClusters, roles } = $props(); - let isOpen = false; - let screenSize; + let isOpen = $state(false); + let screenSize = $state(0); + + let showMax = $derived(screenSize >= 1500); + let showMid = $derived(screenSize < 1500 && screenSize >= 1300); + let showSml = $derived(screenSize < 1300 && screenSize >= 768); + let showBrg = $derived(screenSize < 768); const jobsTitle = new Map(); jobsTitle.set(2, "Job Search"); @@ -123,26 +125,28 @@ + ClusterCockpit Logo - (isOpen = !isOpen)} /> + (isOpen = !isOpen)} /> (isOpen = detail.isOpen)} + onupdate={({ detail }) => (isOpen = detail.isOpen)} > - + \ No newline at end of file diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index f34b98b..15e714e 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -478,6 +478,7 @@ {$topUserQuery.error.message} {:else} {$topProjectQuery.error.message} {:else}

- - {#if displayMessage}

- {message.msg} -
{/if} + + {#if displayMessage} + {message.msg} + {/if}

diff --git a/web/frontend/src/generic/joblist/JobInfo.svelte b/web/frontend/src/generic/joblist/JobInfo.svelte index 8917653..a4a555c 100644 --- a/web/frontend/src/generic/joblist/JobInfo.svelte +++ b/web/frontend/src/generic/joblist/JobInfo.svelte @@ -91,15 +91,15 @@ {#if job.metaData?.jobName} {#if job.metaData?.jobName.length <= 25} -
{job.metaData.jobName}
+ {job.metaData.jobName} {:else} -
{job.metaData.jobName} -
+ {/if} {/if} {#if job.arrayJobId} diff --git a/web/frontend/src/generic/joblist/Pagination.svelte b/web/frontend/src/generic/joblist/Pagination.svelte index 77f6bc9..677bed8 100644 --- a/web/frontend/src/generic/joblist/Pagination.svelte +++ b/web/frontend/src/generic/joblist/Pagination.svelte @@ -28,13 +28,13 @@
{#if !backButtonDisabled} - - {/if} {#if !nextButtonDisabled} - {/if}
diff --git a/web/frontend/src/generic/plots/Histogram.svelte b/web/frontend/src/generic/plots/Histogram.svelte index fbc5a33..88eec90 100644 --- a/web/frontend/src/generic/plots/Histogram.svelte +++ b/web/frontend/src/generic/plots/Histogram.svelte @@ -259,7 +259,7 @@
{#if data.length > 0} -
+
{:else} Cannot render histogram: No data! 0}
+ >
{:else} Cannot render plot: No series data returned for {metric} +
- +
From 3d6dca938654250c2d50b9783a394cb8b686eae2 Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 6 Jun 2025 16:04:37 +0200 Subject: [PATCH 094/120] Add more apps for tagger --- internal/tagger/apps/alf.txt | 1 + internal/tagger/apps/caracal.txt | 7 +++++++ internal/tagger/apps/chroma.txt | 3 +++ internal/tagger/apps/cp2k.txt | 1 + internal/tagger/apps/cpmd.txt | 1 + internal/tagger/apps/flame.txt | 1 + internal/tagger/apps/gromacs.txt | 3 +-- internal/tagger/apps/lammps.txt | 1 + internal/tagger/apps/orca.txt | 1 + internal/tagger/apps/python.txt | 1 + internal/tagger/apps/qe.txt | 3 +++ internal/tagger/apps/turbomole.txt | 10 ++++++++++ internal/tagger/apps/vasp.txt | 1 - internal/tagger/detectApp.go | 2 +- 14 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 internal/tagger/apps/alf.txt create mode 100644 internal/tagger/apps/caracal.txt create mode 100644 internal/tagger/apps/chroma.txt create mode 100644 internal/tagger/apps/cp2k.txt create mode 100644 internal/tagger/apps/cpmd.txt create mode 100644 internal/tagger/apps/flame.txt create mode 100644 internal/tagger/apps/lammps.txt create mode 100644 internal/tagger/apps/orca.txt create mode 100644 internal/tagger/apps/qe.txt create mode 100644 internal/tagger/apps/turbomole.txt diff --git a/internal/tagger/apps/alf.txt b/internal/tagger/apps/alf.txt new file mode 100644 index 0000000..c455f9e --- /dev/null +++ b/internal/tagger/apps/alf.txt @@ -0,0 +1 @@ +alf diff --git a/internal/tagger/apps/caracal.txt b/internal/tagger/apps/caracal.txt new file mode 100644 index 0000000..ed61512 --- /dev/null +++ b/internal/tagger/apps/caracal.txt @@ -0,0 +1,7 @@ +calc_rate +qmdffgen +dynamic +evbopt +explore +black_box +poly_qmdff diff --git a/internal/tagger/apps/chroma.txt b/internal/tagger/apps/chroma.txt new file mode 100644 index 0000000..0e5b50e --- /dev/null +++ b/internal/tagger/apps/chroma.txt @@ -0,0 +1,3 @@ +chroma +qdp +qmp diff --git a/internal/tagger/apps/cp2k.txt b/internal/tagger/apps/cp2k.txt new file mode 100644 index 0000000..1e5341c --- /dev/null +++ b/internal/tagger/apps/cp2k.txt @@ -0,0 +1 @@ +cp2k diff --git a/internal/tagger/apps/cpmd.txt b/internal/tagger/apps/cpmd.txt new file mode 100644 index 0000000..788aa78 --- /dev/null +++ b/internal/tagger/apps/cpmd.txt @@ -0,0 +1 @@ +cpmd diff --git a/internal/tagger/apps/flame.txt b/internal/tagger/apps/flame.txt new file mode 100644 index 0000000..6e13cbf --- /dev/null +++ b/internal/tagger/apps/flame.txt @@ -0,0 +1 @@ +flame diff --git a/internal/tagger/apps/gromacs.txt b/internal/tagger/apps/gromacs.txt index c5d939b..6fe8779 100644 --- a/internal/tagger/apps/gromacs.txt +++ b/internal/tagger/apps/gromacs.txt @@ -1,4 +1,3 @@ -GROMACS gromacs -GMX +gmx mdrun diff --git a/internal/tagger/apps/lammps.txt b/internal/tagger/apps/lammps.txt new file mode 100644 index 0000000..d254f82 --- /dev/null +++ b/internal/tagger/apps/lammps.txt @@ -0,0 +1 @@ +lmp diff --git a/internal/tagger/apps/orca.txt b/internal/tagger/apps/orca.txt new file mode 100644 index 0000000..28f7a1e --- /dev/null +++ b/internal/tagger/apps/orca.txt @@ -0,0 +1 @@ +orca diff --git a/internal/tagger/apps/python.txt b/internal/tagger/apps/python.txt index 7a5c661..29bc0f7 100644 --- a/internal/tagger/apps/python.txt +++ b/internal/tagger/apps/python.txt @@ -1,3 +1,4 @@ python +pip anaconda conda diff --git a/internal/tagger/apps/qe.txt b/internal/tagger/apps/qe.txt new file mode 100644 index 0000000..a1f7106 --- /dev/null +++ b/internal/tagger/apps/qe.txt @@ -0,0 +1,3 @@ +pw +neb +ph diff --git a/internal/tagger/apps/turbomole.txt b/internal/tagger/apps/turbomole.txt new file mode 100644 index 0000000..7d88ab6 --- /dev/null +++ b/internal/tagger/apps/turbomole.txt @@ -0,0 +1,10 @@ +dscf +grad +ridft +rdgrad +ricc2 +statpt +aoforce +escf +egrad +odft diff --git a/internal/tagger/apps/vasp.txt b/internal/tagger/apps/vasp.txt index eec9092..bd537e4 100644 --- a/internal/tagger/apps/vasp.txt +++ b/internal/tagger/apps/vasp.txt @@ -1,2 +1 @@ -VASP vasp diff --git a/internal/tagger/detectApp.go b/internal/tagger/detectApp.go index 9e4bf29..00f8286 100644 --- a/internal/tagger/detectApp.go +++ b/internal/tagger/detectApp.go @@ -111,7 +111,7 @@ func (t *AppTagger) Match(job *schema.Job) { for _, a := range t.apps { tag := a.tag for _, s := range a.strings { - if strings.Contains(jobscript, s) { + if strings.Contains(strings.ToLower(jobscript), s) { if !r.HasTag(id, t.tagType, tag) { r.AddTagOrCreateDirect(id, t.tagType, tag) break out From 87c93e90cd73868cfcb7f581fed9d42b8849730b Mon Sep 17 00:00:00 2001 From: Jan Eitzinger Date: Fri, 6 Jun 2025 16:04:53 +0200 Subject: [PATCH 095/120] Implement node query --- api/schema.graphqls | 1 - internal/repository/node.go | 49 +++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/api/schema.graphqls b/api/schema.graphqls index a7bafde..794c630 100644 --- a/api/schema.graphqls +++ b/api/schema.graphqls @@ -393,7 +393,6 @@ type TimeRangeOutput { input NodeFilter { hostname: StringInput cluster: StringInput - subCluster: StringInput nodeState: NodeState healthState: MonitoringState } diff --git a/internal/repository/node.go b/internal/repository/node.go index 29200ec..f6425cf 100644 --- a/internal/repository/node.go +++ b/internal/repository/node.go @@ -5,6 +5,7 @@ package repository import ( + "context" "database/sql" "encoding/json" "fmt" @@ -12,6 +13,7 @@ import ( "sync" "time" + "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/pkg/archive" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/lrucache" @@ -212,8 +214,51 @@ func (r *NodeRepository) DeleteNode(id int64) error { return nil } -func (r *NodeRepository) QueryNodes() ([]*schema.Node, error) { - return nil, nil +func (r *NodeRepository) QueryNodes( + ctx context.Context, + filters []*model.NodeFilter, +) ([]*schema.Node, error) { + query, qerr := SecurityCheck(ctx, sq.Select(jobColumns...).From("node")) + if qerr != nil { + return nil, qerr + } + + for _, f := range filters { + if f.Hostname != nil { + query = buildStringCondition("node.hostname", f.Hostname, query) + } + if f.Cluster != nil { + query = buildStringCondition("node.cluster", f.Cluster, query) + } + if f.NodeState != nil { + query = query.Where("node.node_state = ?", f.NodeState) + } + if f.HealthState != nil { + query = query.Where("node.health_state = ?", f.HealthState) + } + } + + rows, err := query.RunWith(r.stmtCache).Query() + if err != nil { + queryString, queryVars, _ := query.ToSql() + log.Errorf("Error while running query '%s' %v: %v", queryString, queryVars, err) + return nil, err + } + + nodes := make([]*schema.Node, 0, 50) + for rows.Next() { + node := schema.Node{} + + if err := rows.Scan(&node.Hostname, &node.Cluster, &node.SubCluster, + &node.NodeState, &node.HealthState); err != nil { + rows.Close() + log.Warn("Error while scanning rows (Nodes)") + return nil, err + } + nodes = append(nodes, &node) + } + + return nodes, nil } func (r *NodeRepository) ListNodes(cluster string) ([]*schema.Node, error) { From c22d869aa7de2093236701b606129dbf0454f869 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 6 Jun 2025 16:17:42 +0200 Subject: [PATCH 096/120] Move form to cardbody instead of classing --- .../src/config/support/SupportOptions.svelte | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/web/frontend/src/config/support/SupportOptions.svelte b/web/frontend/src/config/support/SupportOptions.svelte index 7d2b0cd..88541e0 100644 --- a/web/frontend/src/config/support/SupportOptions.svelte +++ b/web/frontend/src/config/support/SupportOptions.svelte @@ -3,7 +3,7 @@ --> @@ -108,7 +110,7 @@ @@ -139,6 +141,7 @@ placeholder="Filter hostname ..." type="text" bind:value={pendingHostnameFilter} + oninput={updateHostnameFilter} /> @@ -153,26 +156,28 @@ Metric - {#each systemMetrics as metric} + {#each systemMetrics as metric (metric.name)} {metric.name} {presetSystemUnits[metric.name] ? "("+presetSystemUnits[metric.name]+")" : ""} + {:else} + {/each} {/if} - - - { - const diff = Date.now() - to; - from = new Date(from.getTime() + diff); - to = new Date(to.getTime() + diff); - }} - /> - {/if} + + + { + const diff = Date.now() - to; + from = new Date(from.getTime() + diff); + to = new Date(to.getTime() + diff); + }} + /> + @@ -185,20 +190,22 @@ {:else} {#if displayNodeOverview} - + {:else} - + {/if} {/if} - - selectedMetrics = [...newMetrics] - } -/> +{#if !displayNodeOverview} + + selectedMetrics = [...newMetrics] + } + /> +{/if} diff --git a/web/frontend/src/systems.entrypoint.js b/web/frontend/src/systems.entrypoint.js index 2976b7d..8d5fd41 100644 --- a/web/frontend/src/systems.entrypoint.js +++ b/web/frontend/src/systems.entrypoint.js @@ -8,8 +8,8 @@ mount(Systems, { displayType: displayType, cluster: infos.cluster, subCluster: infos.subCluster, - from: infos.from, - to: infos.to + fromPreset: infos.from, + toPreset: infos.to }, context: new Map([ ['cc-config', clusterCockpitConfig], diff --git a/web/frontend/src/systems/NodeList.svelte b/web/frontend/src/systems/NodeList.svelte index c8a5e51..bcdd293 100644 --- a/web/frontend/src/systems/NodeList.svelte +++ b/web/frontend/src/systems/NodeList.svelte @@ -10,38 +10,28 @@ --> @@ -192,7 +216,7 @@ scope="col" style="padding-top: {headerPaddingTop}px" > - {metric} ({systemUnits[metric]}) + {metric} ({presetSystemUnits[metric]}) {/each} @@ -212,7 +236,7 @@ No nodes found {/each} - {/if} + {/if} {#if $nodesQuery.fetching || !$nodesQuery.data} @@ -244,10 +268,11 @@ totalItems={matchedNodes} on:update-paging={({ detail }) => { if (detail.itemsPerPage != itemsPerPage) { - updateConfiguration(detail.itemsPerPage.toString(), detail.page); + updateConfiguration(detail.itemsPerPage, detail.page); } else { - nodes = [] - paging = { itemsPerPage: detail.itemsPerPage, page: detail.page }; + nodes = []; + itemsPerPage = detail.itemsPerPage; + page = detail.page; } }} /> diff --git a/web/frontend/src/systems/NodeOverview.svelte b/web/frontend/src/systems/NodeOverview.svelte index 68ccd78..2e7ae3c 100644 --- a/web/frontend/src/systems/NodeOverview.svelte +++ b/web/frontend/src/systems/NodeOverview.svelte @@ -10,101 +10,99 @@ @@ -132,22 +130,25 @@ >{item.host} ({item.subCluster}) - {#if item?.disabled[selectedMetric]} + {#if item?.disabled} Metric disabled for subcluster {selectedMetric}:{item.subCluster} {:else} - - + + + {#key item.data[0].metric.series[0].data.length} + + {/key} {/if} {/each} From ad108b285f5b94391b7a59fb886e66525bad9c3d Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 12 Jun 2025 17:20:22 +0200 Subject: [PATCH 100/120] fix continuous scroll next page logic error --- internal/metricdata/cc-metric-store.go | 2 +- internal/metricdata/prometheus.go | 2 +- web/frontend/src/systems/NodeList.svelte | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/metricdata/cc-metric-store.go b/internal/metricdata/cc-metric-store.go index 557e1d2..b76ed5b 100644 --- a/internal/metricdata/cc-metric-store.go +++ b/internal/metricdata/cc-metric-store.go @@ -850,7 +850,7 @@ func (ccms *CCMetricStore) LoadNodeListData( if len(nodes) > page.ItemsPerPage { start := (page.Page - 1) * page.ItemsPerPage end := start + page.ItemsPerPage - if end > len(nodes) { + if end >= len(nodes) { end = len(nodes) hasNextPage = false } else { diff --git a/internal/metricdata/prometheus.go b/internal/metricdata/prometheus.go index fa49764..e0add3a 100644 --- a/internal/metricdata/prometheus.go +++ b/internal/metricdata/prometheus.go @@ -539,7 +539,7 @@ func (pdb *PrometheusDataRepository) LoadNodeListData( if len(nodes) > page.ItemsPerPage { start := (page.Page - 1) * page.ItemsPerPage end := start + page.ItemsPerPage - if end > len(nodes) { + if end >= len(nodes) { end = len(nodes) hasNextPage = false } else { diff --git a/web/frontend/src/systems/NodeList.svelte b/web/frontend/src/systems/NodeList.svelte index bcdd293..16d7755 100644 --- a/web/frontend/src/systems/NodeList.svelte +++ b/web/frontend/src/systems/NodeList.svelte @@ -86,11 +86,10 @@ let page = $state(1); let itemsPerPage = $state(usePaging ? (ccconfig?.plot_list_nodesPerPage || 10) : 10); let headerPaddingTop = $state(0); + let matchedNodes = $state(0); /* Derived */ const paging = $derived({ itemsPerPage, page }); - const matchedNodes = $derived($nodesQuery?.data?.nodeMetricsList?.totalNodes || 0); - const nodesQuery = $derived(queryStore({ client: client, query: nodeListQuery, @@ -119,7 +118,7 @@ } = document.documentElement; // Add 100 px offset to trigger load earlier - if (scrollTop + clientHeight >= scrollHeight - 100 && $nodesQuery?.data != null && $nodesQuery.data?.nodeMetricsList.hasNextPage) { + if (scrollTop + clientHeight >= scrollHeight - 100 && $nodesQuery?.data?.nodeMetricsList?.hasNextPage) { page += 1 }; }); @@ -127,7 +126,7 @@ }); $effect(() => { - handleNodes($nodesQuery?.data?.nodeMetricsList?.items); + handleNodes($nodesQuery?.data?.nodeMetricsList); }); $effect(() => { @@ -145,14 +144,15 @@ /* Functions */ function handleNodes(data) { if (data) { + matchedNodes = data.totalNodes; if (usePaging || nodes.length == 0) { - nodes = [...data].sort((a, b) => a.host.localeCompare(b.host)); + nodes = [...data.items].sort((a, b) => a.host.localeCompare(b.host)); } else { // Workaround to ignore secondary store triggers (reason tbd) const oldNodes = $state.snapshot(nodes) - const newNodes = [...data].map((d) => d.host) + const newNodes = [...data.items].map((d) => d.host) if (!oldNodes.some((n) => newNodes.includes(n.host))) { - nodes = nodes.concat([...data].sort((a, b) => a.host.localeCompare(b.host))) + nodes = nodes.concat([...data.items].sort((a, b) => a.host.localeCompare(b.host))) }; }; }; From 27ec445e545b8e353c8222c4b51070bcaea6b780 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Jun 2025 14:39:55 +0200 Subject: [PATCH 101/120] Small migrations and added migration note --- web/frontend/src/generic/PlotGrid.svelte | 11 ++ .../src/generic/helper/ConcurrentJobs.svelte | 13 +- .../src/generic/helper/JobFootprint.svelte | 143 ++++++++++-------- .../src/generic/plots/Comparogram.svelte | 2 +- 4 files changed, 97 insertions(+), 72 deletions(-) diff --git a/web/frontend/src/generic/PlotGrid.svelte b/web/frontend/src/generic/PlotGrid.svelte index 5152e0d..c324409 100644 --- a/web/frontend/src/generic/PlotGrid.svelte +++ b/web/frontend/src/generic/PlotGrid.svelte @@ -14,6 +14,17 @@ export let itemsPerRow export let items + + /* Migtation Notes + * Requirements + * - Parent Components must be already Migrated + * - TODO: Job.root.svelte, Node.root.svelte + * + * How-To + * - Define "Plot-Slotcode" as SV5 Snippet with argument "item" in parent (!) + * - Pass new snippet as argument/prop to here + * - @render snippet in items-loop with argument == item + */ diff --git a/web/frontend/src/generic/helper/ConcurrentJobs.svelte b/web/frontend/src/generic/helper/ConcurrentJobs.svelte index 85bac83..d42ace1 100644 --- a/web/frontend/src/generic/helper/ConcurrentJobs.svelte +++ b/web/frontend/src/generic/helper/ConcurrentJobs.svelte @@ -17,11 +17,14 @@ Icon } from "@sveltestrap/sveltestrap"; - export let cJobs; - export let showLinks = false; - export let renderCard = false; - export let width = "auto"; - export let height = "400px"; + /* Svelte 5 Props */ + let { + cJobs, + showLinks = false, + renderCard = false, + width = "auto", + height = "400px", + } = $props(); {#if renderCard} diff --git a/web/frontend/src/generic/helper/JobFootprint.svelte b/web/frontend/src/generic/helper/JobFootprint.svelte index 80e905b..8d89731 100644 --- a/web/frontend/src/generic/helper/JobFootprint.svelte +++ b/web/frontend/src/generic/helper/JobFootprint.svelte @@ -23,79 +23,90 @@ } from "@sveltestrap/sveltestrap"; import { findJobFootprintThresholds } from "../utils.js"; - export let job; - export let displayTitle = true; - export let width = "auto"; - export let height = "310px"; + /* Svelte 5 Props */ + let { + job, + displayTitle = true, + width = "auto", + height = "310px", + } = $props(); - const footprintData = job?.footprint?.map((jf) => { - const fmc = getContext("getMetricConfig")(job.cluster, job.subCluster, jf.name); - if (fmc) { - // Unit - const unit = (fmc?.unit?.prefix ? fmc.unit.prefix : "") + (fmc?.unit?.base ? fmc.unit.base : "") + /* Derived */ + const footprintData = $derived(buildFootprint(job?.footprint)); + + /* Functions */ + function buildFootprint(input) { + let result = input?.map((jf) => { + const fmc = getContext("getMetricConfig")(job.cluster, job.subCluster, jf.name); + if (fmc) { + // Unit + const unit = (fmc?.unit?.prefix ? fmc.unit.prefix : "") + (fmc?.unit?.base ? fmc.unit.base : "") - // Threshold / -Differences - const fmt = findJobFootprintThresholds(job, jf.stat, fmc); + // Threshold / -Differences + const fmt = findJobFootprintThresholds(job, jf.stat, fmc); - // Define basic data -> Value: Use as Provided - const fmBase = { - name: jf.name + ' (' + jf.stat + ')', - avg: jf.value, - unit: unit, - max: fmt.peak, - dir: fmc.lowerIsBetter - }; - - if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "alert")) { - return { - ...fmBase, - color: "danger", - message: `Footprint value way ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, - impact: 3 + // Define basic data -> Value: Use as Provided + const fmBase = { + name: jf.name + ' (' + jf.stat + ')', + avg: jf.value, + unit: unit, + max: fmt.peak, + dir: fmc.lowerIsBetter }; - } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "caution")) { + + if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "alert")) { + return { + ...fmBase, + color: "danger", + message: `Footprint value way ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, + impact: 3 + }; + } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "caution")) { + return { + ...fmBase, + color: "warning", + message: `Footprint value ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, + impact: 2, + }; + } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "normal")) { + return { + ...fmBase, + color: "success", + message: "Footprint value within expected thresholds.", + impact: 1, + }; + } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "peak")) { + return { + ...fmBase, + color: "info", + message: + "Footprint value above expected normal threshold: Check for artifacts recommended.", + impact: 0, + }; + } else { + return { + ...fmBase, + color: "secondary", + message: + "Footprint value above expected peak threshold: Check for artifacts!", + impact: -1, + }; + } + } else { // No matching metric config: display as single value return { - ...fmBase, - color: "warning", - message: `Footprint value ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, - impact: 2, - }; - } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "normal")) { - return { - ...fmBase, - color: "success", - message: "Footprint value within expected thresholds.", - impact: 1, - }; - } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "peak")) { - return { - ...fmBase, - color: "info", + name: jf.name + ' (' + jf.stat + ')', + avg: jf.value, message: - "Footprint value above expected normal threshold: Check for artifacts recommended.", - impact: 0, - }; - } else { - return { - ...fmBase, - color: "secondary", - message: - "Footprint value above expected peak threshold: Check for artifacts!", - impact: -1, + `No config for metric ${jf.name} found.`, + impact: 4, }; } - } else { // No matching metric config: display as single value - return { - name: jf.name + ' (' + jf.stat + ')', - avg: jf.value, - message: - `No config for metric ${jf.name} found.`, - impact: 4, - }; - } - }).sort(function (a, b) { // Sort by impact value primarily, within impact sort name alphabetically - return a.impact - b.impact || ((a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)); - });; + }).sort(function (a, b) { // Sort by impact value primarily, within impact sort name alphabetically + return a.impact - b.impact || ((a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)); + });; + + return result; + }; function evalFootprint(value, thresholds, lowerIsBetter, level) { // Handle Metrics in which less value is better @@ -176,7 +187,7 @@ >{fpd.message}
- + {#if fpd.dir} diff --git a/web/frontend/src/generic/plots/Comparogram.svelte b/web/frontend/src/generic/plots/Comparogram.svelte index 6779308..ca3bf9c 100644 --- a/web/frontend/src/generic/plots/Comparogram.svelte +++ b/web/frontend/src/generic/plots/Comparogram.svelte @@ -306,7 +306,7 @@ {#if data && data[0].length > 0}
+ >
{:else} Cannot render plot: No series data returned for {metric?metric:'job resources'} Date: Fri, 13 Jun 2025 14:40:07 +0200 Subject: [PATCH 102/120] Remove unused component --- web/frontend/src/generic/PlotTable.svelte | 59 ----------------------- 1 file changed, 59 deletions(-) delete mode 100644 web/frontend/src/generic/PlotTable.svelte diff --git a/web/frontend/src/generic/PlotTable.svelte b/web/frontend/src/generic/PlotTable.svelte deleted file mode 100644 index 4bc0694..0000000 --- a/web/frontend/src/generic/PlotTable.svelte +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - {#each rows as row} - - {#each row as item (item)} - - {/each} - - {/each} -
- {#if !isPlaceholder(item) && plotWidth > 0} - - {/if} -
From b7823cec16a2ca407538aebfc506f3ac23a38980 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Jun 2025 14:46:09 +0200 Subject: [PATCH 103/120] Migrate header components --- web/frontend/src/header/NavbarLinks.svelte | 11 +++++++---- web/frontend/src/header/NavbarTools.svelte | 15 +++++++++------ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/web/frontend/src/header/NavbarLinks.svelte b/web/frontend/src/header/NavbarLinks.svelte index 26e7370..50aaf3a 100644 --- a/web/frontend/src/header/NavbarLinks.svelte +++ b/web/frontend/src/header/NavbarLinks.svelte @@ -18,10 +18,13 @@ DropdownItem, } from "@sveltestrap/sveltestrap"; - export let clusters; - export let subClusters; - export let links; - export let direction = "down"; + /* Svelte 5 Props */ + let { + clusters, + subClusters, + links, + direction = "down" + } = $props(); {#each links as item} diff --git a/web/frontend/src/header/NavbarTools.svelte b/web/frontend/src/header/NavbarTools.svelte index 1382b28..ac0a261 100644 --- a/web/frontend/src/header/NavbarTools.svelte +++ b/web/frontend/src/header/NavbarTools.svelte @@ -25,10 +25,13 @@ Col, } from "@sveltestrap/sveltestrap"; - export let username; - export let authlevel; - export let roles; - export let screenSize; + /* Svelte 5 Props */ + let { + username, + authlevel, + roles, + screenSize + } = $props();
- + {#if fpd.dir} diff --git a/web/frontend/src/job/jobsummary/JobFootprintPolar.svelte b/web/frontend/src/job/jobsummary/JobFootprintPolar.svelte index 4048b2b..f606ad5 100644 --- a/web/frontend/src/job/jobsummary/JobFootprintPolar.svelte +++ b/web/frontend/src/job/jobsummary/JobFootprintPolar.svelte @@ -20,8 +20,10 @@ import Polar from "../../generic/plots/Polar.svelte"; import { findJobFootprintThresholds } from "../../generic/utils.js"; - export let job; + /* Svelte 5 Props */ + let { job } = $props(); + /* Const Init */ // Metric Names Configured To Be Footprints For (sub)Cluster const clusterFootprintMetrics = getContext("clusters") .find((c) => c.name == job.cluster)?.subClusters @@ -39,23 +41,24 @@ // Pull All Series For Footprint Metrics Statistics Only On Node Scope const client = getContextClient(); const polarQuery = gql` - query ($dbid: ID!, $selectedMetrics: [String!]!) { - jobStats(id: $dbid, metrics: $selectedMetrics) { - name - data { - min - avg - max + query ($dbid: ID!, $selectedMetrics: [String!]!) { + jobStats(id: $dbid, metrics: $selectedMetrics) { + name + data { + min + avg + max + } } } - } `; - $: polarData = queryStore({ + /* Derived */ + const polarData = $derived(queryStore({ client: client, query: polarQuery, variables:{ dbid: job.id, selectedMetrics: clusterFootprintMetrics }, - }); + })); From d40657dc64d35badc57e435b0fe36154e90df4b9 Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Fri, 13 Jun 2025 17:05:07 +0200 Subject: [PATCH 105/120] Migrate pagination and jobinfo --- web/frontend/src/generic/JobList.svelte | 2 +- .../src/generic/joblist/JobInfo.svelte | 39 +++++---- .../src/generic/joblist/Pagination.svelte | 79 +++++++++++-------- web/frontend/src/systems/NodeList.svelte | 2 +- 4 files changed, 70 insertions(+), 52 deletions(-) diff --git a/web/frontend/src/generic/JobList.svelte b/web/frontend/src/generic/JobList.svelte index 978a582..be239d0 100644 --- a/web/frontend/src/generic/JobList.svelte +++ b/web/frontend/src/generic/JobList.svelte @@ -321,7 +321,7 @@ {itemsPerPage} itemText="Jobs" totalItems={matchedListJobs} - on:update-paging={({ detail }) => { + updatePaging={(detail) => { if (detail.itemsPerPage != itemsPerPage) { updateConfiguration(detail.itemsPerPage.toString(), detail.page); } else { diff --git a/web/frontend/src/generic/joblist/JobInfo.svelte b/web/frontend/src/generic/joblist/JobInfo.svelte index ebf4811..5886c61 100644 --- a/web/frontend/src/generic/joblist/JobInfo.svelte +++ b/web/frontend/src/generic/joblist/JobInfo.svelte @@ -12,15 +12,22 @@ import Tag from "../helper/Tag.svelte"; import TagManagement from "../helper/TagManagement.svelte"; - export let job; - export let jobTags = job.tags; - export let showTagedit = false; - export let username = null; - export let authlevel= null; - export let roles = null; - export let isSelected = null; - export let showSelect = false; + /* Svelte 5 Props */ + let { + job, + jobTags = job.tags, + showTagedit = false, + username = null, + authlevel= null, + roles = null, + isSelected = null, + showSelect = false, + } = $props(); + /* State Init */ + let displayCheck = $state(false); + + /* Functions */ function formatDuration(duration) { const hours = Math.floor(duration / 3600); duration -= hours * 3600; @@ -41,9 +48,8 @@ } } - let displayCheck = false; function clipJobId(jid) { - displayCheck = true; + // Navigator clipboard api needs a secure context (https) if (navigator.clipboard && window.isSecureContext) { navigator.clipboard @@ -65,9 +71,6 @@ textArea.remove(); } } - setTimeout(function () { - displayCheck = false; - }, 1000); } @@ -81,7 +84,7 @@ {#if showSelect} + onclick={(e) => pageReset(e)}> + onclick={(e) => pageBack(e)}> {/if} {#if !nextButtonDisabled} + onclick={(e) => pageUp(e)}> {/if} - -