diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml index 7862641..4d0547c 100644 --- a/.github/workflows/pages.yaml +++ b/.github/workflows/pages.yaml @@ -11,7 +11,11 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 - name: run for all SDKs - run: cd test-harness && go run ./cmd/web5-test-harness many sdks/* && mv _site ../_site + run: | + git clone https://github.com/TBD54566975/web5-js.git + git clone https://github.com/TBD54566975/web5-kt.git + cd test-harness + go run ./cmd/web5-test-harness many ../web5-* && mv _site ../_site - name: Copy test-vectors run: cp -r ./web5-test-vectors _site/ - uses: actions/upload-pages-artifact@v2 diff --git a/.github/workflows/self-test.yaml b/.github/workflows/self-test.yaml index 69aeaa8..fb6cd24 100644 --- a/.github/workflows/self-test.yaml +++ b/.github/workflows/self-test.yaml @@ -10,11 +10,15 @@ jobs: matrix: SDK: - web5-js - - web5-kt + # - web5-kt steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 - name: self test - run: cd test-harness && go run ./cmd/web5-test-harness one sdks/$SDK + run: | + git clone https://github.com/TBD54566975/${SDK} sdk + cd test-harness + go run ./cmd/web5-test-harness one ../sdk env: SDK: ${{ matrix.SDK }} + BUILDKITE_ANALYTICS_TOKEN: ${{ secrets.BUILDKITE_ANALYTICS_TOKEN }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d5e1554..dd07eaf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ There are many ways to be an open source contributor, and we're here to help you * Propose ideas in our [discord](https://discord.gg/tbd) -* Raise an issue or feature request in our [issue tracker](https://github.com/TBD54566975/web5-spec/issues) +* Raise an issue or feature request in our [issue tracker](https://github.com/TBD54566975/sdk-development/issues) * Help another contributor with one of their questions, or a code review * Suggest improvements to our Getting Started documentation by supplying a Pull Request * Evangelize our work together in conferences, podcasts, and social media spaces. @@ -171,7 +171,7 @@ $> ./gradlew clean build test ### Issues Anyone from the community is welcome (and encouraged!) to raise issues via -[GitHub Issues](https://github.com/TBD54566975/web5-spec/issues). +[GitHub Issues](https://github.com/TBD54566975/sdk-development/issues). ### Discussions @@ -181,7 +181,7 @@ We advocate an asynchronous, written debate model - so write up your thoughts an ### Continuous Integration -Build and Test cycles are run on every commit to every branch on [GitHub Actions](https://github.com/TBD54566975/web5-spec/actions). +Build and Test cycles are run on every commit to every branch on [GitHub Actions](https://github.com/TBD54566975/sdk-development/actions). ## Contribution diff --git a/test-harness/cmd/web5-test-harness/test-many.go b/test-harness/cmd/web5-test-harness/test-many.go index ced8d72..52893d4 100644 --- a/test-harness/cmd/web5-test-harness/test-many.go +++ b/test-harness/cmd/web5-test-harness/test-many.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/TBD54566975/web5-spec/reports" + "github.com/TBD54566975/sdk-development/reports" "github.com/spf13/cobra" "golang.org/x/exp/slog" ) diff --git a/test-harness/cmd/web5-test-harness/test-one.go b/test-harness/cmd/web5-test-harness/test-one.go index fc6a931..cadc754 100644 --- a/test-harness/cmd/web5-test-harness/test-one.go +++ b/test-harness/cmd/web5-test-harness/test-one.go @@ -1,15 +1,20 @@ package main import ( + "bytes" "context" "fmt" + "io" + "mime/multipart" + "net/http" "os" "path/filepath" + "strings" "time" - "github.com/TBD54566975/web5-spec/openapi" - "github.com/TBD54566975/web5-spec/reports" - "github.com/TBD54566975/web5-spec/tests" + "github.com/TBD54566975/sdk-development/openapi" + "github.com/TBD54566975/sdk-development/reports" + "github.com/TBD54566975/sdk-development/tests" "github.com/spf13/cobra" "golang.org/x/exp/slog" ) @@ -43,6 +48,20 @@ var ( } } + buildkiteToken := os.Getenv("BUILDKITE_ANALYTICS_TOKEN") + if buildkiteToken != "" { + if err := buildkiteUpload(report, buildkiteToken); err != nil { + slog.Error("error sending results to buildkite", "error", err) + } + } + + junitFile := os.Getenv("JUNIT_REPORT") + if junitFile != "" { + if err := reports.WriteJunitToFile(report, junitFile); err != nil { + slog.Error("error writing junit report", "file", junitFile, "error", err) + } + } + if !report.IsPassing() { os.Exit(1) } @@ -129,3 +148,88 @@ func testOne(dir string) (reports.Report, error) { func init() { root.AddCommand(testOneCmd) } + +func buildkiteUpload(report reports.Report, buildkiteToken string) error { + slog.Info("uploading junit report to buildkit") + + var body bytes.Buffer + writer := multipart.NewWriter(&body) + + formFields := map[string]string{ + "format": "junit", + "run_env[CI]": "github_actions", + "run_env[key]": fmt.Sprintf("%s-%s-%s", os.Getenv("GITHUB_ACTION"), os.Getenv("GITHUB_RUN_NUMBER"), os.Getenv("GITHUB_RUN_ATTEMPT")), + "run_env[number]": os.Getenv("GITHUB_RUN_NUMBER"), + "run_env[branch]": os.Getenv("GITHUB_REF"), + "run_env[commit_sha]": os.Getenv("GITHUB_SHA"), + "run_env[url]": fmt.Sprintf("https://github.com/%s/actions/runs/%s", os.Getenv("GITHUB_REPOSITORY"), os.Getenv("GITHUB_RUN_ID")), + } + for k, v := range formFields { + if err := addFormValue(writer, k, v); err != nil { + return err + } + } + + part, err := writer.CreateFormFile("data", "web5-test-harness.xml") + if err != nil { + slog.Error("error creating form file") + return err + } + + if err := reports.WriteJunit(report, part); err != nil { + slog.Error("error generating junit report") + return err + } + + if err := writer.Close(); err != nil { + slog.Error("error closing multi-part form writer") + return err + } + + req, err := http.NewRequest(http.MethodPost, "https://analytics-api.buildkite.com/v1/uploads", &body) + if err != nil { + slog.Error("error constructing request to buildkite") + return err + } + + req.Header.Add("Content-Type", writer.FormDataContentType()) + req.Header.Add("Authorization", fmt.Sprintf("Token token=%s", buildkiteToken)) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + slog.Error("error uploading results to buildkite") + return err + } + defer resp.Body.Close() + + responseBody := bytes.Buffer{} + if _, err := io.Copy(&responseBody, resp.Body); err != nil { + slog.Error("error reading response from buildkite") + return err + } + + if resp.StatusCode > 299 { + slog.Error("unexpected response status from buildkite", "status", resp.Status, "response", body.String()) + return fmt.Errorf("unexpected %s", resp.Status) + } + + slog.Info("successfully uploaded results to buildkite", "response", body.String()) + + return nil +} + +func addFormValue(writer *multipart.Writer, key, value string) error { + field, err := writer.CreateFormField(key) + if err != nil { + slog.Error("error creating form field", "key", key, "value", value) + return err + } + + _, err = io.Copy(field, strings.NewReader(value)) + if err != nil { + slog.Error("error writing form field value", "key", key, "value", value) + return err + } + + return nil +} diff --git a/test-harness/go.mod b/test-harness/go.mod index 643f1c5..82327ef 100644 --- a/test-harness/go.mod +++ b/test-harness/go.mod @@ -1,4 +1,4 @@ -module github.com/TBD54566975/web5-spec +module github.com/TBD54566975/sdk-development go 1.20 diff --git a/test-harness/reports/html.go b/test-harness/reports/html.go new file mode 100644 index 0000000..9a7c914 --- /dev/null +++ b/test-harness/reports/html.go @@ -0,0 +1,62 @@ +package reports + +import ( + "fmt" + "os" + "strings" + + "golang.org/x/exp/slog" +) + +func sanatizeHTML(dirty error) string { + clean := strings.ReplaceAll(dirty.Error(), "<", "<") + clean = strings.ReplaceAll(clean, ">", ">") + clean = strings.ReplaceAll(clean, "\n", "\\\\n") + + return clean +} + +type htmlTemplateInput struct { + Reports []Report + Tests map[string][]string +} + +func WriteHTML(reports []Report, filename string) error { + slog.Info("writing html report") + + testmap := make(map[string]map[string]bool) + for _, report := range reports { + for category, tests := range report.Results { + if _, ok := tests[category]; !ok { + testmap[category] = map[string]bool{} + } + + for test := range tests { + testmap[category][test] = true + } + } + } + + templateInput := htmlTemplateInput{ + Reports: reports, + Tests: make(map[string][]string), + } + + for category, tests := range testmap { + for test := range tests { + templateInput.Tests[category] = append(templateInput.Tests[category], test) + } + } + + f, err := os.Create(filename) + if err != nil { + return fmt.Errorf("error opening %s: %v", filename, err) + } + defer f.Close() + + if err := htmlTemplates.ExecuteTemplate(f, "report-template.html", templateInput); err != nil { + return err + } + + return nil +} diff --git a/test-harness/reports/junit.go b/test-harness/reports/junit.go new file mode 100644 index 0000000..0869b65 --- /dev/null +++ b/test-harness/reports/junit.go @@ -0,0 +1,55 @@ +package reports + +import ( + "fmt" + "io" + "os" + "time" +) + +func durationToJunit(t time.Duration) string { + return fmt.Sprintf("%f", float64(t)/float64(time.Second)) +} + +type junitTemplateInput struct { + TimeTotal time.Duration + TimePerTestSuite map[string]time.Duration + Report Report +} + +func WriteJunitToFile(report Report, filename string) error { + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + if err := WriteJunit(report, f); err != nil { + return err + } + + return nil +} + +func WriteJunit(report Report, writer io.Writer) error { + templateInput := junitTemplateInput{ + Report: report, + TimePerTestSuite: map[string]time.Duration{}, + } + + for testsuite, results := range report.Results { + var testsuiteTime time.Duration + for _, result := range results { + testsuiteTime = testsuiteTime + result.Time + templateInput.TimeTotal = templateInput.TimeTotal + result.Time + } + + templateInput.TimePerTestSuite[testsuite] = testsuiteTime + } + + if err := textTemplates.ExecuteTemplate(writer, "report-template.junit.xml", templateInput); err != nil { + return err + } + + return nil +} diff --git a/test-harness/reports/md.go b/test-harness/reports/md.go new file mode 100644 index 0000000..111f9bb --- /dev/null +++ b/test-harness/reports/md.go @@ -0,0 +1,18 @@ +package reports + +import "os" + +func WriteMarkdown(report Report, filename string) error { + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + err = textTemplates.ExecuteTemplate(f, "report-template.md", report) + if err != nil { + return err + } + + return nil +} diff --git a/test-harness/reports/report-template.html b/test-harness/reports/report-template.html index d608981..fdcd408 100644 --- a/test-harness/reports/report-template.html +++ b/test-harness/reports/report-template.html @@ -28,12 +28,12 @@

{{ $category }}

{{ range $.Reports }} {{ if not (index (index .Results $category) $test) }} - {{ index (index .Results $category) $test | getEmoji }} + {{ (index (index .Results $category) $test).GetEmoji }} {{ else }}
- {{ index (index .Results $category) $test | getEmoji }} + {{ (index (index .Results $category) $test).GetEmoji }} {{ end }} {{ end }} diff --git a/test-harness/reports/report-template.junit.xml b/test-harness/reports/report-template.junit.xml new file mode 100644 index 0000000..18a952a --- /dev/null +++ b/test-harness/reports/report-template.junit.xml @@ -0,0 +1,19 @@ + + +{{ range $testSuiteName, $tests := .Report.Results }} + + {{ range $testCaseName, $result := $tests }} + + {{ if $result.IsSkipped }} + + {{ else }} + + {{ range $_, $err := $result.Errors }}{{ $err }}{{ end }} + + {{ end }} + + {{ else }}/>{{ end}} + {{ end }} + +{{ end }} + \ No newline at end of file diff --git a/test-harness/reports/report-template.md b/test-harness/reports/report-template.md index 8da8bc8..955ac42 100644 --- a/test-harness/reports/report-template.md +++ b/test-harness/reports/report-template.md @@ -8,6 +8,6 @@ SDK: [{{ .TestServerID.Name }}]({{ .TestServerID.Url }}) ({{ .TestServerID.Langu | Feature | Result | | ------- | ------ |{{ range $test, $result := $results }} -| {{ $test }} | {{ $result | getEmoji}}{{ if $result }} {{ end }} |{{ end }} +| {{ $test }} | {{ $result.GetEmoji }}{{ if $result.Errors }} {{ end }} |{{ end }} {{ end }} diff --git a/test-harness/reports/report-template.txt b/test-harness/reports/report-template.txt index 601148d..aec8aa7 100644 --- a/test-harness/reports/report-template.txt +++ b/test-harness/reports/report-template.txt @@ -3,5 +3,5 @@ web5 spec conformance report for {{ .TestServerID.Name }} ({{ .TestServerID.Url {{ range $groupName, $results := .Results }} {{ $groupName }} ======================{{ range $test, $result := $results }} -{{ $test }}: {{ $result | getEmoji }} {{ if $result }}fail: {{ $result }}{{ else }}pass{{ end }}{{ end }} +{{ $test }}: {{ $result.GetEmoji }} {{ if $result.Errors }}fail: {{ $result.Errors }}{{ else }}pass{{ end }}{{ end }} {{ end }} diff --git a/test-harness/reports/reports.go b/test-harness/reports/reports.go index f035f01..3266714 100644 --- a/test-harness/reports/reports.go +++ b/test-harness/reports/reports.go @@ -1,48 +1,59 @@ package reports import ( - "bytes" "embed" - "fmt" - "html/template" - "os" - "strings" + "errors" + htmltemplate "html/template" + texttemplate "text/template" + "time" - "golang.org/x/exp/slog" - - "github.com/TBD54566975/web5-spec/openapi" - "github.com/TBD54566975/web5-spec/tests" + "github.com/TBD54566975/sdk-development/openapi" ) -//go:embed * -var templatesFS embed.FS +var ( + ErrNotSupported = errors.New("test not supported by this SDK") -var templates = template.New("") + //go:embed * + templatesFS embed.FS + + htmlTemplates = htmltemplate.New("") + textTemplates = texttemplate.New("") + funcmap = map[string]any{ + "sanatizeHTML": sanatizeHTML, + "durationToJunit": durationToJunit, + } +) func init() { - templates.Funcs(template.FuncMap{ - "sanatizeHTML": sanatizeHTML, - "getEmoji": getEmoji, - }) - _, err := templates.ParseFS(templatesFS, "report-template.*") - if err != nil { + htmlTemplates.Funcs(funcmap) + if _, err := htmlTemplates.ParseFS(templatesFS, "report-template.html"); err != nil { + panic(err) + } + + textTemplates.Funcs(funcmap) + if _, err := textTemplates.ParseFS(templatesFS, "report-template.*"); err != nil { panic(err) } } type Report struct { TestServerID openapi.TestServerID - Results map[string]map[string][]error + Results map[string]map[string]Result +} + +type Result struct { + Errors []error + Time time.Duration } func (r Report) IsPassing() bool { for _, results := range r.Results { - for _, errs := range results { - if len(errs) == 1 && errs[0] == tests.ErrNotSupported { + for _, result := range results { + if result.IsSkipped() { continue } - if len(errs) > 0 { + if len(result.Errors) > 0 { return false } } @@ -52,90 +63,18 @@ func (r Report) IsPassing() bool { return true } -func (r Report) Text() (string, error) { - var buffer bytes.Buffer - - if err := templates.ExecuteTemplate(&buffer, "report-template.txt", r); err != nil { - return "", err - } - - return buffer.String(), nil -} - -func WriteMarkdown(report Report, filename string) error { - f, err := os.Create(filename) - if err != nil { - return err - } - defer f.Close() - - err = templates.ExecuteTemplate(f, "report-template.md", report) - if err != nil { - return err - } - - return nil -} - -func sanatizeHTML(dirty error) string { - clean := strings.ReplaceAll(dirty.Error(), "<", "<") - clean = strings.ReplaceAll(clean, ">", ">") - clean = strings.ReplaceAll(clean, "\n", "\\\\n") - - return clean +func (r Result) IsSkipped() bool { + return len(r.Errors) == 1 && r.Errors[0] == ErrNotSupported } -func getEmoji(errs []error) string { - if len(errs) == 0 { +func (r Result) GetEmoji() string { + if len(r.Errors) == 0 { return "✅" } - if len(errs) == 1 && errs[0] == tests.ErrNotSupported { + if len(r.Errors) == 1 && r.Errors[0] == ErrNotSupported { return "🚧" } return "❌" } - -type htmlTemplateInput struct { - Reports []Report - Tests map[string][]string -} - -func WriteHTML(reports []Report, filename string) error { - slog.Info("writing html report") - - testmap := map[string]map[string]bool{} - for _, report := range reports { - for category, tests := range report.Results { - if _, ok := tests[category]; !ok { - testmap[category] = map[string]bool{} - } - - for test := range tests { - testmap[category][test] = true - } - } - } - - templateInput := htmlTemplateInput{Reports: reports, Tests: map[string][]string{}} - - for category, tests := range testmap { - templateInput.Tests[category] = []string{} - for test := range tests { - templateInput.Tests[category] = append(templateInput.Tests[category], test) - } - } - - f, err := os.Create(filename) - if err != nil { - return fmt.Errorf("error opening %s: %v", filename, err) - } - defer f.Close() - - if err := templates.ExecuteTemplate(f, "report-template.html", templateInput); err != nil { - return err - } - - return nil -} diff --git a/test-harness/reports/text.go b/test-harness/reports/text.go new file mode 100644 index 0000000..89a83aa --- /dev/null +++ b/test-harness/reports/text.go @@ -0,0 +1,13 @@ +package reports + +import "bytes" + +func (r Report) Text() (string, error) { + var buffer bytes.Buffer + + if err := textTemplates.ExecuteTemplate(&buffer, "report-template.txt", r); err != nil { + return "", err + } + + return buffer.String(), nil +} diff --git a/test-harness/sdks/web5-js/.gitignore b/test-harness/sdks/web5-js/.gitignore deleted file mode 100644 index 3c3629e..0000000 --- a/test-harness/sdks/web5-js/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/test-harness/sdks/web5-js/credentials.ts b/test-harness/sdks/web5-js/credentials.ts deleted file mode 100644 index 39908fb..0000000 --- a/test-harness/sdks/web5-js/credentials.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Request, Response } from 'express'; -import { VerifiableCredential, SignOptions } from '@web5/credentials'; -import { DidKeyMethod, PortableDid } from '@web5/dids'; -import { Ed25519, Jose } from '@web5/crypto'; -import { paths } from './openapi.js'; - -type Signer = (data: Uint8Array) => Promise; - -let _ownDid: PortableDid; - -async function getOwnDid(): Promise { - if(_ownDid) { - return _ownDid; - } - _ownDid = await DidKeyMethod.create(); - return _ownDid; -} - -export async function credentialIssue(req: Request, res: Response) { - const body: paths["/credentials/issue"]["post"]["requestBody"]["content"]["application/json"] = - req.body; - - const ownDid = await getOwnDid() - - // build signing options - const [signingKeyPair] = ownDid.keySet.verificationMethodKeys!; - const privateKey = (await Jose.jwkToKey({ key: signingKeyPair.privateKeyJwk!})).keyMaterial; - const subjectIssuerDid = body.credential.credentialSubject["id"] as string; - const signer = EdDsaSigner(privateKey); - const signOptions: SignOptions = { - issuerDid : ownDid.did, - subjectDid : subjectIssuerDid, - kid : '#' + ownDid.did.split(':')[2], - signer : signer - }; - - const vc: VerifiableCredential = VerifiableCredential.create(body.credential.type[body.credential.type.length - 1], body.credential.issuer, subjectIssuerDid, body.credential.credentialSubject); - const vcJwt: string = await vc.sign(signOptions); - - const resp: paths["/credentials/issue"]["post"]["responses"]["200"]["content"]["application/json"] = - { - verifiableCredential: {data: vcJwt} - }; - - res.json(resp); -} - -function EdDsaSigner(privateKey: Uint8Array): Signer { - return async (data: Uint8Array): Promise => { - const signature = await Ed25519.sign({ data, key: privateKey}); - return signature; - }; -} \ No newline at end of file diff --git a/test-harness/sdks/web5-js/did-ion.ts b/test-harness/sdks/web5-js/did-ion.ts deleted file mode 100644 index c7d68b3..0000000 --- a/test-harness/sdks/web5-js/did-ion.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { DidIonMethod } from "@web5/dids"; -import { paths } from "./openapi.js"; -import { Request, Response } from "express"; - - -export async function didIonCreate(req: Request, res: Response) { - // const body: paths["/did-ion/create"]["post"]["requestBody"]["content"]["application/json"] = - // req.body; - const did = await DidIonMethod.create({}); - - const resp: paths["/did-ion/create"]["post"]["responses"]["200"]["content"]["application/json"] = - { - did: did.did, - }; - - res.json(resp); -} diff --git a/test-harness/sdks/web5-js/encoders.ts b/test-harness/sdks/web5-js/encoders.ts deleted file mode 100644 index b8053df..0000000 --- a/test-harness/sdks/web5-js/encoders.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { paths } from "./openapi.js"; -import { Request, Response } from "express"; -import { Convert } from '@web5/common'; -import { sha256 } from '@noble/hashes/sha256'; - -export function encoderBase64Encode(req: Request, res: Response) { - const requestBody: paths["/encoders/base64/encode"]["post"]["requestBody"]["content"]["application/json"] = - req.body; - - const resp: paths["/encoders/base64/encode"]["post"]["responses"]["200"]["content"]["application/json"] = - { - data: Convert.string(requestBody.data).toBase64Url() - }; - - res.json(resp); -} - -export function encoderBase64Decode(req: Request, res: Response) { - const requestBody: paths["/encoders/base64/encode"]["post"]["requestBody"]["content"]["application/json"] = - req.body; - - const resp: paths["/encoders/base64/encode"]["post"]["responses"]["200"]["content"]["application/json"] = - { - data: Convert.base64Url(requestBody.data).toString() - }; - - res.json(resp); -} - -export function encoderBase58Encode(req: Request, res: Response) { - const requestBody: paths["/encoders/base58/encode"]["post"]["requestBody"]["content"]["application/json"] = - req.body; - - const resp: paths["/encoders/base58/encode"]["post"]["responses"]["200"]["content"]["application/json"] = - { - data: Convert.string(requestBody.data).toBase58Btc() - }; - - res.json(resp); -} - -export function encoderBase58Decode(req: Request, res: Response) { - const requestBody: paths["/encoders/base58/encode"]["post"]["requestBody"]["content"]["application/json"] = - req.body; - - const resp: paths["/encoders/base58/encode"]["post"]["responses"]["200"]["content"]["application/json"] = - { - data: Convert.base58Btc(requestBody.data).toString() - }; - - res.json(resp); -} - -export function encoderSha256Encode(req: Request, res: Response) { - const requestBody: paths["/encoders/sha256/encode"]["post"]["requestBody"]["content"]["application/json"] = - req.body; - - const resp: paths["/encoders/sha256/encode"]["post"]["responses"]["200"]["content"]["application/json"] = - { - data: Convert.arrayBuffer(sha256(requestBody.data)).toHex() - }; - - res.json(resp); -} \ No newline at end of file diff --git a/test-harness/sdks/web5-js/main.ts b/test-harness/sdks/web5-js/main.ts deleted file mode 100644 index 361c9d6..0000000 --- a/test-harness/sdks/web5-js/main.ts +++ /dev/null @@ -1,51 +0,0 @@ -import express from "express"; -import { credentialIssue } from "./credentials.js"; -import { didIonCreate } from "./did-ion.js"; -import { encoderBase58Decode, encoderBase58Encode, encoderBase64Decode, encoderBase64Encode, encoderSha256Encode } from "./encoders.js" -import type * as http from "http"; -import type { Request, Response } from "express"; -import { paths } from "./openapi.js"; // generated with npx openapi-typescript .web5-component/openapi.yaml -o .web5-component/openapi.d.ts -import bodyparser from "body-parser"; - -const app: express.Application = express(); -app.use(express.json()); -app.use(bodyparser.json()); - -app.post("/did-ion/create", didIonCreate); - -app.post("/credentials/issue", credentialIssue); - -app.post("/encoders/base64/encode", encoderBase64Encode); -app.post("/encoders/base64/decode", encoderBase64Decode); -// app.post("/encoders/base58/encode", encoderBase58Encode); -// app.post("/encoders/base58/decode", encoderBase58Decode); -app.post("/encoders/sha256/encode", encoderSha256Encode); - -const serverID: paths["/"]["get"]["responses"]["200"]["content"]["application/json"] = - { - name: "web5-js", - language: "JavaScript", - url: "https://github.com/TBD54566975/web5-js", - }; -app.get("/", (req, res) => { - res.json(serverID); -}); - -let server: http.Server; -app.get("/shutdown", (req: Request, res: Response) => { - res.send("ok"); - console.log("shutting down server"); - server.close((e) => { - if (e) { - console.error("error shutting down server:", e.stack || e); - } - }); -}); - -server = app.listen(8080, () => console.log("test server started")); -process.on("SIGTERM", () => { - console.log("SIGTERM signal received: closing HTTP server"); - server.close(() => { - console.log("HTTP server closed"); - }); -}); diff --git a/test-harness/sdks/web5-js/openapi.d.ts b/test-harness/sdks/web5-js/openapi.d.ts deleted file mode 100644 index 953e4ee..0000000 --- a/test-harness/sdks/web5-js/openapi.d.ts +++ /dev/null @@ -1,498 +0,0 @@ -/** - * This file was auto-generated by openapi-typescript. - * Do not make direct changes to the file. - */ - - -export interface paths { - "/did-ion/create": { - post: operations["did_ion_create"]; - }; - "/did-ion/update": { - post: operations["did_ion_update"]; - }; - "/did-ion/recover": { - post: operations["did_ion_recover"]; - }; - "/did-ion/deactivate": { - post: operations["did_ion_deactivate"]; - }; - "/did-ion/resolve": { - post: operations["did_ion_resolve"]; - }; - "/did-ion/anchor": { - post: operations["did_ion_anchor"]; - }; - "/did-key/create": { - post: operations["did_key_create"]; - }; - "/did-key/resolve": { - post: operations["did_key_resolve"]; - }; - "/credentials/presentation-exchange": { - post: operations["credential_presentation_exchange"]; - }; - "/credentials/issue": { - post: operations["credential_issue"]; - }; - "/crypto/generate-key/secp256k1": { - post: operations["crypto_generate_key_secp256k1"]; - }; - "/crypto/generate-key/ed25519": { - post: operations["crypto_generate_key_ed25519"]; - }; - "/crypto/generate-key/secp256r1": { - post: operations["crypto_generate_key_secp256r1"]; - }; - "/crypto/verify/secp256k1": { - post: operations["crypto_verify_secp256k1"]; - }; - "/crypto/verify/ed25519": { - post: operations["crypto_verify_ed25519"]; - }; - "/crypto/verify/secp256r1": { - post: operations["crypto_verify_secp256r1"]; - }; - "/crypto/jose/jws-create": { - post: operations["crypto_jose_jws_create"]; - }; - "/crypto/jose/jws-verify": { - post: operations["crypto_jose_jws_verify"]; - }; - "/crypto/jose/jwk-encode": { - post: operations["crypto_jose_jwk_encode"]; - }; - "/crypto/jose/jwk-decode": { - post: operations["crypto_jose_jwk_decode"]; - }; - "/crypto/jose/jwt-create": { - post: operations["crypto_jose_jwt_create"]; - }; - "/crypto/jose/jwt-verify": { - post: operations["crypto_jose_jwt_verify"]; - }; - "/crypto/key-manager/generate-key": { - post: operations["crypto_key_manager_generate_key"]; - }; - "/crypto/key-manager/import-key": { - post: operations["crypto_key_manager_import_key"]; - }; - "/crypto/key-manager/sign": { - post: operations["crypto_key_manager_sign"]; - }; - "/crypto/key-manager/verify": { - post: operations["crypto_key_manager_verify"]; - }; - "/encoders/base64/encode": { - post: operations["encoders_base64_encode"]; - }; - "/encoders/base64/decode": { - post: operations["encoders_base64_decode"]; - }; - "/encoders/base58/encode": { - post: operations["encoders_base58_encode"]; - }; - "/encoders/base58/decode": { - post: operations["encoders_base58_decode"]; - }; - "/encoders/sha256/encode": { - post: operations["encoders_sha256_encode"]; - }; - "/encoders/cbor/encode": { - post: operations["encoders_cbor_encode"]; - }; - "/encoders/cbor/decode": { - post: operations["encoders_cbor_decode"]; - }; - "/ready": { - get: operations["server_ready"]; - }; - "/shutdown": { - get: operations["server_shutdown"]; - }; - "/": { - get: operations["identify_self"]; - }; -} - -export type webhooks = Record; - -export interface components { - schemas: { - CredentialIssuanceRequest: { - credential: components["schemas"]["CredentialIssuanceRequestCredential"]; - options: components["schemas"]["CredentialIssuanceRequestOptions"]; - }; - CredentialIssuanceRequestCredential: { - "@context": string[]; - id: string; - type: string[]; - issuer: string; - issuanceDate: string; - expirationDate: string; - credentialSubject: components["schemas"]["CredentialSubject"]; - }; - CredentialIssuanceRequestOptions: { - created: string; - challenge: string; - domain: string; - credentialStatus: components["schemas"]["CredentialStatus"]; - }; - CredentialIssuer: { - id: string; - }; - CredentialSubject: { - [key: string]: unknown; - }; - CredentialStatus: { - type: string; - }; - CredentialIssuanceResponse: { - verifiableCredential: components["schemas"]["StringEncodedData"]; - }; - VerifiableCredential: { - "@context": string[]; - id: string; - type: string[]; - issuer: components["schemas"]["CredentialIssuer"]; - issuanceDate: string; - expirationDate: string; - credentialSubject: components["schemas"]["CredentialSubject"]; - proof: components["schemas"]["CredentialProof"]; - }; - CredentialProof: { - type: string; - created: string; - challenge: string; - domain: string; - nonce: string; - verificationMethod: string; - proofPurpose: string; - jws: string; - proofValue: string; - }; - TestServerID: { - name: string; - language: string; - url: string; - }; - DIDIonCreateResponse: { - did: string; - }; - StringEncodedData: { - data: string; - }; - PresentationExchangeRequest: { - presentationDefinition?: components["schemas"]["PresentationDefinition"]; - vcJwts?: string[]; - }; - PresentationDefinition: { - id?: string; - name: string; - purpose?: string; - submissionRequirements?: components["schemas"]["PresentationDefinitionSubmissionRequirement"][]; - inputDescriptors: components["schemas"]["PresentationDefinitionInputDescriptor"][]; - }; - PresentationDefinitionSubmissionRequirement: { - name?: string; - purpose?: string; - /** @enum {string} */ - rule: "all" | "pick"; - count?: number; - min?: number; - max?: number; - from?: string; - fromNested?: components["schemas"]["PresentationDefinitionSubmissionRequirement"][]; - }; - PresentationDefinitionInputDescriptor: { - id: string; - name?: string; - purpose?: string; - group?: string[]; - issuance?: components["schemas"]["PresentationDefinitionIssuance"][]; - constraints?: components["schemas"]["PresentationDefinitionConstraints"]; - }; - PresentationDefinitionIssuance: { - manifest?: string; - }; - PresentationDefinitionConstraints: { - /** @enum {string} */ - limitDisclosure?: "required" | "preferred"; - statuses?: components["schemas"]["PresentationDefinitionStatuses"]; - fields?: components["schemas"]["PresentationDefinitionField"][]; - /** @enum {string} */ - subjectIsIssuer?: "required" | "preferred"; - isHolder?: components["schemas"]["PresentationDefinitionHolderSubject"][]; - sameSubject?: components["schemas"]["PresentationDefinitionHolderSubject"][]; - }; - PresentationDefinitionHolderSubject: { - fieldId?: string[]; - /** @enum {string} */ - directive?: "required" | "preferred"; - }; - PresentationDefinitionField: { - id?: string; - path?: string[]; - purpose?: string; - filter?: components["schemas"]["PresentationDefinitionFilter"]; - /** @enum {string} */ - predicate?: "required" | "preferred"; - name?: string; - }; - PresentationDefinitionFilter: { - const?: string; - enum?: string[]; - exclusiveMinimum?: string; - exclusiveMaximum?: string; - format?: string; - formatMaximum?: string; - formatMinimum?: string; - formatExclusiveMaximum?: string; - formatExclusiveMinimum?: string; - minLength?: number; - maxLength?: number; - minimum?: string; - maximum?: string; - pattern?: string; - type?: string; - }; - PresentationDefinitionStatuses: { - active?: components["schemas"]["PresentationDefinitionStatus"]; - suspended?: components["schemas"]["PresentationDefinitionStatus"]; - revoked?: components["schemas"]["PresentationDefinitionStatus"]; - }; - PresentationDefinitionStatus: { - /** @enum {string} */ - directive?: "required" | "allowed" | "disallowed"; - }; - }; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; -} - -export type $defs = Record; - -export type external = Record; - -export interface operations { - - did_ion_create: { - responses: { - 200: { - content: { - "application/json": components["schemas"]["DIDIonCreateResponse"]; - }; - }; - }; - }; - did_ion_update: { - }; - did_ion_recover: { - }; - did_ion_deactivate: { - }; - did_ion_resolve: { - }; - did_ion_anchor: { - }; - did_key_create: { - }; - did_key_resolve: { - }; - credential_presentation_exchange: { - requestBody: { - content: { - "application/json": components["schemas"]["PresentationExchangeRequest"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - credential_issue: { - requestBody: { - content: { - "application/json": components["schemas"]["CredentialIssuanceRequest"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["CredentialIssuanceResponse"]; - }; - }; - }; - }; - crypto_generate_key_secp256k1: { - }; - crypto_generate_key_ed25519: { - }; - crypto_generate_key_secp256r1: { - }; - crypto_verify_secp256k1: { - }; - crypto_verify_ed25519: { - }; - crypto_verify_secp256r1: { - }; - crypto_jose_jws_create: { - }; - crypto_jose_jws_verify: { - }; - crypto_jose_jwk_encode: { - }; - crypto_jose_jwk_decode: { - }; - crypto_jose_jwt_create: { - }; - crypto_jose_jwt_verify: { - }; - crypto_key_manager_generate_key: { - }; - crypto_key_manager_import_key: { - }; - crypto_key_manager_sign: { - }; - crypto_key_manager_verify: { - }; - encoders_base64_encode: { - requestBody: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - encoders_base64_decode: { - requestBody: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - encoders_base58_encode: { - requestBody: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - encoders_base58_decode: { - requestBody: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - encoders_sha256_encode: { - requestBody: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - encoders_cbor_encode: { - requestBody: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - encoders_cbor_decode: { - requestBody: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - responses: { - /** @description Successful operation */ - 200: { - content: { - "application/json": components["schemas"]["StringEncodedData"]; - }; - }; - }; - }; - server_ready: { - responses: { - /** @description server is ready */ - 200: { - content: never; - }; - }; - }; - server_shutdown: { - responses: { - /** @description server will shut down */ - 204: { - content: never; - }; - }; - }; - identify_self: { - responses: { - /** @description information about the test server */ - 200: { - content: { - "application/json": components["schemas"]["TestServerID"]; - }; - }; - }; - }; -} diff --git a/test-harness/sdks/web5-js/package-lock.json b/test-harness/sdks/web5-js/package-lock.json deleted file mode 100644 index 44eb3e0..0000000 --- a/test-harness/sdks/web5-js/package-lock.json +++ /dev/null @@ -1,2125 +0,0 @@ -{ - "name": "web5", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "web5", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@web5/common": "^0.2.0", - "@web5/credentials": "^0.3.1", - "@web5/dids": "^0.2.0", - "express": "^4.18.2" - } - }, - "node_modules/@astronautlabs/jsonpath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@astronautlabs/jsonpath/-/jsonpath-1.1.2.tgz", - "integrity": "sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==", - "dependencies": { - "static-eval": "2.0.2" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-pow-sdk/-/ion-pow-sdk-1.0.17.tgz", - "integrity": "sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==", - "dependencies": { - "buffer": "6.0.3", - "cross-fetch": "3.1.5", - "hash-wasm": "4.9.0" - } - }, - "node_modules/@decentralized-identity/ion-sdk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.1.tgz", - "integrity": "sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==", - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@noble/secp256k1": "^2.0.0", - "canonicalize": "^2.0.0", - "multiformats": "^12.0.1", - "multihashes": "^4.0.3", - "uri-js": "^4.4.1" - } - }, - "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@multiformats/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" - }, - "node_modules/@noble/ciphers": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.1.4.tgz", - "integrity": "sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "dependencies": { - "@noble/hashes": "1.3.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/ed25519": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", - "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", - "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sphereon/pex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sphereon/pex/-/pex-2.1.0.tgz", - "integrity": "sha512-108iEqbu6D421pK9Q6bq4wnWcL8V+fEtw4Ry6NhBidIlDHuJehdLM8Z70A/axgNYMB1C0smMDYt1Xur/ROLwvQ==", - "dependencies": { - "@astronautlabs/jsonpath": "^1.1.2", - "@sphereon/pex-models": "^2.0.3", - "@sphereon/ssi-types": "^0.13.0", - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "jwt-decode": "^3.1.2", - "nanoid": "^3.3.6", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@sphereon/pex-models": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sphereon/pex-models/-/pex-models-2.1.1.tgz", - "integrity": "sha512-0UX/CMwgiJSxzuBn6SLOTSKkm+uPq3dkNjl8w4EtppXp6zBB4lQMd1mJX7OifX5Bp5vPUfoz7bj2B+yyDtbZww==" - }, - "node_modules/@sphereon/ssi-types": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@sphereon/ssi-types/-/ssi-types-0.13.0.tgz", - "integrity": "sha512-THzkvgY6AN4/0INgGowinzOFX6NeUQJ/KmAcXrBXx2Rny5v5wCp7LhBIlK21KF2/76fbiCyJvwcd/+Yeb0fjwQ==", - "dependencies": { - "jwt-decode": "^3.1.2" - } - }, - "node_modules/@web5/common": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.1.tgz", - "integrity": "sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/credentials": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@web5/credentials/-/credentials-0.3.1.tgz", - "integrity": "sha512-pV7i8AQ+7TZIA8pPQvuYNI5Gzvms8UqpLxtNg21Wh0+4Xs+tQtEMgJknolDj6/IShU0HcmIieh7aFg8Ldtj4BQ==", - "dependencies": { - "@sphereon/pex": "2.1.0", - "did-jwt": "^7.2.6", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-0.2.1.tgz", - "integrity": "sha512-DM49030ftALhzXipYdsxfCexdSNJxlnj++YUiM+lbf9aEOxT3PCapDMSXi0MG1flPJHu/Q/LMebMN/aAr0WJ3A==", - "dependencies": { - "@noble/ciphers": "0.1.4", - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@web5/common": "0.2.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-0.2.1.tgz", - "integrity": "sha512-9t7AlUlb9mUBTaX5jK8AC7gTuikCic6ewHfWtaZ4TuDf5qi1PRhczmbm1h8zh7gVTd0zke8TR6QiBd9RyneSGA==", - "dependencies": { - "@decentralized-identity/ion-pow-sdk": "1.0.17", - "@decentralized-identity/ion-sdk": "1.0.1", - "@web5/common": "0.2.1", - "@web5/crypto": "0.2.1", - "canonicalize": "2.0.0", - "did-resolver": "4.1.0", - "level": "8.0.0", - "ms": "2.1.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/canonicalize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz", - "integrity": "sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==" - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/did-jwt": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-7.4.5.tgz", - "integrity": "sha512-PjUFy/yhYeivNrQI5EaqYvF+cRL0itARQlXPfAnUUcj4tm40fzCU/0yWkhAoAPfM41e8O+QVRqOXwg0cZjlVeg==", - "dependencies": { - "@noble/ciphers": "^0.4.0", - "@noble/curves": "^1.0.0", - "@noble/hashes": "^1.3.0", - "@scure/base": "^1.1.3", - "canonicalize": "^2.0.0", - "did-resolver": "^4.1.0", - "multibase": "^4.0.6", - "multiformats": "^9.6.2", - "uint8arrays": "3.1.1" - } - }, - "node_modules/did-jwt/node_modules/@noble/ciphers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.4.0.tgz", - "integrity": "sha512-xaUaUUDWbHIFSxaQ/pIe+33VG2mfJp6N/KxKLmZr5biWdNznCAmfu24QRhX10BbVAuqOahAoyp0S4M9md6GPDw==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/did-jwt/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-wasm": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", - "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" - } - }, - "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==" - }, - "node_modules/multibase": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", - "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "@multiformats/base-x": "^4.0.1" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multiformats": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", - "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/multihashes": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", - "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", - "dependencies": { - "multibase": "^4.0.1", - "uint8arrays": "^3.0.0", - "varint": "^5.0.2" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dependencies": { - "escodegen": "^1.8.1" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/uint8arrays/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "engines": { - "node": ">=0.10.0" - } - } - } -} diff --git a/test-harness/sdks/web5-js/package.json b/test-harness/sdks/web5-js/package.json deleted file mode 100644 index 9872a1f..0000000 --- a/test-harness/sdks/web5-js/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "web5", - "version": "1.0.0", - "description": "", - "main": "index.js", - "type": "module", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "@web5/common": "^0.2.0", - "@web5/credentials": "^0.3.1", - "@web5/dids": "^0.2.0", - "express": "^4.18.2" - } -} diff --git a/test-harness/sdks/web5-js/tsconfig.json b/test-harness/sdks/web5-js/tsconfig.json deleted file mode 100644 index 46b6bcd..0000000 --- a/test-harness/sdks/web5-js/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - // "strict": true, - "lib": [ - "DOM", - "ES6" - ], - "allowJs": true, - "target": "es6", - "module": "NodeNext", - "declaration": true, - "declarationMap": true, - "declarationDir": "dist/types", - "outDir": "dist", - // `NodeNext` will throw compilation errors if relative import paths are missing file extension - // reference: https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js - "moduleResolution": "NodeNext", - "esModuleInterop": true, - "resolveJsonModule": true - }, - "include": [ - "main.ts", - ], - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/test-harness/sdks/web5-js/web5-spec.Dockerfile b/test-harness/sdks/web5-js/web5-spec.Dockerfile deleted file mode 100644 index 5eba979..0000000 --- a/test-harness/sdks/web5-js/web5-spec.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM node:18-alpine -RUN apk add --no-cache git -RUN git clone https://github.com/TBD54566975/web5-js.git /web5-js && cd /web5-js && npm ci && npm run build -WORKDIR /web5-js -RUN npm install express express-openapi -ADD . /web5-js/.web5-component -RUN npx tsc -p .web5-component/tsconfig.json -CMD ["node", ".web5-component/dist/main.js"] diff --git a/test-harness/tests/credentials.go b/test-harness/tests/credentials.go index fd05a5c..f8a2b94 100644 --- a/test-harness/tests/credentials.go +++ b/test-harness/tests/credentials.go @@ -5,7 +5,7 @@ import ( "encoding/json" "log" - "github.com/TBD54566975/web5-spec/openapi" + "github.com/TBD54566975/sdk-development/openapi" "gopkg.in/square/go-jose.v2" ) @@ -65,6 +65,9 @@ func vcCreate(ctx context.Context, serverURL string) []error { vcJwt := response.JSON200.VerifiableCredential.Data token, err := jose.ParseSigned(vcJwt) + if err != nil { + return []error{err} + } payloadBytes := token.UnsafePayloadWithoutVerification() var payload Payload diff --git a/test-harness/tests/did-ion.go b/test-harness/tests/did-ion.go index d1eeb7e..576d780 100644 --- a/test-harness/tests/did-ion.go +++ b/test-harness/tests/did-ion.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "github.com/TBD54566975/web5-spec/openapi" + "github.com/TBD54566975/sdk-development/openapi" ) func init() { diff --git a/test-harness/tests/encoders.go b/test-harness/tests/encoders.go index 8700d76..fb1fa36 100644 --- a/test-harness/tests/encoders.go +++ b/test-harness/tests/encoders.go @@ -6,7 +6,7 @@ import ( "encoding/base64" "fmt" - "github.com/TBD54566975/web5-spec/openapi" + "github.com/TBD54566975/sdk-development/openapi" "github.com/mr-tron/base58" ) diff --git a/test-harness/tests/test-runner.go b/test-harness/tests/test-runner.go index aadf0ae..cd99caa 100644 --- a/test-harness/tests/test-runner.go +++ b/test-harness/tests/test-runner.go @@ -2,13 +2,13 @@ package tests import ( "context" - "errors" "fmt" "math/rand" "net/http" "strings" "time" + "github.com/TBD54566975/sdk-development/reports" "golang.org/x/exp/slog" ) @@ -16,20 +16,20 @@ type testfn func(ctx context.Context, serverURL string) []error var tests = map[string]map[string]testfn{} -var ErrNotSupported = errors.New("test not supported by this SDK") - -func RunTests(serverURL string) map[string]map[string][]error { - results := map[string]map[string][]error{} +func RunTests(serverURL string) map[string]map[string]reports.Result { + results := map[string]map[string]reports.Result{} for group, ts := range tests { slog.Info("starting test group", "group", group) - results[group] = map[string][]error{} + results[group] = map[string]reports.Result{} for t, fn := range ts { slog.Info("running", "test", t) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - results[group][t] = fn(ctx, serverURL) - if results[t] != nil { - slog.Error("error", "test", t, "error", results[t]) + start := time.Now() + errs := fn(ctx, serverURL) + results[group][t] = reports.Result{ + Errors: errs, + Time: time.Since(start), } } } @@ -76,7 +76,7 @@ func compareStringsContains(actual string, expected string, field string) error func unexpectedResponseCode(r *http.Response, body []byte) []error { if r.StatusCode == http.StatusNotFound { - return []error{ErrNotSupported} + return []error{reports.ErrNotSupported} } return []error{fmt.Errorf("%s: %s", r.Status, string(body))}