diff --git a/docs/.astro/settings.json b/docs/.astro/settings.json index c74d9e7..189bbef 100644 --- a/docs/.astro/settings.json +++ b/docs/.astro/settings.json @@ -1,5 +1,5 @@ { "_variables": { - "lastUpdateCheck": 1720022313585 + "lastUpdateCheck": 1721221209150 } } \ No newline at end of file diff --git a/docs/.astro/types.d.ts b/docs/.astro/types.d.ts index bf22555..2a117a1 100644 --- a/docs/.astro/types.d.ts +++ b/docs/.astro/types.d.ts @@ -136,23 +136,163 @@ declare module 'astro:content' { type ContentEntryMap = { "docs": { -"guides/deep-dive.md": { - id: "guides/deep-dive.md"; - slug: "guides/deep-dive"; +"architecture.md": { + id: "architecture.md"; + slug: "architecture"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; -"guides/getting-started.md": { - id: "guides/getting-started.md"; - slug: "guides/getting-started"; +"clients/android/answer.mdx": { + id: "clients/android/answer.mdx"; + slug: "clients/android/answer"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/android/authentication.mdx": { + id: "clients/android/authentication.mdx"; + slug: "clients/android/authentication"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/android/introduction.mdx": { + id: "clients/android/introduction.mdx"; + slug: "clients/android/introduction"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/android/offer.mdx": { + id: "clients/android/offer.mdx"; + slug: "clients/android/offer"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/android/provider-service/create-passkey.md": { + id: "clients/android/provider-service/create-passkey.md"; + slug: "clients/android/provider-service/create-passkey"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"clients/android/provider-service/get-passkey.md": { + id: "clients/android/provider-service/get-passkey.md"; + slug: "clients/android/provider-service/get-passkey"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"clients/android/provider-service/introduction.mdx": { + id: "clients/android/provider-service/introduction.mdx"; + slug: "clients/android/provider-service/introduction"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/android/registration.mdx": { + id: "clients/android/registration.mdx"; + slug: "clients/android/registration"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/browser/answer.mdx": { + id: "clients/browser/answer.mdx"; + slug: "clients/browser/answer"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/browser/authentication.md": { + id: "clients/browser/authentication.md"; + slug: "clients/browser/authentication"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"clients/browser/example.md": { + id: "clients/browser/example.md"; + slug: "clients/browser/example"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; -"guides/registration.md": { - id: "guides/registration.md"; - slug: "guides/registration"; +"clients/browser/introduction.mdx": { + id: "clients/browser/introduction.mdx"; + slug: "clients/browser/introduction"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/browser/offer.mdx": { + id: "clients/browser/offer.mdx"; + slug: "clients/browser/offer"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"clients/browser/registration.mdx": { + id: "clients/browser/registration.mdx"; + slug: "clients/browser/registration"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"guides/Passkey/authentication.mdx": { + id: "guides/Passkey/authentication.mdx"; + slug: "guides/passkey/authentication"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"guides/Passkey/registration.mdx": { + id: "guides/Passkey/registration.mdx"; + slug: "guides/passkey/registration"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"guides/Peer to Peer/answer.mdx": { + id: "guides/Peer to Peer/answer.mdx"; + slug: "guides/peer-to-peer/answer"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"guides/Peer to Peer/offer.mdx": { + id: "guides/Peer to Peer/offer.mdx"; + slug: "guides/peer-to-peer/offer"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"guides/components.mdx": { + id: "guides/components.mdx"; + slug: "guides/components"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"guides/concepts.md": { + id: "guides/concepts.md"; + slug: "guides/concepts"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; +"guides/getting-started.mdx": { + id: "guides/getting-started.mdx"; + slug: "guides/getting-started"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".mdx"] }; +"guides/qr-code.md": { + id: "guides/qr-code.md"; + slug: "guides/qr-code"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> @@ -164,30 +304,30 @@ declare module 'astro:content' { collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; -"reference/typescript/auth/README.md": { - id: "reference/typescript/auth/README.md"; - slug: "reference/typescript/auth/readme"; +"server/environment-variables.md": { + id: "server/environment-variables.md"; + slug: "server/environment-variables"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; -"reference/typescript/auth/attestation/functions/attestation.md": { - id: "reference/typescript/auth/attestation/functions/attestation.md"; - slug: "reference/typescript/auth/attestation/functions/attestation"; +"server/integrations.md": { + id: "server/integrations.md"; + slug: "server/integrations"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; -"reference/typescript/auth/attestation/functions/fetchAttestationRequest.md": { - id: "reference/typescript/auth/attestation/functions/fetchAttestationRequest.md"; - slug: "reference/typescript/auth/attestation/functions/fetchattestationrequest"; +"server/introduction.md": { + id: "server/introduction.md"; + slug: "server/introduction"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; -"reference/typescript/auth/attestation/functions/fetchAttestationResponse.md": { - id: "reference/typescript/auth/attestation/functions/fetchAttestationResponse.md"; - slug: "reference/typescript/auth/attestation/functions/fetchattestationresponse"; +"server/running-locally.md": { + id: "server/running-locally.md"; + slug: "server/running-locally"; body: string; collection: "docs"; data: InferEntrySchema<"docs"> diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..2aa7be8 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,133 @@ +clients/liquid-auth-js +clients/liquid-auth-android + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 7398efe..e559d65 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -1,37 +1,205 @@ -import { defineConfig } from 'astro/config'; -import starlight from '@astrojs/starlight'; - +import { defineConfig } from "astro/config"; +import starlight from "@astrojs/starlight"; +import rehypeMermaid from "rehype-mermaid"; import tailwind from "@astrojs/tailwind"; +import starlightOpenAPI, { openAPISidebarGroups } from "starlight-openapi"; +// import starlightTypeDoc, { typeDocSidebarGroup } from "starlight-typedoc"; +import react from "@astrojs/react"; +import mdx from "@astrojs/mdx"; // https://astro.build/config export default defineConfig({ - base: '/liquid-auth', - integrations: [ - starlight({ - title: 'Liquid\nAuth', - favicon: './public/logo.svg', - logo: { - src: './public/logo.svg' + base: ".", + site: 'https://liquidauth.com', + markdown: { + rehypePlugins: [rehypeMermaid] + }, + integrations: [starlight({ + title: "Liquid Auth", + favicon: "./public/logo.svg", + customCss: [ + './src/styles/mermaid.css', + ], + logo: { + src: "./public/logo.svg" + }, + editLink: { + baseUrl: 'https://github.com/algorandfoundation/liquid-auth/edit/develop/docs/', + }, + plugins: [ + // starlightTypeDoc({ + // entryPoints: ["../docs/clients/liquid-auth-js/src/index.ts"], + // tsconfig: "../docs/clients/liquid-auth-js/tsconfig.json", + // output: "clients/browser/api", + // sidebar: { + // label: "Reference", + // collapsed: true + // } + // }), + starlightOpenAPI([{ + base: "server/api", + label: "Reference", + schema: "https://liquid-auth.onrender.com/docs-json" + }]) + ], + social: { + github: "https://github.com/algorandfoundation/liquid-auth" + }, + sidebar: [{ + label: "Overview", + link: "/introduction" + }, { + label: "Guides", + autogenerate: { + directory: "guides" + } + }, { + label: "Server", + collapsed: true, + items: [{ + label: "Introduction", + link: "/server/introduction", + badge: { + text: "WIP", + variant: "caution" + } }, - social: { - github: 'https://github.com/algorandfoundation/liquid-auth' + { + label: "Running locally", + link: "/server/running-locally" }, - sidebar: [{ - label: 'Guides', - autogenerate: { - directory: 'guides' - } - },{ - label: 'Architecture', - autogenerate: { - directory: 'architecture' - } - }, { - label: 'Reference', - autogenerate: { - directory: 'reference', + { + "label": "Configuration", + "link": "/server/environment-variables" + }, + { + label: "Integrations", + link: "/server/integrations", + badge: { + text: "WIP", + variant: "caution" + } + }, + ...openAPISidebarGroups, + ] + }, { + label: "Clients", + collapsed: true, + items: [{ + label: "Android", + collapsed: true, + items: [ + { + label: "Introduction", + link: "/clients/android/introduction", + }, + { + label: "Registration", + link: "/clients/android/registration", + }, + { + label: "Authentication", + link: "/clients/android/authentication", + }, + { + label: "Peer Offer", + link: "/clients/android/offer", + badge: { + text: "WIP", + variant: "caution" + }, + }, + { + label: "Peer Answer", + link: "/clients/android/answer", + badge: { + text: "WIP", + variant: "caution" + }, + }, + { + label: "Provider Service", + collapsed: true, + items: [ + { + label: "Introduction", + link: "/clients/android/provider-service/introduction", + }, + { + label: "Create Passkey", + link: "/clients/android/provider-service/create-passkey", + badge: { + text: "TODO", + variant: "danger" + }, + }, + { + label: "Get Passkey", + link: "/clients/android/provider-service/get-passkey", + badge: { + text: "TODO", + variant: "danger" + }, + } + ], + badge: { + text: "^14", + variant: "danger" + }, + }, + { + label: "Reference", + // link: "/clients/browser/api", + badge: { + text: "TODO", + variant: "danger" + }, + items:[] + }, + ] + }, + { + label: "Browser", + collapsed: true, + items: [{ + label: "Introduction", + link: "/clients/browser/introduction", + }, + { + label: "Registration", + link: "/clients/browser/registration", + }, + { + label: "Authentication", + link: "/clients/browser/authentication", + }, + { + label: "Peer Offer", + link: "/clients/browser/offer", + }, + { + label: "Peer Answer", + link: "/clients/browser/answer", }, + { + label: "Full Example", + link: "/clients/browser/example", + }, + { + label: "Reference", + // link: "/clients/browser/api", + badge: { + text: "TODO", + variant: "danger" + }, + items:[] + }, + // typeDocSidebarGroup + ] }] - }), - tailwind()] + }, { + label: "Architecture", + link: "/architecture" + }] + }), tailwind(), react(), mdx()] }); diff --git a/docs/fetch.sh b/docs/fetch.sh new file mode 100755 index 0000000..eec544e --- /dev/null +++ b/docs/fetch.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +git clone git@github.com:algorandfoundation/liquid-auth-js.git clients/liquid-auth-js +git clone git@github.com:algorandfoundation/liquid-auth-android.git clients/liquid-auth-android diff --git a/docs/package-lock.json b/docs/package-lock.json index 5a92bf4..69f1c34 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,14 +8,44 @@ "name": "test-starlight", "version": "0.0.1", "dependencies": { + "@algorandfoundation/liquid-client": "github:algorandfoundation/liquid-auth-js", "@astrojs/check": "^0.5.10", + "@astrojs/mdx": "^3.1.2", + "@astrojs/react": "^3.6.0", "@astrojs/starlight": "^0.24.2", "@astrojs/tailwind": "^5.1.0", "@fontsource/poppins": "^5.0.13", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "astro": "^4.3.5", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "rehype-mermaid": "^2.1.0", "sharp": "^0.32.5", + "starlight-openapi": "^0.6.4", + "starlight-typedoc": "^0.13.0", "tailwindcss": "^3.4.4", + "typedoc": "^0.26.3", + "typedoc-plugin-markdown": "^4.1.2", "typescript": "^5.4.5" + }, + "devDependencies": { + "qr-code-styling": "github:PhearZero/qr-code-styling", + "socket.io-client": "^4.7.5", + "tweetnacl": "^1.0.3" + } + }, + "node_modules/@algorandfoundation/liquid-client": { + "version": "0.0.1", + "resolved": "git+ssh://git@github.com/algorandfoundation/liquid-auth-js.git#0dcba41bbc0f66f003cc18ed6ae8c7dcf19f3707", + "hasInstallScript": true, + "license": "AGPL-3.0", + "dependencies": { + "canvas": "^2.11.2", + "eventemitter3": "^5.0.1", + "qr-code-styling": "*", + "socket.io-client": "^4.7.5", + "tweetnacl": "^1.0.3" } }, "node_modules/@alloc/quick-lru": { @@ -41,6 +71,19 @@ "node": ">=6.0.0" } }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" + }, "node_modules/@astrojs/check": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.5.10.tgz", @@ -133,14 +176,14 @@ } }, "node_modules/@astrojs/mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.1.tgz", - "integrity": "sha512-Y6Ath3E/DgDsMdbenXai+Qm6DGCMnR6rvgHwK2PUQTs6iKF+oQ8SfZ1zPC1kt22rP1PnA8siYSQhNL91K4eukQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.2.tgz", + "integrity": "sha512-0EizCWhUi0wdYPm31kNOHsOrGmn8pEJy+YEGQlHWt4Flg2NYfV7nWZuYG8KxoRSK/W397vPhyHYrITCYo7JMYw==", "dependencies": { - "@astrojs/markdown-remark": "5.1.0", + "@astrojs/markdown-remark": "5.1.1", "@mdx-js/mdx": "^3.0.1", "acorn": "^8.12.0", - "es-module-lexer": "^1.5.3", + "es-module-lexer": "^1.5.4", "estree-util-visit": "^2.0.0", "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", @@ -160,6 +203,31 @@ "astro": "^4.8.0" } }, + "node_modules/@astrojs/mdx/node_modules/@astrojs/markdown-remark": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.1.1.tgz", + "integrity": "sha512-rkWWjR9jVo0LAMxQ2+T19RKbQUa7NwBGhFj03bAz3hGf3blqeBIXs1NSPpizshO5kZzcOqKe8OlG6XpYO8esHg==", + "dependencies": { + "@astrojs/prism": "3.1.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.1", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.1.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.0", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.0", + "remark-smartypants": "^3.0.1", + "shiki": "^1.9.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.1" + } + }, "node_modules/@astrojs/mdx/node_modules/@types/nlcst": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", @@ -304,6 +372,24 @@ "node": "^18.17.1 || ^20.3.0 || >=21.0.0" } }, + "node_modules/@astrojs/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.0.tgz", + "integrity": "sha512-YGLxy5jCU9xKG/HAvYsWMcvrQVIhqVe0Sda3Z5UtP32rfXeG6B9J1xQvnx+kRSFTpIrj+7AwPSDSehLbCHJ56w==", + "dependencies": { + "@vitejs/plugin-react": "^4.3.1", + "ultrahtml": "^1.5.3" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21", + "@types/react-dom": "^17.0.17 || ^18.0.6", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0-beta" + } + }, "node_modules/@astrojs/sitemap": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.6.tgz", @@ -684,6 +770,45 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", @@ -730,6 +855,11 @@ "node": ">=6.9.0" } }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" + }, "node_modules/@ctrl/tinycolor": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", @@ -1175,6 +1305,23 @@ "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.13.tgz", "integrity": "sha512-8G9odFoxH43oZpvq43fpGucm8iHm6iatu0M1LIshb+tx3/y6YBXenVED7CI4resvPz6hyDu8a2vHSh9vrpe+wQ==" }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz", + "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "engines": { + "node": ">=10.10.0" + } + }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", @@ -1686,6 +1833,30 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@mdx-js/mdx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", @@ -1826,6 +1997,122 @@ "node": ">=14" } }, + "node_modules/@readme/better-ajv-errors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-1.6.0.tgz", + "integrity": "sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/runtime": "^7.21.0", + "@humanwhocodes/momoa": "^2.0.3", + "chalk": "^4.1.2", + "json-to-ast": "^2.0.3", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@readme/better-ajv-errors/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@readme/better-ajv-errors/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@readme/json-schema-ref-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@readme/json-schema-ref-parser/-/json-schema-ref-parser-1.2.0.tgz", + "integrity": "sha512-Bt3QVovFSua4QmHa65EHUmh2xS0XJ3rgTEUPH998f4OW4VVJke3BuS16f+kM0ZLOGdvIrzrPRqwihuv5BAjtrA==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@readme/openapi-parser": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-2.5.0.tgz", + "integrity": "sha512-IbymbOqRuUzoIgxfAAR7XJt2FWl6n2yqN09fF5adacGm7W03siA3bj1Emql0X9D2T+RpBYz3x9zDsMhuoMP62A==", + "dependencies": { + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "@readme/better-ajv-errors": "^1.6.0", + "@readme/json-schema-ref-parser": "^1.2.0", + "ajv": "^8.12.0", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.14.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", @@ -2019,9 +2306,17 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.7.0.tgz", - "integrity": "sha512-O6j27b7dGmJbR3mjwh/aHH8Ld+GQvA0OQsNO43wKWnqbAae3AYXrhFyScHGX8hXZD6vX2ngjzDFkZY5srtIJbQ==" + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", + "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", + "dependencies": { + "@types/hast": "^3.0.4" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/@types/acorn": { "version": "4.0.6", @@ -2073,6 +2368,24 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -2102,6 +2415,11 @@ "@types/unist": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -2141,6 +2459,28 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", @@ -2159,6 +2499,24 @@ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, "node_modules/@volar/kit": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.1.6.tgz", @@ -2259,6 +2617,11 @@ "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.16.tgz", "integrity": "sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", @@ -2278,6 +2641,45 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -2362,6 +2764,24 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -2801,6 +3221,11 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "node_modules/camelcase": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", @@ -2839,6 +3264,52 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/canvas/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/canvas/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/canvas/node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3079,6 +3550,14 @@ "node": ">=6" } }, + "node_modules/code-error-fragment": { + "version": "0.0.230", + "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", + "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", + "engines": { + "node": ">= 4" + } + }, "node_modules/collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", @@ -3122,6 +3601,14 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/color/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3160,6 +3647,16 @@ "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3173,6 +3670,14 @@ "node": ">= 0.6" } }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3212,6 +3717,457 @@ "node": ">=4" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/cytoscape": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.0.tgz", + "integrity": "sha512-l590mjTHT6/Cbxp13dGPC2Y7VXdgc+rUeF8AnF/JPzhjNevbDJfObnJgaSjlldOgBQZbue+X6IUZ7r5GAgvauQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", + "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" + }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -3262,6 +4218,19 @@ "node": ">=4.0.0" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3336,6 +4305,11 @@ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, + "node_modules/dompurify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" + }, "node_modules/dset": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", @@ -3354,6 +4328,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz", "integrity": "sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==" }, + "node_modules/elkjs": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", + "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==" + }, "node_modules/emmet": { "version": "2.4.7", "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.7.tgz", @@ -3382,6 +4361,26 @@ "once": "^1.4.0" } }, + "node_modules/engine.io-client": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3394,9 +4393,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/esbuild": { "version": "0.21.5", @@ -3596,6 +4595,11 @@ "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-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", @@ -3699,17 +4703,49 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { @@ -3720,6 +4756,68 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3813,6 +4911,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -3855,6 +4958,11 @@ "node": ">=4" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3879,6 +4987,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-from-dom": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz", + "integrity": "sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==", + "dependencies": { + "@types/hast": "^3.0.0", + "hastscript": "^8.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-from-html": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", @@ -3896,6 +5018,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-html": "^2.0.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-from-parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", @@ -4220,6 +5357,18 @@ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -4228,6 +5377,17 @@ "node": ">=16.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -4248,14 +5408,24 @@ ] }, "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -4271,6 +5441,14 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -4557,6 +5735,23 @@ "node": ">=4" } }, + "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/json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", + "dependencies": { + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -4573,6 +5768,42 @@ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/katex": { + "version": "0.16.11", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", + "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4589,6 +5820,19 @@ "node": ">=6" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, "node_modules/lilconfig": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", @@ -4605,6 +5849,14 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/load-yaml-file": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", @@ -4653,6 +5905,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", @@ -4699,6 +5956,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4707,6 +5975,11 @@ "yallist": "^3.0.2" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", @@ -4715,6 +5988,28 @@ "@jridgewell/sourcemap-codec": "^1.4.15" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -4726,6 +6021,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, "node_modules/markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", @@ -4950,119 +6261,645 @@ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.1.tgz", + "integrity": "sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.1", + "@types/d3-scale": "^4.0.3", + "@types/d3-scale-chromatic": "^3.0.0", + "cytoscape": "^3.28.1", + "cytoscape-cose-bilkent": "^4.1.0", + "d3": "^7.4.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "^3.0.5", + "elkjs": "^0.9.0", + "katex": "^0.16.9", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/mermaid-isomorphic": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mermaid-isomorphic/-/mermaid-isomorphic-2.2.1.tgz", + "integrity": "sha512-OPxQsUL2TIlAfC3ExhI/mORzigTbUOqYtqUGUECSKevGCSf/+QEwq78MRZWG1PpmTkl2ORoK8Yy5WkqqTqywMg==", + "dependencies": { + "@fortawesome/fontawesome-free": "^6.0.0", + "mermaid": "^10.0.0", + "playwright-core": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/mermaid/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mermaid/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/mermaid/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mermaid/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mermaid/node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/mermaid/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/mermaid/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "node_modules/mermaid/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mermaid/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mermaid/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "node_modules/mermaid/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-types": "^1.0.0" } }, - "node_modules/mdast-util-to-hast": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "node_modules/mermaid/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "node_modules/mermaid/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "node_modules/mermaid/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mermaid/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mermaid/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dependencies": { - "@types/mdast": "^4.0.0" + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, "node_modules/micromark": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", @@ -5797,10 +7634,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5827,11 +7672,58 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -5860,6 +7752,11 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -5910,11 +7807,49 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "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-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5961,6 +7896,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -6010,6 +7957,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "peer": true + }, "node_modules/ora": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", @@ -6207,6 +8160,14 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6349,6 +8310,17 @@ "node": ">=8" } }, + "node_modules/playwright-core": { + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.1.tgz", + "integrity": "sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -6635,6 +8607,35 @@ "once": "^1.3.1" } }, + "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/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qr-code-styling": { + "version": "1.5.0", + "resolved": "git+ssh://git@github.com/PhearZero/qr-code-styling.git#85fdaefdc6464cbb17318102543158dab854c5b0", + "license": "MIT", + "dependencies": { + "qrcode-generator": "^1.4.3" + } + }, + "node_modules/qrcode-generator": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz", + "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6673,6 +8674,37 @@ "rc": "cli.js" } }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -6713,6 +8745,11 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/rehype": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", @@ -6755,6 +8792,25 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-mermaid": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rehype-mermaid/-/rehype-mermaid-2.1.0.tgz", + "integrity": "sha512-YgzHXaUTzp+loffUvAoX+vtNNl36WL12GWYv4farPeW9GRFfYdgNg15O/3nADAW/Yh5/997Vv+0WaWOJ24/YSg==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html-isomorphic": "^2.0.0", + "hast-util-to-text": "^4.0.0", + "mermaid-isomorphic": "^2.0.0", + "mini-svg-data-uri": "^1.0.0", + "space-separated-tokens": "^2.0.0", + "unified": "^11.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, "node_modules/rehype-minify-whitespace": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz", @@ -6929,6 +8985,14 @@ "node": ">=0.10.0" } }, + "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/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -7346,6 +9410,66 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "node_modules/rollup": { "version": "4.14.3", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", @@ -7402,6 +9526,22 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7421,11 +9561,24 @@ } ] }, + "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/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -7468,6 +9621,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/sharp": { "version": "0.32.6", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", @@ -7510,11 +9668,12 @@ } }, "node_modules/shiki": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.7.0.tgz", - "integrity": "sha512-H5pMn4JA7ayx8H0qOz1k2qANq6mZVCMl1gKLK6kWIrv1s2Ial4EmD4s4jE8QB5Dw03d/oCQUxc24sotuyR5byA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", + "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", "dependencies": { - "@shikijs/core": "1.7.0" + "@shikijs/core": "1.10.3", + "@types/hast": "^3.0.4" } }, "node_modules/signal-exit": { @@ -7607,6 +9766,32 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, + "node_modules/socket.io-client": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -7637,6 +9822,40 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/starlight-openapi": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/starlight-openapi/-/starlight-openapi-0.6.4.tgz", + "integrity": "sha512-TIioFhMmSKhKau6g/fx5WgWyPQve7cjP896wQek3sHqCJeLAsTSqUYCb33bBb/4D1/6sUioqlfJd9J3Lc1NQjA==", + "dependencies": { + "@readme/openapi-parser": "2.5.0", + "github-slugger": "2.0.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@astrojs/markdown-remark": ">=4.2.0", + "@astrojs/starlight": ">=0.19.0", + "astro": ">=4.2.7" + } + }, + "node_modules/starlight-typedoc": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/starlight-typedoc/-/starlight-typedoc-0.13.0.tgz", + "integrity": "sha512-EWJr/x6IeloY1CH0dVsDhrMzcqlNK/4dYjfo+KL5v6+zRkH6+YH2Kqwk8bdIPB53JxcCcLl9LUWRPWQ43OdPlg==", + "dependencies": { + "github-slugger": "2.0.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.15.0", + "astro": ">=4.0.0", + "typedoc": ">=0.26.0", + "typedoc-plugin-markdown": ">=4.0.0" + } + }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -7817,6 +10036,11 @@ "inline-style-parser": "0.1.1" } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -7915,6 +10139,22 @@ "node": ">=10" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar-fs": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", @@ -7938,6 +10178,27 @@ "streamx": "^2.15.0" } }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -7976,6 +10237,11 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -7994,6 +10260,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -8035,6 +10309,11 @@ "node": "*" } }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -8046,6 +10325,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typedoc": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.3.tgz", + "integrity": "sha512-6d2Sw9disvvpdk4K7VNjKr5/3hzijtfQVHRthhDqJgnhMHy1wQz4yPMJVKXElvnZhFr0nkzo+GzjXDTRV5yLpg==", + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.1.2.tgz", + "integrity": "sha512-jZt8jmQLbmg9jmFQyfJrjLf6ljRwJ5fKMeqmFr0oPXmeX5ZRYYtCe6y/058vDESE/R+TwEvNua6SuG43UBbszw==", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.26.x" + } + }, "node_modules/typesafe-path": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", @@ -8071,6 +10382,16 @@ "semver": "^7.3.8" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, + "node_modules/ultrahtml": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", + "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -8086,9 +10407,9 @@ } }, "node_modules/unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -8268,11 +10589,48 @@ "browserslist": ">= 4.21.0" } }, + "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/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "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/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/vfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", @@ -8575,6 +10933,25 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/web-worker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", + "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" + }, + "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": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8609,6 +10986,51 @@ "node": ">=4" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -8781,6 +11203,34 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -8795,9 +11245,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "bin": { "yaml": "bin.mjs" }, diff --git a/docs/package.json b/docs/package.json index 1d2e2d3..bbdc92f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,13 +10,30 @@ "astro": "astro" }, "dependencies": { + "@algorandfoundation/liquid-client": "github:algorandfoundation/liquid-auth-js", "@astrojs/check": "^0.5.10", + "@astrojs/mdx": "^3.1.2", + "@astrojs/react": "^3.6.0", "@astrojs/starlight": "^0.24.2", "@astrojs/tailwind": "^5.1.0", "@fontsource/poppins": "^5.0.13", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "astro": "^4.3.5", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "rehype-mermaid": "^2.1.0", "sharp": "^0.32.5", + "starlight-openapi": "^0.6.4", + "starlight-typedoc": "^0.13.0", "tailwindcss": "^3.4.4", + "typedoc": "^0.26.3", + "typedoc-plugin-markdown": "^4.1.2", "typescript": "^5.4.5" + }, + "devDependencies": { + "qr-code-styling": "github:PhearZero/qr-code-styling", + "socket.io-client": "^4.7.5", + "tweetnacl": "^1.0.3" } } diff --git a/docs/src/assets/houston.webp b/docs/src/assets/houston.webp deleted file mode 100644 index 930c164..0000000 Binary files a/docs/src/assets/houston.webp and /dev/null differ diff --git a/docs/src/components/header.astro b/docs/src/components/header.astro index 03957a5..4467144 100644 --- a/docs/src/components/header.astro +++ b/docs/src/components/header.astro @@ -6,11 +6,11 @@ const logo = `${base}/logo.svg`; const links = [ { title: 'Deep Dive', - href: `${base}/architecture/deep-dive/` + href: `${base}/architecture/` }, { title: 'Features', - href: `${base}/architecture/features` + href: `${base}/introduction` }, { title: 'Demo', diff --git a/docs/src/components/marketing/authentication.astro b/docs/src/components/marketing/authentication.astro index dfb4ee5..8a03599 100644 --- a/docs/src/components/marketing/authentication.astro +++ b/docs/src/components/marketing/authentication.astro @@ -42,7 +42,7 @@ const base = import.meta.env.BASE_URL; Passkeys? Like there's no tomorrow
Want to learn how we achieve this?

- Deep Dive + Deep Dive
-

{title}

-

{titleEmph}

-

{descPartOne}
{descPartTwo}

- Try the demo +

+ {title} +

+

{titleEmph}

+

+ {descPartOne}
{descPartTwo} +

+ Try the demo
- diff --git a/docs/src/components/marketing/sovereignty.astro b/docs/src/components/marketing/sovereignty.astro index 92255c4..2d8a6b1 100644 --- a/docs/src/components/marketing/sovereignty.astro +++ b/docs/src/components/marketing/sovereignty.astro @@ -41,7 +41,7 @@ const base = import.meta.env.BASE_URL; A lot of R&D goes into building beautiful self-sovereign distributed ledgers, yet the usability of your chain relies on a few extremely powerful middlemen. This changes now.

- Features + Features
diff --git a/docs/src/content/docs/architecture.md b/docs/src/content/docs/architecture.md new file mode 100644 index 0000000..3ca461c --- /dev/null +++ b/docs/src/content/docs/architecture.md @@ -0,0 +1,101 @@ +--- +title: Architecture +sidebar: + order: 6 +prev: false +next: false +--- + +This is a high level overview of the sequence of events that happens while using Liquid Auth. +See the [Getting Started](./guides/getting-started) section for more detailed information on each step. +Diagrams are generated using [Mermaid](https://mermaid-js.github.io/mermaid/#/). + +## Authentication + +A user can link their device to a website by scanning a QR code. +The website will subscribe to a WebSocket channel to receive the link status. +The wallet will scan the QR code and send a [FIDO2 PublicKeyCredential]() to the server. +The server will validate the FIDO2 credential and send a response to the wallet and website. + +```mermaid +sequenceDiagram + participant Website as Answer Client + participant Server + participant Wallet as Offer Client + Website->>Server: Subscribe to 'wss:link' + Website-->>Website: Display QR Connect Request ID + Wallet->>Website: Scan QR Code + Server-->>Wallet: Get Challenge/Options + Wallet->>Server: POST FIDO2 Credential + Liquid Auth Extension + Server-->>Server: Validate Signatures + Server-->>Website: HTTPOnly Session + Server->>Wallet: Ok Response + HTTPOnly Session + Server->>Website: Emit to `wss:link` client +``` + +## Signaling + +The website and wallet can subscribe to an isolated WebSocket channel to broker [Session Description]() answers and offers. +[ICE Candidates]() are discovered when any peer has both an offer and answer. + +```mermaid +sequenceDiagram + participant Website as Answer Client + participant Server + participant Wallet as Offer Client + Website-->>Server: Subscribe to 'wss:offer-description' + Website-->>Server: Subscribe to 'wss:offer-candidate' + Wallet-->>Server: Subscribe to 'wss:answer-description' + Wallet-->>Server: Subscribe to 'wss:answer-candidate' +``` + +### Offer + +[Offers]() are created by a peer and sent through the signaling service. +A client with an offer will listen for an answer description. +Answers are only emitted in response to an offer. +Offer clients are responsible for creating the [Data Channel](). + +```mermaid +sequenceDiagram + participant Website as Answer Client + participant Server + participant Wallet as Offer Client + Wallet-->>Wallet: On answer-description, set Remote SDP + Wallet-->>Wallet: On answer-candidate, add ICE Candidate + Wallet-->>Wallet: Create Peer Offer & DataChannel + Wallet-->>Server: Emit `wss:offer-description` + Wallet-->>Server: Emit `wss:offer-candidate` +``` + +### Answer + +An [Answer]() is created by a peer in response to an offer. +The answer description and candidates are emitted to the signaling service. + +```mermaid +sequenceDiagram + participant Website as Answer Client + participant Server + participant Wallet as Offer Client + Website-->>Website: On offer-description, set Remote SDP and create Answer + Website-->>Website: On offer-candidate, add ICE Candidate + Website-->>Server: Emit `wss:answer-description` + Website-->>Server: Emit `wss:answer-candidate` +``` + +### Data Channel + +Once an Offer and Answer have been exchanged, a [Data Channel]() will be emitted to the peer who created the answer. +This channel is used to send messages between the website and wallet in real-time over the established P2P connection. +```mermaid +sequenceDiagram + participant Website as Answer Client + participant Server + participant Wallet as Offer Client + Wallet-->>Website: Emit DataChannel + Wallet-->>Wallet: On Message, Handle Message + Website-->>Website: On DataChannel, listen for Messages + Website-->>Wallet: Emit Messages + Wallet-->>Website: Emit Messages +``` diff --git a/docs/src/content/docs/architecture/deep-dive.md b/docs/src/content/docs/architecture/deep-dive.md deleted file mode 100644 index b61a82f..0000000 --- a/docs/src/content/docs/architecture/deep-dive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Deep Dive ---- - -WIP diff --git a/docs/src/content/docs/architecture/features.md b/docs/src/content/docs/architecture/features.md deleted file mode 100644 index c1a48fe..0000000 --- a/docs/src/content/docs/architecture/features.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Features ---- - -WIP diff --git a/docs/src/content/docs/clients/android/answer.mdx b/docs/src/content/docs/clients/android/answer.mdx new file mode 100644 index 0000000..4b00c3c --- /dev/null +++ b/docs/src/content/docs/clients/android/answer.mdx @@ -0,0 +1,34 @@ +--- +title: "Android: Peer Answer" +--- + +The answer client is used to respond to a remote client's offer. +The remote client will have sent an offer to the answer client, which will then respond with an answer. + +### Who is this for? + +- **Mobile Apps** that want to leverage liquid-auth to connect to other mobile apps + +## Signaling + +```kotlin +val requestID = SignalClient.generateRequestId() // Create a new Request ID +val origin = "https://my-liquid-service.com" // Specify the origin of the service +val client = SignalClient(origin, context, httpClient) // Create the Client + +// Display the QR Code +val qrCode = signalClient.qrCode(requestId, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round)) + +// Wait for peer to scan the QR Code +val dc = signalClient.peer(requestId, "offer" ) + +// Handle the data channel messages and state changes +signalClient.handleDataChannel(dc!!, { + Log.d(TAG, "onMessage($it)") +},{ + Log.d(TAG, "onStateChange($it)") +}) + +// Send Message to Peer +signalClient.peerClient.send("Hello World!") +``` diff --git a/docs/src/content/docs/clients/android/authentication.mdx b/docs/src/content/docs/clients/android/authentication.mdx new file mode 100644 index 0000000..2ff5b15 --- /dev/null +++ b/docs/src/content/docs/clients/android/authentication.mdx @@ -0,0 +1,122 @@ +--- +title: 'Android: Authentication' +--- + +import {Aside, Tabs, TabItem } from "@astrojs/starlight/components"; + +Authenticate an existing [Passkey](../../guides/concepts#passkeys) with the [Service](../../server/introduction). + +Get started by initializing the AssertionApi with an OkHttpClient and CookieJar. +```kotlin +val httpClient = OkHttpClient.Builder() + .cookieJar(cookieJar) // Use Cookie jar to share cookies between requests + .build() +val assertionApi = AssertionApi(httpClient) +``` + +## User Agent + +The User-Agent string is used to authenticate the device. + +```kotlin +// UA used to authenticate the device +val userAgent = "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME} " + +"(Android ${Build.VERSION.RELEASE}; ${Build.MODEL}; ${Build.BRAND})" +``` + +## Options + +Fetch assertion options from the service. +```kotlin +val response = assertionApi.postAssertionOptions( + origin, // Origin Server + userAgent, // Required for checking the authenticator fingerprint + credentialId // Base64URL Encoded Credential ID +).await() +``` + +## Retrieving + +There are several ways to handle the retrieval of an existing Passkey. +We recommend +using the [FIDO2ApiClient](https://developers.google.com/identity/fido/android/native-apps) or [CredentialManager](https://developer.android.com/identity/sign-in/credential-manager) + + + + + ```kotlin + // MainActivity.kt + val fido2Client = Fido2ApiClient(context) + + val origin = "https://my-liquid-service.com" + val credentialId = "Base64URL Encoded Credential ID" + + // Fetch Attestation Options + val response = attestationApi.postAssertionOptions(origin, userAgent, credentialId).await() + + // Parse the response to PublicKeyCredentialRequestOptions + val publicKeyCredentialRequestOptions = response.body.toPublicKeyCredentialRequestOptions() + + // Activity Result Handler + fun handleAuthenticatorAssertionResult(activityResult: ActivityResult){ + val bytes = activityResult.data?.getByteArrayExtra(Fido.FIDO2_KEY_CREDENTIAL_EXTRA) + when { + activityResult.resultCode != Activity.RESULT_OK -> + Log.d(TAG, "Not OK!") + + bytes == null -> + Log.e(TAG, "Error!") + + else -> { + /** + * Handle the PublicKeyCredential + * + * Now you can combine the PublicKeyCredential with the Liquid Extension JSON + * and submit it to the service for verification + */ + val credential = PublicKeyCredential.deserializeFromBytes(bytes) + } + } + } + + // Register/Attestation Intent Launcher + val assertionIntentLauncher = registerForActivityResult( + ActivityResultContracts.StartIntentSenderForResult(), + ::handleAuthenticatorAssertionResult + ) + + // Launch the FIDO2 Intent + val pendingIntent = fido2Client.getRegisterPendingIntent(publicKeyCredentialRequestOptions).await() + assertionIntentLauncher.launch( + IntentSenderRequest.Builder(pendingIntent).build() + ) + ``` + + + ```kotlin + // MainActivity.kt + import foundation.algorand.auth.fido2.* + + val credential = PublicKeyCredential() + ``` + + + +## Response + +```kotlin +// MainActivity.kt + +val liquidExtJSON = JSONObject() +liquidExtJSON.put("requestId", requestId) + +val response = assertionApi.postAssertionResponse( + origin, // Origin Server + userAgent, // Required for checking the authenticator fingerprint + credential, // PublicKeyCredential + liquidExtJSON // Liquid Extension JSON +) +``` diff --git a/docs/src/content/docs/clients/android/introduction.mdx b/docs/src/content/docs/clients/android/introduction.mdx new file mode 100644 index 0000000..f47df2a --- /dev/null +++ b/docs/src/content/docs/clients/android/introduction.mdx @@ -0,0 +1,89 @@ +--- +title: "Android: Introduction" +prev: false +--- +import { Aside, Tabs, TabItem } from "@astrojs/starlight/components"; + + + +The Android Client is a library that allows you to interact with the Liquid Auth Service and provides +utilities to integrate with the native platform. + +### Pre-requisites + +Install [Android Studio](https://developer.android.com/studio) and create or open an application. + + +### Fingerprint + +Get the SHA256 fingerprint of your application. +The Server uses the fingerprint to attest the credential. +You can use the following command to get the SHA256 fingerprint of your application. + +```bash +keytool -list -v -keystore -alias -storepass -keypass +``` + + + + +## Getting Started + +Run a local instance +or deploy the [Liquid Auth Service](../../../server/running-locally) +using the SHA256 fingerprint and application name in the [environment configuration](../../server/environment-variables) + +### Install + +Add jitpack as a repository + + + ```kotlin + dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { + setUrl("https://jitpack.io") + } + } + } + ``` + + + ```groovy + dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url 'https://jitpack.io' } + } + } + ``` + + + +Install the package + + + + ```kotlin + dependencies { + implementation("com.github.algorandfoundation:liquid-auth-android:v1.0.0-canary.3") + } + ``` + + + ```groovy + dependencies { + implementation 'com.github.algorandfoundation:liquid-auth-android:v1.0.0-canary.3' + } + ``` + + diff --git a/docs/src/content/docs/clients/android/offer.mdx b/docs/src/content/docs/clients/android/offer.mdx new file mode 100644 index 0000000..e35434e --- /dev/null +++ b/docs/src/content/docs/clients/android/offer.mdx @@ -0,0 +1,21 @@ +--- +title: 'Android: Peer Offer' +--- +import {Aside} from "@astrojs/starlight/components"; + + + +[Peer-to-Peer]() connections can only be done using the `SignalClient`. +Wallets are responsible for creating offers to connect. + +## Signaling + +```kotlin +val requestID = 12345 // Scanned from a QR Code or Deep Link +val origin = "https://my-liquid-service.com" // Origin of the service +val client = SignalClient(origin, context, httpClient) +val dc = signalClient?.peer(requestId, "answer" ) +``` diff --git a/docs/src/content/docs/clients/android/provider-service/create-passkey.md b/docs/src/content/docs/clients/android/provider-service/create-passkey.md new file mode 100644 index 0000000..9175cbc --- /dev/null +++ b/docs/src/content/docs/clients/android/provider-service/create-passkey.md @@ -0,0 +1,18 @@ +--- +title: "Android: Create Service Passkey" +--- + + +```kotlin +val request = PendingIntentHandler.retrieveProviderGetCredentialRequest(intent) +if (request != null) { + lifecycleScope.launch { + val result = viewModel.processGetPasskey(this@GetPasskeyActivity, request, intent.getBundleExtra("CREDENTIAL_DATA")) + Log.d(TAG, "result: $result") + setResult(Activity.RESULT_OK, result) + finish() + } +} else { + binding.getPasskeyMessage.text = resources.getString(R.string.get_passkey_error) +} +``` diff --git a/docs/src/content/docs/clients/android/provider-service/get-passkey.md b/docs/src/content/docs/clients/android/provider-service/get-passkey.md new file mode 100644 index 0000000..fca6c4f --- /dev/null +++ b/docs/src/content/docs/clients/android/provider-service/get-passkey.md @@ -0,0 +1,13 @@ +--- +title: "Android: Get Service Passkey" +--- + +```kotlin +// MainActivity.kt +val request = PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent) +if (request.callingRequest is CreatePublicKeyCredentialRequest) { + val result = viewModel.processCreatePasskey(this@CreatePasskeyActivity, request) +} else { + binding.createPasskeyMessage.text = resources.getString(R.string.get_passkey_error) +} +``` diff --git a/docs/src/content/docs/clients/android/provider-service/introduction.mdx b/docs/src/content/docs/clients/android/provider-service/introduction.mdx new file mode 100644 index 0000000..a4751dc --- /dev/null +++ b/docs/src/content/docs/clients/android/provider-service/introduction.mdx @@ -0,0 +1,156 @@ +--- +title: "Android: Provider Service" +--- + +import {Aside} from '@astrojs/starlight/components'; + + + +Since Android 14, the [CredentialProviderService](https://developer.android.com/reference/android/service/credentials/CredentialProviderService) has been introduced to allow developers to create custom roaming authenticators. +This allows applications to store and manage credentials outside Google Password Manager with full custody of the key material. + +It opens the doors to a new world of possibilities for developers to create secure and private authentication experiences using +just their Android devices. + + +### Who is this for? + +- **Mobile Wallets** that want to act as a roaming authenticator for non-crypto sites + + +## Provider Service + +```kotlin +@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) +class LiquidCredentialProviderService: CredentialProviderService() { + private val credentialRepository = CredentialRepository() + private val job = SupervisorJob() + private val scope = CoroutineScope(Dispatchers.IO + job) + + companion object { + const val TAG = "LiquidCredentialProviderService" + //TODO: App Lock Intents + const val GET_PASSKEY_INTENT = 1 + const val CREATE_PASSKEY_INTENT = 2 + const val GET_PASSKEY_ACTION = "foundation.algorand.demo.GET_PASSKEY" + const val CREATE_PASSKEY_ACTION = "foundation.algorand.demo.CREATE_PASSKEY" + } + /** + * Handle Create Credential Requests + */ + override fun onBeginCreateCredentialRequest( + request: BeginCreateCredentialRequest, + cancellationSignal: CancellationSignal, + callback: OutcomeReceiver + ) { + val response: BeginCreateCredentialResponse? = processCreateCredentialRequest(request) + if (response != null) { + callback.onResult(response) + } else { + callback.onError(CreateCredentialUnknownException()) + } + } + + /** + * Process incoming Create Credential Requests + */ + private fun processCreateCredentialRequest(request: BeginCreateCredentialRequest): BeginCreateCredentialResponse? { + when (request) { + is BeginCreatePublicKeyCredentialRequest -> { + return handleCreatePasskeyQuery(request) + } + } + return null + } + + /** + * Create a new PassKey Entry + * + * This returns an Entry list for the user to interact with. + * A PendingIntent must be configured to receive the data from the WebAuthn client + */ + private fun handleCreatePasskeyQuery( + request: BeginCreatePublicKeyCredentialRequest + ): BeginCreateCredentialResponse { + Log.d(TAG, request.requestJson) + + + val createEntries: MutableList = mutableListOf() + val name = JSONObject(request.requestJson).getJSONObject("user").get("name").toString() + + createEntries.add( CreateEntry( + name, + createNewPendingIntent(CREATE_PASSKEY_ACTION, CREATE_PASSKEY_INTENT, null) + ) + ) + return BeginCreateCredentialResponse(createEntries) + } + /** + * Handle Get Credential Requests + */ + override fun onBeginGetCredentialRequest( + request: BeginGetCredentialRequest, + cancellationSignal: CancellationSignal, + callback: OutcomeReceiver, + ) { + try { + callback.onResult(processGetCredentialRequest(request)) + } catch (e: GetCredentialException) { + callback.onError(GetCredentialUnknownException()) + } + } + + /** + * Fake a list of available PublicKeyCredential Entries + */ + private fun processGetCredentialRequest(request: BeginGetCredentialRequest): BeginGetCredentialResponse{ + Log.v(TAG, "processing GetCredentialRequest") + val deferredCredentials: Deferred> = scope.async { + credentialRepository.getDatabase(this@LiquidCredentialProviderService).credentialDao().getAllRegular() + } + val credentials = runBlocking { + deferredCredentials.await() + } + return BeginGetCredentialResponse(credentials.map { + val data = Bundle() + data.putString("credentialId", it.credentialId) + data.putString("userHandle", it.userHandle) + PublicKeyCredentialEntry.Builder( + this@LiquidCredentialProviderService, + it.userHandle, + createNewPendingIntent(GET_PASSKEY_ACTION, GET_PASSKEY_INTENT, data), + // TODO: filter the request for PublicKeyCredentialOptions + request.beginGetCredentialOptions[0] as BeginGetPublicKeyCredentialOption + ) + .setIcon(Icon.createWithResource(this@LiquidCredentialProviderService, R.mipmap.ic_launcher)) + .build() + }) + } + override fun onClearCredentialStateRequest( + request: ProviderClearCredentialStateRequest, + cancellationSignal: CancellationSignal, + callback: OutcomeReceiver + ) { + Log.d(TAG, "onClearCredentialStateRequest") + TODO("Not yet implemented") + } + + private fun createNewPendingIntent(action: String, requestCode: Int, extra: Bundle?): PendingIntent{ + val intent = Intent(action).setPackage("foundation.algorand.demo") + if (extra != null) { + intent.putExtra("CREDENTIAL_DATA", extra) + } + return PendingIntent.getActivity( + applicationContext, requestCode, + intent, (PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) + ) + } + override fun onDestroy() { + super.onDestroy() + job.cancel() + } +} +``` diff --git a/docs/src/content/docs/clients/android/registration.mdx b/docs/src/content/docs/clients/android/registration.mdx new file mode 100644 index 0000000..82b09b3 --- /dev/null +++ b/docs/src/content/docs/clients/android/registration.mdx @@ -0,0 +1,144 @@ +--- +title: "Android: Registration" +--- + +import {Aside, Tabs, TabItem } from "@astrojs/starlight/components"; + +Register a [Passkey](../../guides/concepts#passkeys) with the [Service](../../server/introduction) +and attest the knowledge of a KeyPair. + +Get started by initializing the AttestationApi with an OkHttpClient and CookieJar. +```kotlin +val httpClient = OkHttpClient.Builder() + .cookieJar(cookieJar) // Use Cookie jar to share cookies between requests + .build() +val attestationApi = AttestationApi(httpClient) +``` + +## User Agent + +The User-Agent string is used to authenticate the device. + +```kotlin +// UA used to authenticate the device +val userAgent = "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME} " + +"(Android ${Build.VERSION.RELEASE}; ${Build.MODEL}; ${Build.BRAND})" +``` + +## Options + +Fetch attestation options from the service. +```kotlin +// Create Options for FIDO2 Server +val options = JSONObject() +options.put("username", account.address.toString()) +options.put("displayName", "Liquid Auth User") +options.put("authenticatorSelection", JSONObject().put("userVerification", "required")) + +// Enable Liquid Extension +val extensions = JSONObject() +extensions.put("liquid", true) +options.put("extensions", extensions) + +val response = attestationApi.postAttestationOptions( + origin, // Origin Server + userAgent, // Required for checking the authenticator fingerprint + options // Additional Request Options +) +``` + +## Creating + +There are several ways to handle the creation of a new Passkey. +We recommend +using the [FIDO2ApiClient](https://developers.google.com/identity/fido/android/native-apps) or [CredentialManager](https://developer.android.com/identity/sign-in/credential-manager) + + + + +```kotlin +// MainActivity.kt + +val fido2Client = Fido2ApiClient(context) + +val origin = "https://my-liquid-service.com" + +// Fetch Attestation Options +val response = attestationApi.postAttestationOptions(origin, userAgent, options).await() + +// Parse the response to PublicKeyCredentialCreationOptions +val pubKeyCredentialCreationOptions = response.body!!.toPublicKeyCredentialCreationOptions() + +// Sign the challenge with the additional keypair you have custody of +val signature = KeyPairs.rawSignBytes( + pubKeyCredentialCreationOptions.challenge, + keyPair.private +) + +// Activity Result Handler +fun handleAuthenticatorAttestationResult(activityResult: ActivityResult){ + val bytes = activityResult.data?.getByteArrayExtra(Fido.FIDO2_KEY_CREDENTIAL_EXTRA) + when { + activityResult.resultCode != Activity.RESULT_OK -> + Log.d(TAG, "Not OK!") + + bytes == null -> + Log.e(TAG, "Error!") + + else -> { + /** + * Handle the PublicKeyCredential + * + * Now you can combine the PublicKeyCredential with the Liquid Extension JSON + * and submit it to the service for verification + */ + val credential = PublicKeyCredential.deserializeFromBytes(bytes) + } + } +} + +// Register/Attestation Intent Launcher +val attestationIntentLauncher = registerForActivityResult( + ActivityResultContracts.StartIntentSenderForResult(), + ::handleAuthenticatorAttestationResult +) + +// Launch the FIDO2 Intent +val pendingIntent = fido2Client.getRegisterPendingIntent(pubKeyCredentialCreationOptions).await() +attestationIntentLauncher.launch( + IntentSenderRequest.Builder(pendingIntent).build() +) + +``` + + + ```kotlin + // MainActivity.kt + import foundation.algorand.auth.fido2.* + + val credential = PublicKeyCredential() + ``` + + + +## Response + +```kotlin +// Create the Liquid Extension JSON +val liquidExtJSON = JSONObject() +liquidExtJSON.put("type", "algorand") +liquidExtJSON.put("requestId", msg.requestId) +liquidExtJSON.put("address", account.address.toString()) +liquidExtJSON.put("signature", Base64.encodeBase64URLSafeString(signature!!)) +liquidExtJSON.put("device", Build.MODEL) + +val response = attestationApi.postAttestationResponse( + origin, // Origin Server + "User-Agent-String", // Required for checking the authenticator fingerprint + credential, // PublicKeyCredential + liquidExtJSON // Liquid Extension JSON +) +``` diff --git a/docs/src/content/docs/clients/browser/answer.mdx b/docs/src/content/docs/clients/browser/answer.mdx new file mode 100644 index 0000000..bd28498 --- /dev/null +++ b/docs/src/content/docs/clients/browser/answer.mdx @@ -0,0 +1,38 @@ +--- +title: 'Browser: Peer Answer' +--- + +The answer client is used to respond to a remote client's offer. +The remote client will have sent an offer to the answer client, which will then respond with an answer. + +### Who is this for? + +- **dApps** that want to leverage liquid-auth to connect to other clients +- **Mobile Wallets** that want to tailor the onboarding and connect experience +- **Browser Wallets** that want to communicate with other clients + +### Request ID + +Answer clients are responsible for creating the request id. +Request IDs are given to the remote peer, usually as a deep-link encoded into a QR Code. +This ID is used by the remote peer to authenticate the current client. + +```typescript +import { SignalClient } from '@algorandfoundation/liquid-client'; +const requestId = SignalClient.generateRequestId(); +``` + +## Signaling + +```typescript +client + .peer(requestId, 'offer') + .then((dataChannel: RTCDataChannel)=>{ + // Handle the data channel + dataChannel.onmessage = (event: MessageEvent) => { + console.log(event.data) + } + }) +const blob = await client.qrCode() +// Display QR Code +``` diff --git a/docs/src/content/docs/clients/browser/authentication.md b/docs/src/content/docs/clients/browser/authentication.md new file mode 100644 index 0000000..563aeb0 --- /dev/null +++ b/docs/src/content/docs/clients/browser/authentication.md @@ -0,0 +1,35 @@ +--- +title: 'Browser: Authentication' +--- + +Authenticate an existing [Passkey](../../guides/concepts#passkeys) with the [Service](../../server/introduction). + +### Who is this for? + +- **dApps** logging back into the service without connecting to another client +- **Browser Wallets** that want to communicate with other clients + +## Client + +Sign in with an existing account using an instance of the `SignalClient` +```typescript +//app.ts +await client.assertion( + credentialId, // Some known credential ID + {requestId: 12345} // Optional requestId to link +) +``` + +## Stateless + +Using the stateless method without a `SignalClient` + +```typescript +//app.ts +import {assertion} from '@algorandfoundation/liquid-auth/assertion' +await assertion( + "https://my-liquid-service.com", + credentialId, // Some known credential ID + {requestId: 12345} // Optional requestId to link +) +``` diff --git a/docs/src/content/docs/clients/browser/example.md b/docs/src/content/docs/clients/browser/example.md new file mode 100644 index 0000000..63530fa --- /dev/null +++ b/docs/src/content/docs/clients/browser/example.md @@ -0,0 +1,64 @@ +--- +title: 'Browser: Example' +next: false +--- + +You can check the example in the GitHub repository for a working browser based application + + +## Answer Client +A dApp that wants a remote wallet to log into the service and create a peer-to-peer connection. +```typescript +import { SignalClient } from "@algorandfoundation/liquid-client"; +const client = new SignalClient(window.origin); + +const requestId = SignalClient.generateRequestId() // 12345 + +// Wait for the Offer Client to connect +client.peer(requestId, 'offer').then((dc)=>{ + // Handle Peer Messages + dc.onmessage = (event: MessageEvent) => { + console.log(event.data) + } + // Send Messages to Peer + dc.send('Hello World') +}) + +// Generate a QR Code +const qrData = await client.qrCode() +``` + +## Offer Client + +The remote browser-based wallet. This could be an extension or hybrid mobile application. + +```typescript +import * as nacl from 'tweetnacl' +import { SignalClient, toBase64URL } from "@algorandfoundation/liquid-client"; + +const requestId = 12345 // A known request ID from a Answer Client +const origin = "https://example.com" // Some known origin +const address = "encoded-address" // Some known address +const secretKey = new Uint8Array(32) // Some secret key + +// Sign in to the service with a new credential +await client.attestation(async (challenge: Uint8Array) => ({ + type: 'algorand', + requestId, + origin, + address, + signature: toBase64URL(nacl.sign.detached(challenge, secretKey)), + device: 'Demo Web Wallet' +})) + +// Wait for the Answer Client to connect +client.peer(requestId, 'answer').then((dc)=>{ + // Handle Peer Messages + dc.onmessage = (event: MessageEvent) => { + console.log(event.data) + } + // Send Messages to Peer + dc.send('Hello World') +}) +``` + diff --git a/docs/src/content/docs/clients/browser/introduction.mdx b/docs/src/content/docs/clients/browser/introduction.mdx new file mode 100644 index 0000000..069cf45 --- /dev/null +++ b/docs/src/content/docs/clients/browser/introduction.mdx @@ -0,0 +1,35 @@ +--- +title: "Browser: Introduction" +prev: false +--- +import {Aside} from "@astrojs/starlight/components"; + +The `SignalClient` is an EventEmitter interface +that can be used +to communicate with the [Service](../../server/introduction). +It's designed to facilitate authentication and peer-to-peer communications. +The interface is composed of methods that can be manually executed. + +## Install +```bash +npm install algorandfoundation/liquid-auth-js --save +```` + +## Get Started + + + +### Use-Wallet [WIP] +We recommend using [use-wallet](https://github.com/TxnLab/use-wallet) from [TxnLabs](https://www.txnlab.dev/). +Check back soon for more details. + +### Manual Integration + + + +```typescript +//app.ts +import {SignalClient} from '@algorandfoundation/liquid-client'; +const client = new SignalClient(window.origin); +``` + diff --git a/docs/src/content/docs/clients/browser/offer.mdx b/docs/src/content/docs/clients/browser/offer.mdx new file mode 100644 index 0000000..265af12 --- /dev/null +++ b/docs/src/content/docs/clients/browser/offer.mdx @@ -0,0 +1,48 @@ +--- +title: 'Browser: Peer Offer' +sidebar: + order: 3 + label: 'Peer Offer' +--- +import {Aside} from "@astrojs/starlight/components"; + + + +[Peer-to-Peer]() connections can only be done using the `SignalClient`. +Wallets are responsible for creating offers to connect. + +### Who is this for? + +- **Browser Wallets** that want to communicate with other clients + +## Signaling + +```typescript +import { SignalClient } from "@algorandfoundation/liquid-client"; +const client = new SignalClient("") + +// Receive the RequestID from the Peer willing to Answer this offer +const requestId = 12345 + +// Register or create a new credential, +// ensure the requestId is included in the call +// ... + +// Create the Peer Connection and await the remote client's answer +client.peer( + // Request ID from the Peer, + // usually displayed as a Deep Link or QR Code + requestId, + // Type of remote client + 'answer' +).then((dataChannel: RTCDataChannel) => { + // Handle the data channel + dataChannel.onmessage = (event: MessageEvent) => { + console.log(event.data) + } + dataChannel.send('Hello world!') +}) +``` diff --git a/docs/src/content/docs/clients/browser/registration.mdx b/docs/src/content/docs/clients/browser/registration.mdx new file mode 100644 index 0000000..be2a8f1 --- /dev/null +++ b/docs/src/content/docs/clients/browser/registration.mdx @@ -0,0 +1,64 @@ +--- +title: "Browser: Registration" +sidebar: + order: 1 +--- + +Register a [Passkey](../../guides/concepts#passkeys) with the [Service](../../server/introduction) and attest the knowledge of a KeyPair. + +### Who is this for? + +- **Browser Wallets** that want to communicate with the service and other clients + +## Client + +Creating a passkey and registering it with the service using an instance of the `SignalClient` + +```typescript +// browser.client.ts +import * as nacl from 'tweetnacl' +import {toBase64URL} from '@algorandfoundation/liquid-client/encoding' + +// Sign in to the service with a new credential and wallet +await client.attestation( + // Callback when a challenge is received, return a signed challenge + async (challenge: Uint8Array) => ({ + // The type of signature and public key + type: 'algorand', + // The address of the account + address: account.addr, + // The signature of the challenge, signed by the account + signature: toBase64URL(nacl.sign.detached(challenge, account.sk)), + // Optionally authenticate a remote peer + requestId: 12345, + // Optional device name + device: 'Demo Web Wallet' + }) +) + +``` + +## Stateless + +Creating a passkey without using the `SignalClient` + +```typescript +import {attestation} from '@algorandfoundation/liquid-client/attestation' +import {toBase64URL} from '@algorandfoundation/liquid-client/encoding' +await attestation( + "https://my-liquid-service.com", + // Callback when a challenge is received, return a signed challenge + async (challenge: Uint8Array) => ({ + // The type of signature and public key + type: 'algorand', + // The address of the account + address: account.addr, + // The signature of the challenge, signed by the account + signature: toBase64URL(nacl.sign.detached(challenge, account.sk)), + // Optionally authenticate a remote peer + requestId: 12345, + // Optional device name + device: 'Demo Web Wallet' + }) +) +``` diff --git a/docs/src/content/docs/guides/Passkey/authentication.mdx b/docs/src/content/docs/guides/Passkey/authentication.mdx new file mode 100644 index 0000000..13ba917 --- /dev/null +++ b/docs/src/content/docs/guides/Passkey/authentication.mdx @@ -0,0 +1,123 @@ +--- +title: Authentication Guide +sidebar: + order: 11 + label: Authentication + badge: + text: "WIP" + variant: caution +tags: + - Passkey + - Registration + - Android + - Browser + - Server +--- +import { Tabs, TabItem, Steps, Aside} from '@astrojs/starlight/components'; + +Authenticating with a previously created [Passkey](../../concepts#passkeys) is a three-step process. + + + 1. Fetch the **Request Options** from the [Server](../../../server/introduction). + 2. Retrieve the [Passkey](../../concepts#passkeys) using the **Request Options**. + 3. Post the **Assertion Response** from an authenticator to the [Server](../../../server/introduction). + + +## ⚙️ Options + +[PublicKeyCredentialRequestOptions](https://www.w3.org/TR/webauthn-2/#dictionary-assertion-options) are used +to retrieve existing Passkey and are generated by the service. +The URI for this request is [/assertion/request/:credId](../../../server/api/operations/assertioncontroller_request) +using the `POST` method. + + + + ```bash + export CRED_ID="AWwK7bcWvbQ4plHok9mOIzuMdDKmLTKog2mgqhe2X48C40ISsvt7xK9CJmjjWbWF7EnNVGxDPb51WHGfN1ac1_w" + curl -X POST \ + --header "Content-Type: application/json" \ + https://my-liquid-auth-service.com/attestation/request/$CRED_ID + ``` + + + ```typescript + //app.js + // TODO + ``` + See the [Browser](../../../clients/browser/registration) registration guide for more details. + + + ```kotlin + //app.kt + import foundation.algorand.auth.fido2.* + // TODO + ``` + See the [Android](../../../clients/android/registration) registration guide for more details. + + + +## 🎉 Retrieving + +Getting the existing Passkey from an authenticator can vary depending on the platform. +Most platforms will accept the **Request Options** +and return an [AuthenticatorAssertionResponse](https://developer.mozilla.org/en-US/docs/Web/API/AuthenticatorAssertionResponse). + + + + + ```typescript + //app.ts + const response: AuthenticatorAssertionResponse = await navigator.credentials.get({ + publicKey: options + }) + ``` + See the [Browser](../../../clients/browser/authentication) authentication guide for more details. + + + ```kotlin + //app.kt + // Retrieve the PublicKeyCredential from the + // FIDO2Client or CredentialManager + val credential = PublicKeyCredential() + ``` + See the [Android](../../../clients/android/authentication) authentication guide for more details. + + + +## 🚚 Response + +Registering a new Passkey with the service. +Prove the authenticity of the Passkey by sending the **Attestation Response** to the service. +The URI for this request is [/assertion/response](../../../server/api/operations/assertioncontroller_response) +using the `POST` method. + + + ```bash + # TODO + curl -X POST \ + --header "Content-Type: application/json" \ + --data '{"clientDataJSON": "", "extension"}' \ + https://my-liquid-auth-service.com/attestation/response + ``` + + + ```typescript + //app.ts + // TODO + ``` + See the [Browser](../../../clients/browser/authentication) authentication guide for more details. + + + ```kotlin + //app.kt + val response = attestationApi.postAssertionResponse( + origin, // Origin Server + "User-Agent-String", // Required for checking the authenticator fingerprint + credential // PublicKeyCredential + liquidExtension // Liquid Extension + ) + ``` + See the [Android](../../../clients/android/authentication) authentication guide for more details. + + + diff --git a/docs/src/content/docs/guides/Passkey/registration.mdx b/docs/src/content/docs/guides/Passkey/registration.mdx new file mode 100644 index 0000000..05705cf --- /dev/null +++ b/docs/src/content/docs/guides/Passkey/registration.mdx @@ -0,0 +1,130 @@ +--- +title: Registration Guide +sidebar: + order: 10 + badge: + text: "WIP" + variant: caution + label: Registration +tags: + - Passkey + - Registration + - Wallet + - Android + - Browser + - Server +--- +import { Tabs, TabItem, Steps, Aside} from '@astrojs/starlight/components'; + +Registering a [Passkey](../../concepts#passkeys) is a three-step process. + + + 1. Fetch the **Creation Options** from the [Server](../../../server/introduction). + 2. Create a new [Passkey](../../concepts#passkeys)() using the **Creation Options**. + 3. Post the **Attestation Response** from an authenticator to the [Server](../../../server/introduction). + + +## ⚙️ Options + + + +[PublicKeyCredentialCreationOptions](https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialCreationOptions) are used to create a new Passkey and are generated by the service. +This allows the service to define what options are required for registration. +The URI for this request is [/attestation/request](../../../server/api/operations/attestationcontroller_request) using the `POST` method. + + + + ```bash + curl -X POST \ + --header "Content-Type: application/json" \ + --data '{"extensions": {"liquid": true}}' \ + https://my-liquid-auth-service.com/attestation/request + ``` + + + ```typescript + //app.js + import { fetchAttestationRequest } from '@algorandfoundation/liquid-client/attestation' + const options = await fetchAttestationRequest("https://my-liquid-auth-service.com") + ``` + See the [Browser](../../../clients/browser/registration) registration guide for more details. + + + ```kotlin + //app.kt + import foundation.algorand.auth.fido2.* + // TODO + ``` + See the [Android](../../../clients/android/registration) registration guide for more details. + + + +## ✨ Creating + +Generating a new Passkey from an authenticator can vary depending on the platform. +Most platforms will accept the **Creation Options** and return an [AuthenticatorAttestationResponse](https://developer.mozilla.org/en-US/docs/Web/API/AuthenticatorAttestationResponse). + + + + + ```typescript + //app.ts + const response: AuthenticatorAttestationResponse = await navigator.credentials.create({ + publicKey: options + }) + ``` + See the [Browser](../../../clients/browser/registration) registration guide for more details. + + + ```kotlin + //app.kt + // Create a new PublicKeyCredential using + // FIDO2Client or CredentialManager + val credential = PublicKeyCredential() + ``` + See the [Android](../../../clients/android/registration) registration guide for more details. + + + +## 🚚 Response + + + +Registering a new Passkey with the service. +Prove the authenticity of the Passkey by sending the **Attestation Response** to the service. +The URI for this request is [/attestation/response](../../../server/api/operations/attestationcontroller_response) using the `POST` method. + + + + ```bash + # TODO + curl -X POST \ + --header "Content-Type: application/json" \ + --data '{"attestationResponse": "", "clientDataJSON": "", "extension"}' \ + https://my-liquid-auth-service.com/attestation/response + ``` + + + ```typescript + //app.ts + import { fetchAttestationResponse } from '@algorandfoundation/liquid-client/attestation' + // TODO + ``` + See the [Browser](../../../clients/browser/registration) registration guide for more details. + + + ```kotlin + //app.kt + val response = attestationApi.postAttestationResponse( + origin, // Origin Server + "User-Agent-String", // Required for checking the authenticator fingerprint + credential // PublicKeyCredential + liquidExtension // Liquid Extension + ) + ``` + See the [Android](../../../clients/android/registration) registration guide for more details. + + + diff --git a/docs/src/content/docs/guides/Peer to Peer/answer.mdx b/docs/src/content/docs/guides/Peer to Peer/answer.mdx new file mode 100644 index 0000000..06125e8 --- /dev/null +++ b/docs/src/content/docs/guides/Peer to Peer/answer.mdx @@ -0,0 +1,30 @@ +--- +title: "Answer Guide" +sidebar: + order: 21 + label: "Answer" + badge: + text: "WIP" + variant: caution +--- + +An **Answer** is a type of session that is initiated by a client +and is used to respond to an **Offer** from another client. +```mermaid +sequenceDiagram + participant A as Answer Client + participant B as Offer Client + B->>A: Offer + A->>B: Answer +``` + +## Peering + +TODO: add Tabs + +```typescript +// Wait for the Offer and send the Answer +client.peer(requestId, "offer").then((dc)=>{ + // Handle the Data Channel +}) +``` diff --git a/docs/src/content/docs/guides/Peer to Peer/offer.mdx b/docs/src/content/docs/guides/Peer to Peer/offer.mdx new file mode 100644 index 0000000..636a68b --- /dev/null +++ b/docs/src/content/docs/guides/Peer to Peer/offer.mdx @@ -0,0 +1,33 @@ +--- +title: "Offer Guide" +sidebar: + order: 20 + label: "Offer" + badge: + text: "WIP" + variant: caution +--- +import {Aside} from '@astrojs/starlight/components'; + + + +An **Offer** is a type of session that is initiated by a client +and is used to request an **Answer** from another client. +```mermaid +sequenceDiagram + participant A as Offer Client + participant B as Answer Client + A->>B: Offer + B->>A: Answer +``` + +## Peering + +TODO: add Tabs + +```typescript +// Send the Offer and wait for the Answer +client.peer(requestId, "answer").then((dc)=>{ + // Handle the Data Channel +}) +``` diff --git a/docs/src/content/docs/guides/components.mdx b/docs/src/content/docs/guides/components.mdx new file mode 100644 index 0000000..11f3392 --- /dev/null +++ b/docs/src/content/docs/guides/components.mdx @@ -0,0 +1,41 @@ +--- +title: Components +sidebar: + order: 1 +pagefind: false +--- +import { Aside } from '@astrojs/starlight/components'; + +### Server + + + +The responsibilities of the service are limited to authentication and brokering connections between peers. +Authentication is handled using [Passkeys](../concepts#passkeys) with a custom `Liquid Extension` +which attests an additional KeyPair (ie Algorand Account). +Once a client is authenticated, the service can be used to broker a [Peer to Peer](../concepts#peer-to-peer) connection. + + +#### Who should use this service? + +The service should be deployed by decentralized applications +that want to leverage `Passkeys` and `Signaling` between peers. + +#### Why should I deploy this service? + +The majority of communications on the internet are centralized. +**Liquid Auth Server** offloads communication from the server and allows for direct communication between peers. +Not only is this generally more secure and decentralized, it also reduces the load on the server. + + + +### Clients + + + +The **Liquid Auth Clients** are libraries that provide a simple way to interact with the service and other peers. +Clients use the service to authenticate and broker a connection between peers. + +#### Who should use the clients? + +The clients should be used by developers who want to integrate the **Liquid Auth Service** into their applications and wallets. diff --git a/docs/src/content/docs/guides/concepts.md b/docs/src/content/docs/guides/concepts.md new file mode 100644 index 0000000..07a7523 --- /dev/null +++ b/docs/src/content/docs/guides/concepts.md @@ -0,0 +1,42 @@ +--- +title: Key Concepts +sidebar: + order: 1 + badge: + text: "WIP" + variant: caution +--- + +There are a few key concepts that are important to understand when working with Liquid Auth. +The main concepts are `Linking`, `Passkeys`, and `Peer-to-Peer`. +See the full details in the [Architecture Reference](../../architecture). + +## Linking + +A link will authorize a remote client to access the service. This is done by generating a `RequestId` by the remote device and waiting +for a device to attest a Passkey. We recommend displaying a QR code with a [liquid deep-link]() to the user to scan with their device. + +See how to implement Linking in the [Android]() and [Browser]() client documentation + +## Passkeys + +Passkeys are also known as FIDO2/WebAuthn [PublicKeyCredential](https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredential). +This KeyPair is used to register or authenticate a user and is generated by an authenticator device. +Passkeys/Authenticators must also support the `Liquid Extension` which is used to attest a `KeyPair` not controlled by the authenticator. + +## Peer-to-Peer + +[WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) is used for establishing a peer-to-peer connection between two clients. + +#### Offer + +Session Description Protocol (SDP) message sent from the client to the server. The offer contains information about the client's media capabilities and information about the datachannel. + +#### Answer + +Session Description Protocol (SDP) message sent back to a client who created the Offer. +An Answer client can then use this information to generate an answer, which is sent back to the offer client. + +#### Candidate + +ICE Candidate is a network address that can be used to communicate with the peer. diff --git a/docs/src/content/docs/guides/getting-started.md b/docs/src/content/docs/guides/getting-started.md deleted file mode 100644 index b33618b..0000000 --- a/docs/src/content/docs/guides/getting-started.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Getting Started ---- - -Liquid Auth is a self-hosted authentication service that provides a simple way to associate Passkeys to KeyPair(s) commonly found in cryptocurrencies. - -## Running Locally - -The Android authenticator requires a secure connection, make sure to run the service behind a valid certificate. - -### SSL using [ngrok]() -```bash -ngrok http 3000 -``` - - -### Running the Service - -To run Liquid Auth locally, you can use the following command: - -``` -#run.sh -docker run -d -p 3000:3000 --env-file .docker.env liquid-auth:latest -``` - -#### Environment Variables -```env -#.docker.env - -# FIDO2 -RP_NAME= # e.g. Liquid dApp -HOSTNAME= # e.g. my-liquid-auth-service.com or .ngrok.io -ORIGIN= # e.g. https://my-liquid-auth-service.com or https://.ngrok.io - -# Database -DB_HOST= -DB_USERNAME= -DB_PASSWORD= -DB_NAME= -DB_ATLAS= - -# Events -REDIS_HOST= -REDIS_PORT= -REDIS_USERNAME= -REDIS_PASSWORD= -``` - -See more details about deployments in the [Server](/server/introduction) guide. \ No newline at end of file diff --git a/docs/src/content/docs/guides/getting-started.mdx b/docs/src/content/docs/guides/getting-started.mdx new file mode 100644 index 0000000..9b24322 --- /dev/null +++ b/docs/src/content/docs/guides/getting-started.mdx @@ -0,0 +1,22 @@ +--- +title: Getting Started +sidebar: + order: 0 +pagefind: false +--- +import { LinkCard, CardGrid, Aside } from '@astrojs/starlight/components'; + +Liquid Auth is composed of two main components, the **Liquid Auth Server** and the **Liquid Auth Clients**. +They are used together to provide authentication and signaling services for decentralized applications (dApps). + +## Quick Links + + + + + + diff --git a/docs/src/content/docs/guides/qr-code.md b/docs/src/content/docs/guides/qr-code.md new file mode 100644 index 0000000..f4f1c57 --- /dev/null +++ b/docs/src/content/docs/guides/qr-code.md @@ -0,0 +1,10 @@ +--- +title: "QR Code Guide" +sidebar: + label: "QR Code" + badge: + text: "TODO" + variant: danger +next: false +--- + diff --git a/docs/src/content/docs/guides/registration.md b/docs/src/content/docs/guides/registration.md deleted file mode 100644 index 097be0b..0000000 --- a/docs/src/content/docs/guides/registration.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Passkey Registration ---- - -The service has two endpoints for Passkey registration with the following schema from the [OpenApi documentation](/reference/api): - - - -- `POST /attestation/request` - Fetch PublicKeyCredentialCreationOptions -- `POST /attestation/response` - Register a new Passkey using an AuthenticatorAttestationResponse - - -**There are currently two clients available for the service:** - -### Android - -```kotlin -//MainActivity.kt -import foundation.algorand.auth.fido2.* - -class MainActivity { - private var httpClient = OkHttpClient.Builder() - .cookieJar(cookieJar) // Use Cookie jar to share cookies between requests - .build() - private var attestationApi = AttestationApi(httpClient) - - private fun onCreate(){ - val origin = "https://my-liquid-auth-service.com" - - val options = attestationApi.postAttestationOptions( - origin, // Origin Server - "User-Agent-String", // Required for checking the authenticator fingerprint - JSONObject() // Additional Request Options - ) - - // Handle the FIDO2 Intent in FIDO2Client or CredentialManager - // This is a simplified version of the code - val credential = PublicKeyCredential() - - val response = attestationApi.postAttestationResponse( - origin, // Origin Server - "User-Agent-String", // Required for checking the authenticator fingerprint - credential // PublicKeyCredential - ) - } - -} - -``` - -Find out more in the [kotlin client](/clients/typescript/attestation) documentation. - -### Browser - -```typescript -//app.ts -import {fetchAttestationRequest, fetchAttestationResponse} from '@liquid/auth-client'; - -const origin = 'https://my-liquid-auth-service.com'; -// Get Credential Options -const options = await fetchAttestationRequest(origin, { - userVerification: 'required', - extensions: { - liquid: true - } -}) - -// Create Credential -const credential = await navigator.credentials.create({ - publicKey: options -}); - -// Register Credential -const response = await fetchAttestationResponse(origin, credential) -``` -Find out more in the [typescript client](/clients/typescript/attestation) documentation. \ No newline at end of file diff --git a/docs/src/content/docs/introduction.md b/docs/src/content/docs/introduction.md index e5267a4..188c60b 100644 --- a/docs/src/content/docs/introduction.md +++ b/docs/src/content/docs/introduction.md @@ -1,7 +1,18 @@ --- title: Introduction description: Welcome to the Liquid Auth documentation. +pagefind: false --- -Liquid Auth is a service that provides authentication and authorization for your applications. -It is designed to be run in front or behind your application and can be used in a variety of ways. \ No newline at end of file +Liquid Auth aims to give the user full control over their data and privacy. +There are far too many services that act as a middle man between the end user and the wallet provider. + +By combining the security of FIDO2/WebAuthn with the decentralized nature of WebRTC, Liquid Auth provides a secure and private way for users to communicate. + + +## What is Liquid Auth? + +Liquid Auth is a self-hosted authentication service that provides a simple way to associate Passkeys to KeyPair(s) commonly found in cryptocurrencies. + +In addition to authentication, Liquid Auth provides a Peer to Peer signaling service. +Not only can you authenticate users, but you can also establish secure connections between them. diff --git a/docs/src/content/docs/reference/kotlin-api.md b/docs/src/content/docs/reference/kotlin-api.md deleted file mode 100644 index 6b45c29..0000000 --- a/docs/src/content/docs/reference/kotlin-api.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Android" ---- - -WIP diff --git a/docs/src/content/docs/reference/ts-api.md b/docs/src/content/docs/reference/ts-api.md deleted file mode 100644 index 3991594..0000000 --- a/docs/src/content/docs/reference/ts-api.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "TypeScript" ---- - -WIP diff --git a/docs/src/content/docs/server/environment-variables.md b/docs/src/content/docs/server/environment-variables.md new file mode 100644 index 0000000..ff3b5e1 --- /dev/null +++ b/docs/src/content/docs/server/environment-variables.md @@ -0,0 +1,75 @@ +--- +title: "Server: Configuration" +sidebar: + order: 2 + label: 'Configuration' +--- + +All configurations are set using environment variables. +Creating a `.env.docker` file is recommended to store all the environment variables required to run the server. + +The following sections describe the environment variables required to run the server. + +## Environment Variables + +Attestations and Assertions require a valid `RP_NAME`, `HOSTNAME`, and `ORIGIN` to be set. +`ORIGIN` and `HOSTNAME` must be set to a valid domain secured with HTTPS. + +```sh +RP_NAME= # Friendly name of the service +HOSTNAME= # Hostname of the service +ORIGIN=https:// # Origin of the service +``` + +If you are using a custom Android client, make sure to update the `SHA256` fingerprint. + +```bash +ANDROID_SHA256HASH=<00:00:...> # SHA256 fingerprint of the Android client +ANDROID_PACKAGENAME= # Package name of the Android client +``` + +Configuration for MongoDB + +```bash +DB_HOST= # Hostname of the MongoDB instance +DB_USERNAME= # Username for the MongoDB instance +DB_PASSWORD= # Password for the MongoDB instance +DB_NAME= # Database name +DB_ATLAS=false # Set to true if using MongoDB Atlas +``` + +Configuration for Redis + +```bash +REDIS_HOST= # Hostname of the Redis instance +REDIS_PORT= # Port for the Redis instance +REDIS_USERNAME= # Username for the Redis instance +REDIS_PASSWORD= # Password for the Redis instance +``` + +## Full Example + +```bash +# .env.docker + +# Database +DB_HOST=mongo:27017 +DB_USERNAME=algorand +DB_PASSWORD=algorand +DB_NAME=fido +DB_ATLAS=false + +# Events +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_USERNAME=default +REDIS_PASSWORD= + +# FIDO2 +RP_NAME="Auth Server" +HOSTNAME=my-static-domain.ngrok-free.app +ORIGIN=https://my-static-domain.ngrok-free.app + +ANDROID_SHA256HASH=47:CC:4E:EE:B9:50:59:A5:8B:E0:19:45:CA:0A:6D:59:16:F9:A9:C2:96:75:F8:F3:64:86:92:46:2B:7D:5D:5C +ANDROID_PACKAGENAME=foundation.algorand.demo +``` diff --git a/docs/src/content/docs/server/integrations.md b/docs/src/content/docs/server/integrations.md new file mode 100644 index 0000000..cbe7dfc --- /dev/null +++ b/docs/src/content/docs/server/integrations.md @@ -0,0 +1,90 @@ +--- +title: "Server: Integrations" +sidebar: + order: 3 + label: 'Integrations' + badge: + text: "WIP" + variant: caution +next: false +--- + +### Vite + +```typescript +//vite.config.ts + +const DEFAULT_PROXY_URL = 'http://localhost:3000'; +const DEFAULT_WSS_PROXY_URL = 'ws://localhost:3000'; +export default defineConfig({ + server: { + proxy: { + '^/auth/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL, + '^/.well-known/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL, + '^/attestation/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL, + '^/assertion/.*': process.env.PROXY_URL || DEFAULT_PROXY_URL, + '/socket.io': { + target: process.env.WSS_PROXY_SERVER || DEFAULT_WSS_PROXY_URL, + ws: true, + }, + } + }, +}) +``` + +### Nest.js[WIP] + +```javascript +//server.js +// import {AppModule} from '@algorandfoundation/liquid-auth-api' +``` + +### Next.js[WIP] + +```javascript +//next.config.js +// module.exports = { +// async rewrites() { +// return [ +// { +// source: '/blog', +// destination: 'https://acme.com/blog', +// }, +// ] +// }, +// } +``` + +### Express.js[WIP] + +```javascript +//server.js +// import {AppModule} from '@algorandfoundation/liquid-auth-api' +``` + +### Vercel[WIP] + +```json +//vercel.json +{ + "rewrites": [ + { + "source": "/blog", + "destination": "https://acme.com/blog" + } + ] +} +``` + +### Cloudflare[WIP] + +```toml +#wrangler.toml + +``` + +### NGINX [WIP] +```nginx +//default.conf +#todo Add Nginx proxy configuration +``` diff --git a/docs/src/content/docs/server/introduction.md b/docs/src/content/docs/server/introduction.md new file mode 100644 index 0000000..5c2be42 --- /dev/null +++ b/docs/src/content/docs/server/introduction.md @@ -0,0 +1,19 @@ +--- +title: 'Server: Introduction' +prev: false +sidebar: + order: 0 + label: 'Introduction' + badge: + text: "WIP" + variant: caution +--- + +Liquid Auth is a self-hosted authentication service that provides a simple way to associate Passkeys to KeyPair(s) commonly found in cryptocurrencies. + +#### Technical Details + +It is built using the [NestJS](https://nestjs.com/) framework +and uses [mongoose](https://docs.nestjs.com/techniques/mongodb) to interact with MongoDB. +Signaling is handled using [Socket.IO](https://docs.nestjs.com/websockets/gateways) +backed by a [Redis Adapter](https://socket.io/docs/v4/redis-adapter/). diff --git a/docs/src/content/docs/server/running-locally.md b/docs/src/content/docs/server/running-locally.md new file mode 100644 index 0000000..8c401bd --- /dev/null +++ b/docs/src/content/docs/server/running-locally.md @@ -0,0 +1,88 @@ +--- +title: 'Server: Running Locally' +sidebar: + order: 1 + label: "Running Locally" +--- + +The Liquid Auth service is distributed as a Docker image. FIDO2 and WebRTC require a secure connection, we recommend [using ngrok](#ngrok) to create a secure tunnel to your local server. +See the server [integrations](./integrations) guide for examples of how to add Liquid Auth to a web application. + +### Prerequisites + +[Install Docker]() and [login to the GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic). +```bash +export CR_PAT= +echo $CR_PAT | docker login ghcr.io -u --password-stdin +``` + +## Docker Image + +The service is designed to be run in a Docker container, it requires a [MongoDB]() and [Redis]() instance to be running. +See the [Environment Variables](../environment-variables) section for more information about crafting a `.env.docker` file. + +```bash +docker run -d --env-file .env.docker -p 3000:3000 ghcr.io/algorandfoundation/liquid-auth:develop +``` + +### Compose Example +> Example of using Docker Compose to run the Liquid Auth service. + +```yaml +#docker-compose.yml +services: + liquid-auth: + image: ghcr.io/algorandfoundation/liquid-auth:develop + env_file: + - .env.docker + ports: + - "3000:3000" + depends_on: + - redis + - mongo + redis: + image: redis + ports: + - "6379:6379" + mongo: + image: mongo:7.0 + environment: + - MONGO_INITDB_DATABASE=${DB_NAME:-fido} + - MONGO_INITDB_ROOT_USERNAME=${DB_USERNAME:-algorand} + - MONGO_INITDB_ROOT_PASSWORD=${DB_PASSWORD:-algorand} + ports: + - "27017:27017" + volumes: + - mongo:/data/db +volumes: + mongo: +``` + +### Building + +Optionally, create the Docker image locally from the source: + +```bash +git clone git@github.com:algorandfoundation/liquid-auth.git && cd liquid-auth +docker build -t my-amazing-liquid-auth:latest . +``` + +## NGROK + +Sign up for a free account at [ngrok](https://ngrok.com/) and follow the instructions to get your `` and ``. + +#### Configuration +ngrok will ask you to add your auth token to your configuration file. + +``` bash +ngrok config add-authtoken +``` + +It will then ask you to deploy your static domain, make sure to change the port to **3000** like this: + +``` bash +ngrok http --domain= 3000 +``` + + +Ensure the service's `ORIGIN` and `HOSTNAME` [environment variables](../environment-variables) are configured correctly with the ngrok domain. diff --git a/docs/src/styles/mermaid.css b/docs/src/styles/mermaid.css new file mode 100644 index 0000000..67abc5b --- /dev/null +++ b/docs/src/styles/mermaid.css @@ -0,0 +1,4 @@ +svg[aria-roledescription="sequence"] { + border-radius: 25px; + background-color: white; +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 77da9dd..69b4fc1 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -1,3 +1,8 @@ { - "extends": "astro/tsconfigs/strict" -} \ No newline at end of file + "extends": "astro/tsconfigs/strict", + "exclude": ["./clients/**/*"], + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "react" + } +}