diff --git a/package.json b/package.json
index 1e8ee9c1..6aac8f68 100644
--- a/package.json
+++ b/package.json
@@ -3,8 +3,8 @@
"version": "0.0.0-alpha.97",
"private": true,
"scripts": {
- "dev": "cross-env turbo dev --filter '!graphql-debugger' --filter '!@graphql-debugger/landing-page-app' --filter '!@graphql-debugger/landing-page-server' --concurrency=30",
- "build": "turbo build",
+ "dev": "cross-env turbo dev --filter '!graphql-debugger' --filter '!@graphql-debugger/landing-page-app' --filter '!@graphql-debugger/landing-page-server' --filter '!@graphql-debugger/vscode-ui' --concurrency=30",
+ "build": "turbo build ",
"release": "cross-env DEBUG=\"@graphql-debugger:*\" node ./packages/utils/build/release.js",
"test:sequential": "pnpm recursive exec -- sh -c 'pnpm run test || (echo \"Tests failed!\" && exit 1)'",
"test": "turbo test",
diff --git a/packages/graphql-schema/src/index.ts b/packages/graphql-schema/src/index.ts
index 49e5bd09..ca4f2e1c 100644
--- a/packages/graphql-schema/src/index.ts
+++ b/packages/graphql-schema/src/index.ts
@@ -13,3 +13,5 @@ export function createServer({ client }: { client: DebuggerClient }) {
context: context({ client }),
});
}
+
+export { createSchema };
diff --git a/plugins/vscode/extension/.vscode/extensions.json b/plugins/vscode/extension/.vscode/extensions.json
new file mode 100644
index 00000000..ed906795
--- /dev/null
+++ b/plugins/vscode/extension/.vscode/extensions.json
@@ -0,0 +1,6 @@
+{
+ "recommendations": [
+ "dbaeumer.vscode-eslint",
+ "ms-vscode.extension-test-runner"
+ ]
+}
diff --git a/plugins/vscode/extension/.vscode/launch.json b/plugins/vscode/extension/.vscode/launch.json
new file mode 100644
index 00000000..ba6ff76c
--- /dev/null
+++ b/plugins/vscode/extension/.vscode/launch.json
@@ -0,0 +1,13 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "args": ["--extensionDevelopmentPath=${workspaceFolder}"],
+ "outFiles": ["${workspaceFolder}/out/**/*.js"],
+ "preLaunchTask": "${defaultBuildTask}"
+ }
+ ]
+}
diff --git a/plugins/vscode/extension/.vscode/settings.json b/plugins/vscode/extension/.vscode/settings.json
new file mode 100644
index 00000000..0d55a330
--- /dev/null
+++ b/plugins/vscode/extension/.vscode/settings.json
@@ -0,0 +1,9 @@
+{
+ "files.exclude": {
+ "out": false
+ },
+ "search.exclude": {
+ "out": true
+ },
+ "typescript.tsc.autoDetect": "off"
+}
diff --git a/plugins/vscode/extension/.vscode/tasks.json b/plugins/vscode/extension/.vscode/tasks.json
new file mode 100644
index 00000000..34edf970
--- /dev/null
+++ b/plugins/vscode/extension/.vscode/tasks.json
@@ -0,0 +1,18 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
diff --git a/plugins/vscode/extension/.vscodeignore b/plugins/vscode/extension/.vscodeignore
new file mode 100644
index 00000000..72aa0fe2
--- /dev/null
+++ b/plugins/vscode/extension/.vscodeignore
@@ -0,0 +1,11 @@
+.vscode/**
+.vscode-test/**
+src/**
+.gitignore
+.yarnrc
+vsc-extension-quickstart.md
+**/tsconfig.json
+**/.eslintrc.json
+**/*.map
+**/*.ts
+**/.vscode-test.*
diff --git a/plugins/vscode/extension/README.md b/plugins/vscode/extension/README.md
new file mode 100644
index 00000000..b7059ef4
--- /dev/null
+++ b/plugins/vscode/extension/README.md
@@ -0,0 +1,13 @@
+# @graphql-debugger/vscode-extension
+
+- [graphql-debugger.com](http://www.graphql-debugger.com)
+
+[](https://badge.fury.io/js/@graphql-debugger%2Fvscode-extension) [](https://opensource.org/licenses/MIT)
+
+## About
+
+VSCode extension for GraphQL Debugger. Download the extension from the VSCode Marketplace.
+
+## License
+
+MIT - Rocket Connect - https://github.com/rocket-connect
diff --git a/plugins/vscode/extension/package.json b/plugins/vscode/extension/package.json
new file mode 100644
index 00000000..2ccd3aa9
--- /dev/null
+++ b/plugins/vscode/extension/package.json
@@ -0,0 +1,68 @@
+{
+ "name": "@graphql-debugger/vscode-extension",
+ "displayName": "GraphQL Debugger",
+ "description": "Debug your GraphQL server",
+ "engines": {
+ "vscode": "^1.86.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [],
+ "version": "0.0.0-alpha.97",
+ "main": "./out/extension.js",
+ "files": [
+ "out"
+ ],
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/rocket-connect/graphql-debugger.git"
+ },
+ "homepage": "https://github.com/rocket-connect/graphql-debugger#readme",
+ "contributes": {
+ "commands": [
+ {
+ "command": "graphql-debugger.openPanel",
+ "title": "Open GraphQL Debugger"
+ }
+ ],
+ "menus": {
+ "editor/title": [
+ {
+ "when": "resourceLangId == graphql",
+ "command": "graphql-debugger.openPanel",
+ "group": "navigation"
+ }
+ ]
+ }
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "build": "tsc -p ./ && npx ts-node ./src/print-schema-for-debugging.ts",
+ "watch": "tsc -watch -p ./",
+ "pretest": "npm run compile && npm run lint",
+ "lint": "eslint src --ext ts",
+ "test": "vscode-test"
+ },
+ "peerDependencies": {
+ "graphql": "^16.0.0 || ^17.0.0"
+ },
+ "dependencies": {
+ "@graphql-debugger/vscode-ui": "workspace:^",
+ "@graphql-debugger/adapter-proxy": "workspace:^",
+ "@graphql-debugger/client": "workspace:^",
+ "@graphql-debugger/trace-schema": "workspace:^",
+ "@graphql-debugger/utils": "workspace:^",
+ "@graphql-debugger/graphql-schema": "workspace:^",
+ "@graphql-tools/schema": "10.0.2",
+ "@graphql-tools/utils": "10.0.13"
+ },
+ "devDependencies": {
+ "@types/vscode": "1.86.0",
+ "@vscode/test-cli": "0.0.4",
+ "@vscode/test-electron": "2.3.9",
+ "typescript": "5.3.3",
+ "ts-node": "10.9.2"
+ }
+}
diff --git a/plugins/vscode/extension/src/extension.ts b/plugins/vscode/extension/src/extension.ts
new file mode 100644
index 00000000..1746b08f
--- /dev/null
+++ b/plugins/vscode/extension/src/extension.ts
@@ -0,0 +1,129 @@
+import { ProxyAdapter } from "@graphql-debugger/adapter-proxy";
+import { traceSchema } from "@graphql-debugger/trace-schema";
+import { hashSchema } from "@graphql-debugger/utils";
+
+import fs from "fs";
+import { buildSchema } from "graphql";
+import * as vscode from "vscode";
+
+export function activate(context: vscode.ExtensionContext) {
+ const adapter = new ProxyAdapter();
+
+ const disposable = vscode.commands.registerCommand(
+ "graphql-debugger.openPanel",
+ async () => {
+ const panel = vscode.window.createWebviewPanel(
+ "graphqlDebugger",
+ "GraphQL Debugger",
+ vscode.ViewColumn.Beside,
+ {
+ enableScripts: true,
+ localResourceRoots: [
+ vscode.Uri.parse("http://localhost:16686"),
+ vscode.Uri.joinPath(
+ context.extensionUri,
+ "node_modules",
+ "@graphql-debugger",
+ "vscode-ui",
+ "build",
+ ),
+ ],
+ },
+ );
+
+ const editor = vscode.window.activeTextEditor;
+
+ if (editor) {
+ const document = await vscode.workspace.openTextDocument(
+ editor.document.uri,
+ );
+
+ const text = document.getText();
+ const schema = buildSchema(text);
+
+ const tracedSchema = traceSchema({ schema, adapter });
+ const hash = hashSchema(tracedSchema);
+ let schemaid: string | undefined = undefined;
+
+ try {
+ const debuggerSchema = await adapter.schema.findFirst({
+ where: {
+ hash,
+ },
+ });
+
+ schemaid = debuggerSchema?.id;
+ } catch (e) {
+ console.error(e);
+ vscode.window.showInformationMessage(`Error finding schema: ${e}`);
+ }
+
+ if (!schemaid) {
+ vscode.window.showInformationMessage("Schema not found.");
+ }
+
+ panel.webview.html = getWebviewContent(
+ context,
+ panel.webview,
+ schemaid as string,
+ );
+ }
+ },
+ );
+
+ context.subscriptions.push(disposable);
+}
+
+function getWebviewContent(
+ context: vscode.ExtensionContext,
+ webview: vscode.Webview,
+ schemaId: string,
+) {
+ const indexPath = vscode.Uri.joinPath(
+ context.extensionUri,
+ "node_modules",
+ "@graphql-debugger",
+ "vscode-ui",
+ "build",
+ "index.html",
+ );
+ let html = fs.readFileSync(indexPath.fsPath, "utf8");
+
+ html = html.replace(/(href|src)="([^"]*)"/g, (match, p1, p2) => {
+ const assetPath = vscode.Uri.joinPath(
+ context.extensionUri,
+ "node_modules",
+ "@graphql-debugger",
+ "vscode-ui",
+ "build",
+ p2,
+ );
+ const assetUri = webview.asWebviewUri(assetPath);
+ return `${p1}="${assetUri}"`;
+ });
+
+ const nonce = getNonce();
+
+ const scriptToSetSchemaId = ``;
+
+ html = html.replace(
+ /
/,
+ `
`,
+ );
+
+ html = html.replace("", `${scriptToSetSchemaId}`);
+
+ return html;
+}
+
+function getNonce() {
+ let text = "";
+ const possible =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ for (let i = 0; i < 32; i++) {
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
+ }
+ return text;
+}
+
+export function deactivate() {}
diff --git a/plugins/vscode/extension/src/print-schema-for-debugging.ts b/plugins/vscode/extension/src/print-schema-for-debugging.ts
new file mode 100644
index 00000000..69429300
--- /dev/null
+++ b/plugins/vscode/extension/src/print-schema-for-debugging.ts
@@ -0,0 +1,28 @@
+import { DebuggerClient } from "@graphql-debugger/client";
+import { createSchema } from "@graphql-debugger/graphql-schema";
+import { traceSchema } from "@graphql-debugger/trace-schema";
+
+import fs from "fs";
+import { printSchema } from "graphql";
+import path from "path";
+
+const printPath = path.join(__dirname, "../", "out/", "schema.gql");
+
+// Prints the development schema in this package for dev usage
+// Run `pnpm run dev` at the root of the monorepo to run debugger in debug mode
+// Run the development version of the extension using F5 or the "Run Extension" command
+// Open this schema file and it will trigger the extension
+async function printSchemaForDebugging() {
+ const client = new DebuggerClient();
+ const { schema } = createSchema({ client });
+
+ const tracedSchema = traceSchema({ schema, adapter: client.adapter });
+
+ const printed = printSchema(tracedSchema);
+
+ await fs.promises.writeFile(printPath, printed);
+
+ process.exit(0);
+}
+
+printSchemaForDebugging();
diff --git a/plugins/vscode/extension/tsconfig.json b/plugins/vscode/extension/tsconfig.json
new file mode 100644
index 00000000..07651fee
--- /dev/null
+++ b/plugins/vscode/extension/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "extends": "@tsconfig/node18/tsconfig.json",
+ "compilerOptions": {
+ "module": "Node16",
+ "target": "ES2022",
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "skipLibCheck": true,
+ "outDir": "out",
+ "declarationMap": true,
+ "declaration": true,
+ "rootDir": "./src/",
+ },
+ "exclude": ["tests/"],
+ "include": ["src/**/*"],
+}
diff --git a/plugins/vscode/extension/vsc-extension-quickstart.md b/plugins/vscode/extension/vsc-extension-quickstart.md
new file mode 100644
index 00000000..e69de29b
diff --git a/plugins/vscode/ui/README.md b/plugins/vscode/ui/README.md
new file mode 100644
index 00000000..38ac85a4
--- /dev/null
+++ b/plugins/vscode/ui/README.md
@@ -0,0 +1,13 @@
+# @graphql-debugger/vscode-ui
+
+[](https://badge.fury.io/js/@graphql-debugger%2F/vscode-ui) [](https://opensource.org/licenses/MIT)
+
+[graphql-debugger.com](http://www.graphql-debugger.com)
+
+## About
+
+This is the user interface for the GraphQL Debugger VSCode Extension.
+
+## License
+
+MIT - Rocket Connect - https://github.com/rocket-connect
diff --git a/plugins/vscode/ui/package.json b/plugins/vscode/ui/package.json
new file mode 100644
index 00000000..446f1c20
--- /dev/null
+++ b/plugins/vscode/ui/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "@graphql-debugger/vscode-ui",
+ "version": "0.0.0-alpha.97",
+ "main": "./src/index.ts",
+ "types": "./src/index.ts",
+ "files": [
+ "build",
+ "src",
+ "public"
+ ],
+ "scripts": {
+ "build": "cross-env NODE_ENV=production webpack --config webpack.config.js",
+ "dev": "cross-env NODE_ENV=development webpack serve",
+ "test": "jest"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/rocket-connect/graphql-debugger.git"
+ },
+ "homepage": "https://github.com/rocket-connect/graphql-debugger#readme",
+ "peerDependencies": {
+ "graphql": "^16.0.0 || ^17.0.0"
+ },
+ "dependencies": {
+ "@graphql-debugger/adapter-proxy": "workspace:^",
+ "@graphql-debugger/utils": "workspace:^",
+ "@graphql-debugger/client": "workspace:^",
+ "@graphql-debugger/ui": "workspace:^",
+ "@fontsource/roboto": "5.0.8",
+ "@tanstack/react-query": "5.13.4",
+ "clsx": "2.0.0",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
+ "react-router-dom": "6.21.2",
+ "tailwind-merge": "2.2.0",
+ "zustand": "4.5.0"
+ },
+ "devDependencies": {
+ "@graphql-debugger/types": "workspace:^"
+ },
+ "engines": {
+ "node": ">=18",
+ "pnpm": ">=8"
+ }
+}
diff --git a/plugins/vscode/ui/postcss.config.js b/plugins/vscode/ui/postcss.config.js
new file mode 100644
index 00000000..12a703d9
--- /dev/null
+++ b/plugins/vscode/ui/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/plugins/vscode/ui/public/.gitkeep b/plugins/vscode/ui/public/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/plugins/vscode/ui/src/app.tsx b/plugins/vscode/ui/src/app.tsx
new file mode 100644
index 00000000..e1822194
--- /dev/null
+++ b/plugins/vscode/ui/src/app.tsx
@@ -0,0 +1,34 @@
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+
+import { Home } from "./components/home";
+import { ClientProvider } from "./context/client";
+import { ConfigProvider } from "./context/config";
+import { SchemasProvider } from "./context/schemas";
+import { useTheme } from "./hooks/useTheme";
+
+export function App() {
+ const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ refetchOnWindowFocus: false,
+ staleTime: 100_000,
+ networkMode: "offlineFirst",
+ },
+ },
+ });
+ useTheme();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/plugins/vscode/ui/src/components/editor.tsx b/plugins/vscode/ui/src/components/editor.tsx
new file mode 100644
index 00000000..27e8ed3f
--- /dev/null
+++ b/plugins/vscode/ui/src/components/editor.tsx
@@ -0,0 +1,38 @@
+import { Query } from "@graphql-debugger/ui/src/components/trace/editor/query";
+import { Variables } from "@graphql-debugger/ui/src/components/trace/editor/variables";
+
+import { useQuery } from "@tanstack/react-query";
+import { useContext } from "react";
+
+import { ClientContext } from "../context/client";
+
+export function Editor(props: React.PropsWithChildren<{ traceId?: string }>) {
+ const { client } = useContext(ClientContext);
+
+ const { data: trace } = useQuery({
+ queryKey: ["singleTrace", props.traceId],
+ queryFn: async () => {
+ if (!props.traceId) {
+ return [];
+ }
+
+ const trace = await client.trace.findMany({
+ where: {
+ id: props.traceId,
+ },
+ includeRootSpan: true,
+ });
+
+ return trace;
+ },
+ select: (data) => data[0],
+ networkMode: "always",
+ });
+
+ return (
+
+
+
+
+ );
+}
diff --git a/plugins/vscode/ui/src/components/home.tsx b/plugins/vscode/ui/src/components/home.tsx
new file mode 100644
index 00000000..d3583c1a
--- /dev/null
+++ b/plugins/vscode/ui/src/components/home.tsx
@@ -0,0 +1,35 @@
+import { useContext, useEffect } from "react";
+
+import { SchemasContext } from "../context/schemas";
+import { Trace } from "./trace";
+
+export function Home() {
+ const schemaId = localStorage.getItem("SCHEMA_ID");
+ const schemaContext = useContext(SchemasContext);
+
+ useEffect(() => {
+ if (!schemaContext) {
+ return;
+ }
+
+ if (schemaId) {
+ const schema = schemaContext.schemas.find(
+ (schema) => schema.id === schemaId,
+ );
+ if (schema) {
+ schemaContext.setSelectedSchema(schema);
+ }
+ }
+ }, [schemaContext, schemaId]);
+
+ return (
+
+ );
+}
diff --git a/plugins/vscode/ui/src/components/schema-traces.tsx b/plugins/vscode/ui/src/components/schema-traces.tsx
new file mode 100644
index 00000000..0d68d86d
--- /dev/null
+++ b/plugins/vscode/ui/src/components/schema-traces.tsx
@@ -0,0 +1,114 @@
+import { Spinner } from "@graphql-debugger/ui/src/components/utils/spinner";
+import {
+ getTraceStart,
+ isTraceError,
+ sumTraceTime,
+} from "@graphql-debugger/utils";
+
+import { useQuery } from "@tanstack/react-query";
+import React, { useContext } from "react";
+
+import { ClientContext } from "../context/client";
+
+export function SchemaTraces(
+ props: React.PropsWithChildren<{
+ schemaId: string;
+ traceId?: string;
+ setTraceId: (id: string) => void;
+ }>,
+) {
+ const { client } = useContext(ClientContext);
+
+ const { data: traces, isLoading } = useQuery({
+ queryKey: ["traces", props.schemaId, props.traceId],
+ queryFn: async () => {
+ const traces = await client.trace.findMany({
+ where: {
+ schemaId: props.schemaId,
+ },
+ includeRootSpan: true,
+ includeSpans: true,
+ });
+
+ return traces;
+ },
+ });
+
+ return (
+
+
+
+
Traces
+
List of the latest GraphQL queries.
+
+
+
+
+
+ {isLoading ? (
+
+
+
+ ) : (
+ <>
+ {traces?.length === 0 ? (
+
+ ) : (
+
+
+
+ Name |
+ Duration |
+ Start |
+
+
+
+
+ {traces?.map((trace) => {
+ const startTimeUnixNano = getTraceStart(trace);
+ const traceDurationUnixNano =
+ trace && sumTraceTime(trace);
+
+ const traceDurationSIUnits =
+ traceDurationUnixNano?.toSIUnits();
+
+ const { value, unit } = traceDurationSIUnits;
+
+ const isError = isTraceError(trace);
+
+ return (
+ props.setTraceId(trace.id)}
+ data-traceid={trace?.id}
+ key={trace.id}
+ className={`border-b-2 border-b-accent text-neutral hover:cursor-pointer`}
+ >
+
+ {trace.rootSpan?.name}
+ |
+ {`${value.toFixed(
+ 2,
+ )} ${unit}`} |
+
+ {startTimeUnixNano.formatUnixNanoTimestamp()}
+ |
+
+ );
+ })}
+
+
+ )}
+ >
+ )}
+
+
+
+ );
+}
diff --git a/plugins/vscode/ui/src/components/span.tsx b/plugins/vscode/ui/src/components/span.tsx
new file mode 100644
index 00000000..b22f774f
--- /dev/null
+++ b/plugins/vscode/ui/src/components/span.tsx
@@ -0,0 +1,87 @@
+import { UnixNanoTimeStamp } from "@graphql-debugger/time";
+import { cn } from "@graphql-debugger/ui/src/utils/cn";
+import { RenderTree } from "@graphql-debugger/ui/src/utils/create-tree-data";
+import { isSpanError } from "@graphql-debugger/utils";
+
+export function Span({
+ data,
+ minTimestamp,
+ maxTimestamp,
+}: {
+ data: RenderTree;
+ minTimestamp: UnixNanoTimeStamp;
+ maxTimestamp: UnixNanoTimeStamp;
+}) {
+ const durationNano = UnixNanoTimeStamp.fromString(data.durationNano);
+ const startTimeUnixNano = UnixNanoTimeStamp.fromString(
+ data.startTimeUnixNano,
+ );
+
+ const { width, offset } = durationNano.calculateWidthAndOffset(
+ startTimeUnixNano,
+ minTimestamp,
+ maxTimestamp,
+ );
+
+ const { value, unit } = durationNano.toSIUnits();
+
+ const displyInfo = (
+
+
+ {data.name}
+
+ {" - "}
+
+ {Number(value).toFixed(2)} {unit}
+
+ {data.isForeign && (
+
+ {" "}
+ - (unknown)
+
+ )}
+
+ );
+
+ return (
+
+
+
+
+ {Array.isArray(data.children)
+ ? data.children.map((child) => (
+
+ ))
+ : null}
+
+
+ );
+}
diff --git a/plugins/vscode/ui/src/components/trace-viewer.tsx b/plugins/vscode/ui/src/components/trace-viewer.tsx
new file mode 100644
index 00000000..ae6cd473
--- /dev/null
+++ b/plugins/vscode/ui/src/components/trace-viewer.tsx
@@ -0,0 +1,45 @@
+import { UnixNanoTimeStamp } from "@graphql-debugger/time";
+import type { Span as TSpan, Trace } from "@graphql-debugger/types";
+import { createTreeData } from "@graphql-debugger/ui/src/utils/create-tree-data";
+
+import { Span } from "./span";
+
+function TraceView({ id, spans }: { id?: string; spans: TSpan[] }) {
+ const treeData = createTreeData(spans);
+
+ const minTimestamp = UnixNanoTimeStamp.earliest(
+ spans.map((t) => UnixNanoTimeStamp.fromString(t.startTimeUnixNano)),
+ );
+ const maxTimestamp = UnixNanoTimeStamp.latest(
+ spans.map((t) => UnixNanoTimeStamp.fromString(t.endTimeUnixNano)),
+ );
+
+ return (
+
+ {treeData.map((treeItem) => (
+
+ ))}
+
+ );
+}
+
+export function TraceViewer({ trace }: { trace?: Trace }) {
+ const spans = trace?.spans || [];
+
+ return (
+
+ {trace?.rootSpan ? (
+
+ ) : (
+
+ )}
+
+ );
+}
diff --git a/plugins/vscode/ui/src/components/trace.tsx b/plugins/vscode/ui/src/components/trace.tsx
new file mode 100644
index 00000000..ee5430e8
--- /dev/null
+++ b/plugins/vscode/ui/src/components/trace.tsx
@@ -0,0 +1,53 @@
+import { useQuery } from "@tanstack/react-query";
+import React, { useContext } from "react";
+
+import { ClientContext } from "../context/client";
+import { Editor } from "./editor";
+import { SchemaTraces } from "./schema-traces";
+import { TraceViewer } from "./trace-viewer";
+
+export function Trace(
+ props: React.PropsWithChildren<{
+ schemaId: string;
+ }>,
+) {
+ const { client } = useContext(ClientContext);
+ const [traceId, setTraceId] = React.useState
();
+
+ const { data: trace } = useQuery({
+ queryKey: ["singleTrace", props.schemaId, traceId],
+ queryFn: async () => {
+ if (!props.schemaId && !traceId) {
+ return [];
+ }
+
+ const trace = await client.trace.findMany({
+ where: {
+ id: traceId,
+ schemaId: props.schemaId,
+ },
+ includeRootSpan: true,
+ includeSpans: true,
+ });
+
+ return trace;
+ },
+ select: (data) => data[0],
+ networkMode: "always",
+ });
+
+ return (
+
+
+
+
+
+ setTraceId(id)}
+ />
+
+
+
+ );
+}
diff --git a/plugins/vscode/ui/src/config.ts b/plugins/vscode/ui/src/config.ts
new file mode 100644
index 00000000..9db41b8e
--- /dev/null
+++ b/plugins/vscode/ui/src/config.ts
@@ -0,0 +1,2 @@
+export const API_URL = process.env.API_URL || "http://localhost:16686";
+export const SCHEMA_ID = localStorage.getItem("SCHEMA_ID");
diff --git a/plugins/vscode/ui/src/context/client.tsx b/plugins/vscode/ui/src/context/client.tsx
new file mode 100644
index 00000000..f8cab459
--- /dev/null
+++ b/plugins/vscode/ui/src/context/client.tsx
@@ -0,0 +1 @@
+export * from "@graphql-debugger/ui/src/context/client";
diff --git a/plugins/vscode/ui/src/context/config.tsx b/plugins/vscode/ui/src/context/config.tsx
new file mode 100644
index 00000000..245d3847
--- /dev/null
+++ b/plugins/vscode/ui/src/context/config.tsx
@@ -0,0 +1,29 @@
+import { ReactNode, createContext, useState } from "react";
+
+export interface ConfigContextProps {
+ apiURL: string;
+}
+
+export const ConfigContext = createContext(
+ undefined,
+);
+
+export function ConfigProvider({
+ children,
+}: {
+ children: ReactNode;
+}): JSX.Element {
+ const [apiURL] = useState(
+ localStorage.getItem("apiURL") || "http://localhost:16686",
+ );
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/plugins/vscode/ui/src/context/schemas.tsx b/plugins/vscode/ui/src/context/schemas.tsx
new file mode 100644
index 00000000..7a1c96f2
--- /dev/null
+++ b/plugins/vscode/ui/src/context/schemas.tsx
@@ -0,0 +1,62 @@
+import { Schema } from "@graphql-debugger/types";
+
+import { useQuery } from "@tanstack/react-query";
+import React from "react";
+import {
+ ReactNode,
+ createContext,
+ useCallback,
+ useContext,
+ useRef,
+} from "react";
+
+import { ClientContext } from "./client";
+
+export interface SchemasContextProps {
+ schemas: Schema[];
+ isLoading?: boolean;
+ schemaRef: React.MutableRefObject;
+ setSelectedSchema: (schema: Schema | undefined) => void;
+}
+
+export const SchemasContext = createContext(
+ undefined,
+);
+
+export function SchemasProvider({
+ children,
+}: {
+ children: ReactNode;
+}): JSX.Element {
+ const schemaRef = useRef();
+ const { client } = useContext(ClientContext);
+
+ const getSchemas = useQuery({
+ queryKey: ["schemas"],
+ queryFn: async () => await client.schema.findMany({}),
+ refetchInterval: 5000,
+ });
+
+ const setSelectedSchema = useCallback(
+ (schema: Schema | undefined) => {
+ schemaRef.current = schema;
+
+ // This will trigger a re-render
+ getSchemas.refetch();
+ },
+ [getSchemas],
+ );
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/plugins/vscode/ui/src/hooks/useTheme.tsx b/plugins/vscode/ui/src/hooks/useTheme.tsx
new file mode 100644
index 00000000..f986c09e
--- /dev/null
+++ b/plugins/vscode/ui/src/hooks/useTheme.tsx
@@ -0,0 +1,26 @@
+import { useEffect } from "react";
+
+import { useThemeStore } from "../store/useThemeStore";
+import { THEME_TYPE } from "../utils/constants";
+
+export const useTheme = () => {
+ const { theme, toggleTheme } = useThemeStore();
+
+ const handleSystemPreference = (event: MediaQueryListEvent) => {
+ toggleTheme(event.matches ? THEME_TYPE.dark : THEME_TYPE.light);
+ };
+
+ useEffect(() => {
+ const htmlTag = document.documentElement;
+ const systemPreference = window.matchMedia("(prefers-color-scheme: dark");
+
+ htmlTag.setAttribute("data-theme", theme);
+
+ systemPreference.addEventListener("change", handleSystemPreference);
+
+ return () => {
+ systemPreference.removeEventListener("change", handleSystemPreference);
+ };
+ //eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [theme]);
+};
diff --git a/plugins/vscode/ui/src/index.css b/plugins/vscode/ui/src/index.css
new file mode 100644
index 00000000..113cc302
--- /dev/null
+++ b/plugins/vscode/ui/src/index.css
@@ -0,0 +1,63 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+.custom-scrollbar {
+ @apply [&::-webkit-scrollbar]:w-0;
+}
+
+body {
+ font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+@layer base {
+ :root {
+ /** Background Colors*/
+ --primary-background: 210 40% 98%;
+ --secondary-background: 214 20% 93%;
+
+ /** Accent Colors*/
+ --accent: 218 28% 32% / 0.15;
+
+ /** Text Colors*/
+
+ --neutral: 218 28% 32%;
+ --pink: 320 95% 43%;
+ --purple: 242 51% 61%;
+ --blue: 208 100 46%;
+ --ochre: 36 79% 47%;
+ --red: 0 84% 60%;
+ --dark-green: 114 56% 33%;
+ --light-green: 158 60% 42%;
+ }
+
+ html[data-theme="dark"] {
+ /** Background Colors*/
+ --primary-background: 217 25% 18%;
+ --secondary-background: 217 26% 13%;
+
+ /** Accent Colors*/
+ --accent: 218 26% 37% / 0.3;
+
+ /** Text Colors*/
+ --neutral: 219 29% 78%;
+ --pink: 320 95% 43%;
+ --purple: 242 100% 77%;
+ --blue: 208 100% 72%;
+ --ochre: 36 79% 47%;
+ --red: 0 84% 60%;
+ --dark-green: 114 56% 33%;
+ --light-green: 157 59% 41%;
+ }
+}
+
+/**
+ Workaround for disappearing toaster messages. Limit is 1 toaster at a time.
+ reference: https://github.com/timolins/react-hot-toast/issues/31
+*/
+.toaster-wrapper > div {
+ display: none !important;
+}
+.toaster-wrapper > div:nth-child(1) {
+ display: flex !important;
+}
diff --git a/plugins/vscode/ui/src/index.html b/plugins/vscode/ui/src/index.html
new file mode 100644
index 00000000..c2f53bf5
--- /dev/null
+++ b/plugins/vscode/ui/src/index.html
@@ -0,0 +1,19 @@
+
+
+
+ GraphQL Debugger VSCode
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/vscode/ui/src/index.tsx b/plugins/vscode/ui/src/index.tsx
new file mode 100644
index 00000000..0ed51a27
--- /dev/null
+++ b/plugins/vscode/ui/src/index.tsx
@@ -0,0 +1,12 @@
+import "@fontsource/roboto/300.css";
+import "@fontsource/roboto/400.css";
+import "@fontsource/roboto/500.css";
+import "@fontsource/roboto/700.css";
+import { createRoot } from "react-dom/client";
+import "tailwindcss/tailwind.css";
+
+import { App } from "./app";
+import "./index.css";
+
+const root = createRoot(document.getElementById("root") as HTMLElement);
+root.render();
diff --git a/plugins/vscode/ui/src/store/useThemeStore.ts b/plugins/vscode/ui/src/store/useThemeStore.ts
new file mode 100644
index 00000000..6671ec2d
--- /dev/null
+++ b/plugins/vscode/ui/src/store/useThemeStore.ts
@@ -0,0 +1,23 @@
+import { create } from "zustand";
+import { persist } from "zustand/middleware";
+
+import { THEME_TYPE } from "../utils/constants";
+
+export type Theme = "light" | "dark";
+
+interface ThemeStore {
+ theme: Theme;
+ toggleTheme: (value: Theme) => void;
+}
+
+export const useThemeStore = create()(
+ persist(
+ (set) => ({
+ theme: window.matchMedia("(prefers-color-scheme: dark").matches
+ ? THEME_TYPE.dark
+ : THEME_TYPE.light,
+ toggleTheme: (value) => set({ theme: value }),
+ }),
+ { name: "theme" },
+ ),
+);
diff --git a/plugins/vscode/ui/src/utils/constants.ts b/plugins/vscode/ui/src/utils/constants.ts
new file mode 100644
index 00000000..122ef391
--- /dev/null
+++ b/plugins/vscode/ui/src/utils/constants.ts
@@ -0,0 +1,4 @@
+export const THEME_TYPE = {
+ light: "light",
+ dark: "dark",
+} as const;
diff --git a/plugins/vscode/ui/tailwind.config.js b/plugins/vscode/ui/tailwind.config.js
new file mode 100644
index 00000000..226913b0
--- /dev/null
+++ b/plugins/vscode/ui/tailwind.config.js
@@ -0,0 +1,29 @@
+/** @type {import('tailwindcss').Config} */
+
+module.exports = {
+ content: ["./src/**/*.{js,jsx,ts,tsx}"],
+ darkMode: "class",
+ theme: {
+ extend: {
+ colors: {
+ /** Background Colors */
+ ["primary-background"]: "hsl(var(--primary-background))",
+ ["secondary-background"]: "hsl(var(--secondary-background))",
+
+ /** Accent Colors */
+ ["accent"]: "hsl(var(--accent))",
+
+ /** Text Colors */
+ ["neutral"]: "hsla(var(--neutral) / )",
+ ["pink"]: "hsl(var(--pink))",
+ ["purple"]: "hsla(var(--purple) / )",
+ ["blue"]: "hsla(var(--blue) / )",
+ ["ochre"]: "hsla(var(--ochre) / )",
+ ["red"]: "hsla(var(--red) / )",
+ ["light-green"]: "hsla(var(--light-green) / )",
+ ["dark-green"]: "hsla(var(--dark-green) / )",
+ ["graphiql-highlight"]: "#444D60",
+ },
+ },
+ },
+};
diff --git a/plugins/vscode/ui/tsconfig.json b/plugins/vscode/ui/tsconfig.json
new file mode 100644
index 00000000..5cc37e73
--- /dev/null
+++ b/plugins/vscode/ui/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "extends": "@tsconfig/node18/tsconfig.json",
+ "compilerOptions": {
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "module": "esnext",
+ "target": "ES2015",
+ "jsx": "react-jsx",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "declarationMap": true,
+ "declaration": true,
+ "sourceMap": false,
+ "skipLibCheck": true,
+ "noImplicitAny": false,
+ "rootDir": "src",
+ "baseUrl": ".",
+ "outDir": "build",
+ "noEmit": false,
+ },
+ "include": ["src/**/*", "src/**/*.spec.ts", "src/**/*.spec.tsx"],
+}
diff --git a/plugins/vscode/ui/webpack.config.js b/plugins/vscode/ui/webpack.config.js
new file mode 100644
index 00000000..59809f38
--- /dev/null
+++ b/plugins/vscode/ui/webpack.config.js
@@ -0,0 +1,82 @@
+const path = require("path");
+const webpack = require("webpack");
+const HtmlWebpackPlugin = require("html-webpack-plugin");
+const CopyWebpackPlugin = require("copy-webpack-plugin");
+const { CleanWebpackPlugin } = require("clean-webpack-plugin");
+const NodePolyfillPlugin = require("node-polyfill-webpack-plugin");
+
+module.exports = {
+ mode: "none",
+ entry: path.join(__dirname, "src", "index.tsx"),
+ context: path.join(__dirname),
+ target: "web",
+ resolve: {
+ extensions: [".ts", ".tsx", ".mjs", ".json", ".js"],
+ },
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ loader: "ts-loader",
+ exclude: "/node_modules/",
+ options: { transpileOnly: true },
+ },
+ {
+ test: /\.(png|jpg|woff|woff2|eot|ttf)$/,
+ use: [
+ {
+ loader: "url-loader",
+ options: {
+ limit: 8192,
+ },
+ },
+ ],
+ },
+ {
+ test: /\.svg$/,
+ use: [
+ {
+ loader: "svg-url-loader",
+ options: {
+ limit: 10000,
+ },
+ },
+ ],
+ },
+ {
+ test: /\.(css|scss)$/,
+ use: ["style-loader", "css-loader", "postcss-loader"],
+ exclude: /\.module\.css$/,
+ },
+ ],
+ },
+ output: {
+ filename: "[name].js",
+ path: path.resolve(__dirname, "build"),
+ publicPath: "",
+ },
+ plugins: [
+ new CleanWebpackPlugin(),
+ new CopyWebpackPlugin({
+ patterns: ["public"],
+ }),
+ new webpack.DefinePlugin({
+ "process.env": {
+ NODE_ENV: JSON.stringify(process.env.NODE_ENV),
+ WEBPACK_DEV_PORT: JSON.stringify(process.env.WEBPACK_DEV_PORT),
+ API_URL: JSON.stringify(process.env.API_URL),
+ },
+ }),
+ new HtmlWebpackPlugin({
+ template: "./src/index.html",
+ }),
+ new NodePolyfillPlugin(),
+ ],
+ devServer: {
+ static: {
+ directory: "dist",
+ },
+ compress: true,
+ port: process.env.WEBPACK_DEV_PORT || 8081,
+ },
+};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 77fa8cec..f2906388 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -739,7 +739,7 @@ importers:
version: link:../time
debug:
specifier: 4.3.4
- version: 4.3.4
+ version: 4.3.4(supports-color@8.1.1)
graphql:
specifier: ^16.0.0 || ^17.0.0
version: 16.0.0
@@ -770,6 +770,98 @@ importers:
specifier: 6.3.4
version: 6.3.4
+ plugins/vscode/extension:
+ dependencies:
+ '@graphql-debugger/adapter-proxy':
+ specifier: workspace:^
+ version: link:../../../packages/adapters/proxy
+ '@graphql-debugger/client':
+ specifier: workspace:^
+ version: link:../../../packages/client
+ '@graphql-debugger/graphql-schema':
+ specifier: workspace:^
+ version: link:../../../packages/graphql-schema
+ '@graphql-debugger/trace-schema':
+ specifier: workspace:^
+ version: link:../../../packages/trace-schema
+ '@graphql-debugger/utils':
+ specifier: workspace:^
+ version: link:../../../packages/utils
+ '@graphql-debugger/vscode-ui':
+ specifier: workspace:^
+ version: link:../ui
+ '@graphql-tools/schema':
+ specifier: 10.0.2
+ version: 10.0.2(graphql@16.0.0)
+ '@graphql-tools/utils':
+ specifier: 10.0.13
+ version: 10.0.13(graphql@16.0.0)
+ graphql:
+ specifier: ^16.0.0 || ^17.0.0
+ version: 16.0.0
+ devDependencies:
+ '@types/vscode':
+ specifier: 1.86.0
+ version: 1.86.0
+ '@vscode/test-cli':
+ specifier: 0.0.4
+ version: 0.0.4
+ '@vscode/test-electron':
+ specifier: 2.3.9
+ version: 2.3.9
+ ts-node:
+ specifier: 10.9.2
+ version: 10.9.2(@types/node@20.10.5)(typescript@5.3.3)
+ typescript:
+ specifier: 5.3.3
+ version: 5.3.3
+
+ plugins/vscode/ui:
+ dependencies:
+ '@fontsource/roboto':
+ specifier: 5.0.8
+ version: 5.0.8
+ '@graphql-debugger/adapter-proxy':
+ specifier: workspace:^
+ version: link:../../../packages/adapters/proxy
+ '@graphql-debugger/client':
+ specifier: workspace:^
+ version: link:../../../packages/client
+ '@graphql-debugger/ui':
+ specifier: workspace:^
+ version: link:../../../apps/ui
+ '@graphql-debugger/utils':
+ specifier: workspace:^
+ version: link:../../../packages/utils
+ '@tanstack/react-query':
+ specifier: 5.13.4
+ version: 5.13.4(react@18.2.0)
+ clsx:
+ specifier: 2.0.0
+ version: 2.0.0
+ graphql:
+ specifier: ^16.0.0 || ^17.0.0
+ version: 16.0.0
+ react:
+ specifier: 18.2.0
+ version: 18.2.0
+ react-dom:
+ specifier: 18.2.0
+ version: 18.2.0(react@18.2.0)
+ react-router-dom:
+ specifier: 6.21.2
+ version: 6.21.2(react-dom@18.2.0)(react@18.2.0)
+ tailwind-merge:
+ specifier: 2.2.0
+ version: 2.2.0
+ zustand:
+ specifier: 4.5.0
+ version: 4.5.0(@types/react@18.2.48)(react@18.2.0)
+ devDependencies:
+ '@graphql-debugger/types':
+ specifier: workspace:^
+ version: link:../../../packages/types
+
plugins/yoga:
dependencies:
'@graphql-debugger/adapter-base':
@@ -853,7 +945,7 @@ packages:
'@babel/traverse': 7.23.9
'@babel/types': 7.23.9
convert-source-map: 2.0.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@@ -949,7 +1041,7 @@ packages:
'@babel/core': 7.23.7
'@babel/helper-compilation-targets': 7.23.6
'@babel/helper-plugin-utils': 7.22.5
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
lodash.debounce: 4.0.8
resolve: 1.22.8
transitivePeerDependencies:
@@ -967,7 +1059,7 @@ packages:
'@babel/core': 7.23.7
'@babel/helper-compilation-targets': 7.23.6
'@babel/helper-plugin-utils': 7.22.5
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
lodash.debounce: 4.0.8
resolve: 1.22.8
transitivePeerDependencies:
@@ -2274,7 +2366,7 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.23.9
'@babel/types': 7.23.9
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -2292,7 +2384,7 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.23.9
'@babel/types': 7.23.9
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -2379,7 +2471,7 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
espree: 9.6.1
globals: 13.24.0
ignore: 5.3.0
@@ -2416,7 +2508,7 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
dependencies:
- '@graphql-tools/utils': 10.0.11(graphql@16.0.0)
+ '@graphql-tools/utils': 10.0.13(graphql@16.0.0)
'@graphql-typed-document-node/core': 3.2.0(graphql@16.0.0)
'@repeaterjs/repeater': 3.0.5
graphql: 16.0.0
@@ -2430,7 +2522,7 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
dependencies:
- '@graphql-tools/utils': 10.0.11(graphql@16.0.0)
+ '@graphql-tools/utils': 10.0.13(graphql@16.0.0)
graphql: 16.0.0
tslib: 2.6.2
@@ -2441,7 +2533,7 @@ packages:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
dependencies:
'@graphql-tools/merge': 9.0.1(graphql@16.0.0)
- '@graphql-tools/utils': 10.0.11(graphql@16.0.0)
+ '@graphql-tools/utils': 10.0.13(graphql@16.0.0)
graphql: 16.0.0
tslib: 2.6.2
value-or-promise: 1.0.12
@@ -2454,7 +2546,7 @@ packages:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
dependencies:
'@graphql-tools/merge': 9.0.1(graphql@16.0.0)
- '@graphql-tools/utils': 10.0.11(graphql@16.0.0)
+ '@graphql-tools/utils': 10.0.13(graphql@16.0.0)
graphql: 16.0.0
tslib: 2.6.2
value-or-promise: 1.0.12
@@ -2471,6 +2563,18 @@ packages:
graphql: 16.0.0
tslib: 2.6.2
+ /@graphql-tools/utils@10.0.13(graphql@16.0.0):
+ resolution: {integrity: sha512-fMILwGr5Dm2zefNItjQ6C2rauigklv69LIwppccICuGTnGaOp3DspLt/6Lxj72cbg5d9z60Sr+Egco3CJKLsNg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+ dependencies:
+ '@graphql-typed-document-node/core': 3.2.0(graphql@16.0.0)
+ cross-inspect: 1.0.0
+ dset: 3.1.3
+ graphql: 16.0.0
+ tslib: 2.6.2
+
/@graphql-tools/utils@10.0.8(graphql@16.0.0):
resolution: {integrity: sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==}
engines: {node: '>=16.0.0'}
@@ -2533,7 +2637,7 @@ packages:
engines: {node: '>=10.10.0'}
dependencies:
'@humanwhocodes/object-schema': 2.0.2
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -3393,7 +3497,7 @@ packages:
engines: {node: '>=16.3.0'}
hasBin: true
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
extract-zip: 2.0.1
progress: 2.0.3
proxy-agent: 6.3.1
@@ -3431,10 +3535,23 @@ packages:
dependencies:
tslib: 2.6.2
+ /@tanstack/query-core@5.13.4:
+ resolution: {integrity: sha512-8+rJucXvC/xlr4OrxHhEIob/cTlbT4fgmz1VsvB0D12FRStKaXeLORNGcOhSAynRd2NL74SV/Qq0IIb4DedLcA==}
+ dev: false
+
/@tanstack/query-core@5.20.2:
resolution: {integrity: sha512-sAILwNiyA1I52e6imOsmNDUA/PuOayOzqz5jcLiIB5wBXqVk+HIiriWouPcAkjS8RqARfHUehuoPwcZ7Uzh0GQ==}
dev: false
+ /@tanstack/react-query@5.13.4(react@18.2.0):
+ resolution: {integrity: sha512-3HjvkFFriEQwffUXtKHPiwkfFXUGbs46YATTzzyK1+Pw6Ekd3kwzS50e45qdamWuEXmXxyo5S1zp534LdFG0Rw==}
+ peerDependencies:
+ react: ^18.0.0
+ dependencies:
+ '@tanstack/query-core': 5.13.4
+ react: 18.2.0
+ dev: false
+
/@tanstack/react-query@5.20.2(react@18.2.0):
resolution: {integrity: sha512-949myvMY77cPqwb71m3wRG2ypgwPijshO5kN9w0CDKWrFC0X8Wh1mwSqst88kIr58tWlWNsGy3U40AK23RgYQA==}
peerDependencies:
@@ -3542,6 +3659,11 @@ packages:
npm-to-yarn: 2.1.0
unist-util-visit: 5.0.0
+ /@tootallnate/once@1.1.2:
+ resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
+ engines: {node: '>= 6'}
+ dev: true
+
/@tootallnate/once@2.0.0:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
@@ -3828,6 +3950,10 @@ packages:
resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
dev: true
+ /@types/mocha@10.0.6:
+ resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==}
+ dev: true
+
/@types/ms@0.7.34:
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
@@ -3943,6 +4069,10 @@ packages:
/@types/unist@3.0.2:
resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
+ /@types/vscode@1.86.0:
+ resolution: {integrity: sha512-DnIXf2ftWv+9LWOB5OJeIeaLigLHF7fdXF6atfc7X5g2w/wVZBgk0amP7b+ub5xAuW1q7qP5YcFvOcit/DtyCQ==}
+ dev: true
+
/@types/webpack@5.28.5(webpack-cli@5.1.4):
resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==}
dependencies:
@@ -3995,7 +4125,7 @@ packages:
'@typescript-eslint/type-utils': 6.14.0(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/utils': 6.14.0(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/visitor-keys': 6.14.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
eslint: 8.56.0
graphemer: 1.4.0
ignore: 5.3.0
@@ -4021,7 +4151,7 @@ packages:
'@typescript-eslint/types': 6.19.1
'@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
'@typescript-eslint/visitor-keys': 6.19.1
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
eslint: 8.56.0
typescript: 5.3.3
transitivePeerDependencies:
@@ -4056,7 +4186,7 @@ packages:
dependencies:
'@typescript-eslint/typescript-estree': 6.14.0(typescript@5.3.3)
'@typescript-eslint/utils': 6.14.0(eslint@8.56.0)(typescript@5.3.3)
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
eslint: 8.56.0
ts-api-utils: 1.0.3(typescript@5.3.3)
typescript: 5.3.3
@@ -4085,7 +4215,7 @@ packages:
dependencies:
'@typescript-eslint/types': 6.14.0
'@typescript-eslint/visitor-keys': 6.14.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
globby: 11.1.0
is-glob: 4.0.3
semver: 7.5.4
@@ -4106,7 +4236,7 @@ packages:
dependencies:
'@typescript-eslint/types': 6.19.1
'@typescript-eslint/visitor-keys': 6.19.1
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
@@ -4155,6 +4285,31 @@ packages:
/@ungap/structured-clone@1.2.0:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+ /@vscode/test-cli@0.0.4:
+ resolution: {integrity: sha512-Tx0tfbxeSb2Xlo+jpd+GJrNLgKQHobhRHrYvOipZRZQYWZ82sKiK02VY09UjU1Czc/YnZnqyAnjUfaVGl3h09w==}
+ hasBin: true
+ dependencies:
+ '@types/mocha': 10.0.6
+ chokidar: 3.5.3
+ glob: 10.3.10
+ minimatch: 9.0.3
+ mocha: 10.3.0
+ supports-color: 9.4.0
+ yargs: 17.7.2
+ dev: true
+
+ /@vscode/test-electron@2.3.9:
+ resolution: {integrity: sha512-z3eiChaCQXMqBnk2aHHSEkobmC2VRalFQN0ApOAtydL172zXGxTwGrRtviT5HnUB+Q+G3vtEYFtuQkYqBzYgMA==}
+ engines: {node: '>=16'}
+ dependencies:
+ http-proxy-agent: 4.0.1
+ https-proxy-agent: 5.0.1
+ jszip: 3.10.1
+ semver: 7.5.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@webassemblyjs/ast@1.11.6:
resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==}
dependencies:
@@ -4397,16 +4552,15 @@ packages:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
- dev: false
/agent-base@7.1.0:
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
engines: {node: '>= 14'}
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
dev: false
@@ -4457,6 +4611,11 @@ packages:
uri-js: 4.4.1
dev: true
+ /ansi-colors@4.1.1:
+ resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==}
+ engines: {node: '>=6'}
+ dev: true
+
/ansi-escapes@4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
@@ -4927,6 +5086,10 @@ packages:
resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
dev: true
+ /browser-stdout@1.3.1:
+ resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
+ dev: true
+
/browserify-aes@1.2.0:
resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
dependencies:
@@ -5232,6 +5395,14 @@ packages:
arch: 2.2.0
execa: 0.8.0
+ /cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
/cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
@@ -5922,7 +6093,7 @@ packages:
ms: 2.1.3
dev: true
- /debug@4.3.4:
+ /debug@4.3.4(supports-color@8.1.1):
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
peerDependencies:
@@ -5932,6 +6103,12 @@ packages:
optional: true
dependencies:
ms: 2.1.2
+ supports-color: 8.1.1
+
+ /decamelize@4.0.0:
+ resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
+ engines: {node: '>=10'}
+ dev: true
/decimal.js@10.4.3:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
@@ -6101,6 +6278,11 @@ packages:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
+ /diff@5.0.0:
+ resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
/diff@5.1.0:
resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
engines: {node: '>=0.3.1'}
@@ -6755,7 +6937,7 @@ packages:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.2.2
@@ -7016,7 +7198,7 @@ packages:
engines: {node: '>= 10.17.0'}
hasBin: true
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
get-stream: 5.2.0
yauzl: 2.10.0
optionalDependencies:
@@ -7348,7 +7530,7 @@ packages:
dependencies:
basic-ftp: 5.0.4
data-uri-to-buffer: 6.0.1
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
fs-extra: 8.1.0
transitivePeerDependencies:
- supports-color
@@ -7397,6 +7579,17 @@ packages:
once: 1.4.0
path-is-absolute: 1.0.1
+ /glob@8.1.0:
+ resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 5.0.1
+ once: 1.4.0
+ dev: true
+
/globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
@@ -7850,13 +8043,24 @@ packages:
resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==}
dev: true
+ /http-proxy-agent@4.0.1:
+ resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
+ engines: {node: '>= 6'}
+ dependencies:
+ '@tootallnate/once': 1.1.2
+ agent-base: 6.0.2
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/http-proxy-agent@5.0.0:
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
engines: {node: '>= 6'}
dependencies:
'@tootallnate/once': 2.0.0
agent-base: 6.0.2
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
dev: false
@@ -7866,7 +8070,7 @@ packages:
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
dev: false
@@ -7910,17 +8114,16 @@ packages:
engines: {node: '>= 6'}
dependencies:
agent-base: 6.0.2
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
- dev: false
/https-proxy-agent@7.0.2:
resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==}
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
dev: false
@@ -7958,6 +8161,10 @@ packages:
engines: {node: '>= 4'}
dev: true
+ /immediate@3.0.6:
+ resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
+ dev: true
+
/import-fresh@3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
@@ -8261,6 +8468,11 @@ packages:
engines: {node: '>=8'}
dev: true
+ /is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+ engines: {node: '>=8'}
+ dev: true
+
/is-plain-obj@3.0.0:
resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
engines: {node: '>=10'}
@@ -8326,6 +8538,11 @@ packages:
dependencies:
which-typed-array: 1.1.13
+ /is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+ dev: true
+
/is-weakmap@2.0.1:
resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
@@ -8403,7 +8620,7 @@ packages:
resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
engines: {node: '>=10'}
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
istanbul-lib-coverage: 3.2.2
source-map: 0.6.1
transitivePeerDependencies:
@@ -8993,6 +9210,15 @@ packages:
object.values: 1.1.7
dev: true
+ /jszip@3.10.1:
+ resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
+ dependencies:
+ lie: 3.3.0
+ pako: 1.0.11
+ readable-stream: 2.3.8
+ setimmediate: 1.0.5
+ dev: true
+
/katex@0.16.9:
resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==}
hasBin: true
@@ -9045,6 +9271,12 @@ packages:
type-check: 0.4.0
dev: true
+ /lie@3.3.0:
+ resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
+ dependencies:
+ immediate: 3.0.6
+ dev: true
+
/lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
@@ -9114,6 +9346,14 @@ packages:
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ /log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+ dev: true
+
/longest-streak@3.1.0:
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
@@ -10082,7 +10322,7 @@ packages:
/micromark@2.11.4:
resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==}
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
parse-entities: 2.0.0
transitivePeerDependencies:
- supports-color
@@ -10092,7 +10332,7 @@ packages:
resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
dependencies:
'@types/debug': 4.1.12
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
decode-named-character-reference: 1.0.2
micromark-core-commonmark: 1.1.0
micromark-factory-space: 1.1.0
@@ -10115,7 +10355,7 @@ packages:
resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
dependencies:
'@types/debug': 4.1.12
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
decode-named-character-reference: 1.0.2
devlop: 1.1.0
micromark-core-commonmark: 2.0.0
@@ -10192,6 +10432,13 @@ packages:
dependencies:
brace-expansion: 1.1.11
+ /minimatch@5.0.1:
+ resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
/minimatch@9.0.3:
resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -10219,6 +10466,33 @@ packages:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
dev: false
+ /mocha@10.3.0:
+ resolution: {integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==}
+ engines: {node: '>= 14.0.0'}
+ hasBin: true
+ dependencies:
+ ansi-colors: 4.1.1
+ browser-stdout: 1.3.1
+ chokidar: 3.5.3
+ debug: 4.3.4(supports-color@8.1.1)
+ diff: 5.0.0
+ escape-string-regexp: 4.0.0
+ find-up: 5.0.0
+ glob: 8.1.0
+ he: 1.2.0
+ js-yaml: 4.1.0
+ log-symbols: 4.1.0
+ minimatch: 5.0.1
+ ms: 2.1.3
+ serialize-javascript: 6.0.0
+ strip-json-comments: 3.1.1
+ supports-color: 8.1.1
+ workerpool: 6.2.1
+ yargs: 16.2.0
+ yargs-parser: 20.2.4
+ yargs-unparser: 2.0.0
+ dev: true
+
/module-details-from-path@1.0.3:
resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==}
dev: false
@@ -10706,7 +10980,7 @@ packages:
dependencies:
'@tootallnate/quickjs-emscripten': 0.23.0
agent-base: 7.1.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
get-uri: 6.0.2
http-proxy-agent: 7.0.0
https-proxy-agent: 7.0.2
@@ -11153,7 +11427,7 @@ packages:
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
http-proxy-agent: 7.0.0
https-proxy-agent: 7.0.2
lru-cache: 7.18.3
@@ -11208,7 +11482,7 @@ packages:
'@puppeteer/browsers': 1.9.0
chromium-bidi: 0.5.1(devtools-protocol@0.0.1203626)
cross-fetch: 4.0.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
devtools-protocol: 0.0.1203626
ws: 8.14.2
transitivePeerDependencies:
@@ -11633,7 +11907,7 @@ packages:
resolution: {integrity: sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==}
engines: {node: '>=8.6.0'}
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
module-details-from-path: 1.0.3
resolve: 1.22.8
transitivePeerDependencies:
@@ -11850,6 +12124,12 @@ packages:
transitivePeerDependencies:
- supports-color
+ /serialize-javascript@6.0.0:
+ resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
+ dependencies:
+ randombytes: 2.1.0
+ dev: true
+
/serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
dependencies:
@@ -12008,7 +12288,7 @@ packages:
engines: {node: '>= 14'}
dependencies:
agent-base: 7.1.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
socks: 2.7.1
transitivePeerDependencies:
- supports-color
@@ -12064,7 +12344,7 @@ packages:
/spdy-transport@3.0.0:
resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
detect-node: 2.1.0
hpack.js: 2.1.6
obuf: 1.1.2
@@ -12078,7 +12358,7 @@ packages:
resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
engines: {node: '>=6.0.0'}
dependencies:
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
handle-thing: 2.0.1
http-deceiver: 1.2.7
select-hose: 2.0.0
@@ -12336,7 +12616,7 @@ packages:
dependencies:
component-emitter: 1.3.1
cookiejar: 2.1.4
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
fast-safe-stringify: 2.1.1
form-data: 4.0.0
formidable: 2.1.2
@@ -12939,7 +13219,7 @@ packages:
'@types/unist': 3.0.2
'@ungap/structured-clone': 1.2.0
concat-stream: 2.0.0
- debug: 4.3.4
+ debug: 4.3.4(supports-color@8.1.1)
glob: 10.3.10
ignore: 5.3.0
is-empty: 1.2.0
@@ -13606,6 +13886,10 @@ packages:
resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
dev: true
+ /workerpool@6.2.1:
+ resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==}
+ dev: true
+
/wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -13693,10 +13977,38 @@ packages:
resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
engines: {node: '>= 14'}
+ /yargs-parser@20.2.4:
+ resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
+ engines: {node: '>=10'}
+ dev: true
+
/yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
+ /yargs-unparser@2.0.0:
+ resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
+ engines: {node: '>=10'}
+ dependencies:
+ camelcase: 6.3.0
+ decamelize: 4.0.0
+ flat: 5.0.2
+ is-plain-obj: 2.1.0
+ dev: true
+
+ /yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.1.1
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 20.2.4
+ dev: true
+
/yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}