zudoku 0.74.1 → 0.74.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/cli.js +1 -1
- package/dist/declarations/lib/plugins/openapi/graphql/gql.d.ts +1 -1
- package/dist/declarations/lib/plugins/openapi/graphql/graphql.d.ts +1 -0
- package/docs/guides/mcp-servers.md +2 -2
- package/package.json +1 -1
- package/src/lib/components/Header.tsx +10 -18
- package/src/lib/components/Layout.tsx +1 -3
- package/src/lib/components/TopNavigation.tsx +18 -22
- package/src/lib/plugins/openapi/MCPEndpoint.tsx +19 -29
- package/src/lib/plugins/openapi/SchemaInfo.tsx +6 -3
- package/src/lib/plugins/openapi/graphql/gql.ts +3 -3
- package/src/lib/plugins/openapi/graphql/graphql.ts +2 -0
- package/src/lib/testing/index.tsx +6 -1
package/dist/cli/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare function graphql(source: "\n query ServersQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n"): typeof import("./graphql.js").ServersQueryDocument;
|
|
2
2
|
export declare function graphql(source: "\n fragment OperationsFragment on OperationItem {\n slug\n summary\n method\n description\n operationId\n contentTypes\n path\n deprecated\n extensions\n servers {\n url\n description\n }\n parameters {\n name\n in\n description\n required\n schema\n style\n explode\n allowReserved\n examples {\n name\n description\n externalValue\n value\n summary\n }\n }\n security {\n schemes {\n scopes\n scheme {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n }\n requestBody {\n content {\n mediaType\n encoding {\n name\n }\n examples {\n name\n description\n externalValue\n value\n summary\n }\n schema\n }\n description\n required\n }\n responses {\n statusCode\n links\n description\n content {\n examples {\n name\n description\n externalValue\n value\n summary\n }\n mediaType\n encoding {\n name\n }\n schema\n }\n }\n }\n"): typeof import("./graphql.js").OperationsFragmentFragmentDoc;
|
|
3
3
|
export declare function graphql(source: "\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tag(slug: $tag, untagged: $untagged) {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n extensions\n next {\n name\n slug\n extensions\n }\n prev {\n name\n slug\n extensions\n }\n }\n }\n }\n"): typeof import("./graphql.js").OperationsForTagDocument;
|
|
4
|
-
export declare function graphql(source: "\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n"): typeof import("./graphql.js").SchemaInfoDocument;
|
|
4
|
+
export declare function graphql(source: "\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n extensions\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n"): typeof import("./graphql.js").SchemaInfoDocument;
|
|
5
5
|
export declare function graphql(source: "\n query GetSchemas($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n title\n description\n summary\n components {\n schemas {\n name\n schema\n extensions\n }\n }\n }\n }\n"): typeof import("./graphql.js").GetSchemasDocument;
|
|
6
6
|
export declare function graphql(source: "\n query getServerQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n"): typeof import("./graphql.js").GetServerQueryDocument;
|
|
7
7
|
export declare function graphql(source: "\n query GetNavigationOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n extensions\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n components {\n schemas {\n __typename\n }\n }\n }\n }\n"): typeof import("./graphql.js").GetNavigationOperationsDocument;
|
|
@@ -173,8 +173,8 @@ When Zudoku detects the `x-mcp-server` extension on an operation, the page shows
|
|
|
173
173
|
|
|
174
174
|
- **MCP Endpoint card** with the full URL and a copy button
|
|
175
175
|
- **AI Tool Configuration** tabs with setup instructions for:
|
|
176
|
-
- **Claude** — add via
|
|
177
|
-
- **ChatGPT** —
|
|
176
|
+
- **Claude** — add via Connectors UI or `claude mcp add` CLI command
|
|
177
|
+
- **ChatGPT** — app setup via Settings → Apps → Advanced Settings
|
|
178
178
|
- **Cursor** — `mcp.json` configuration (global or project-level)
|
|
179
179
|
- **VS Code** — `.vscode/mcp.json` with native HTTP transport for GitHub Copilot
|
|
180
180
|
- **Generic** — standard `mcp.json` format compatible with most MCP clients
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { Helmet } from "@zudoku/react-helmet-async";
|
|
1
2
|
import { LogOutIcon } from "lucide-react";
|
|
2
|
-
import {
|
|
3
|
+
import { memo } from "react";
|
|
3
4
|
import { Link } from "react-router";
|
|
4
5
|
import { Button } from "zudoku/ui/Button.js";
|
|
5
6
|
import { Skeleton } from "zudoku/ui/Skeleton.js";
|
|
@@ -22,6 +23,7 @@ import { joinUrl } from "../util/joinUrl.js";
|
|
|
22
23
|
import { Banner } from "./Banner.js";
|
|
23
24
|
import { ClientOnly } from "./ClientOnly.js";
|
|
24
25
|
import { useZudoku } from "./context/ZudokuContext.js";
|
|
26
|
+
import { HeaderNavigation } from "./HeaderNavigation.js";
|
|
25
27
|
import { MobileTopNavigation } from "./MobileTopNavigation.js";
|
|
26
28
|
import { PageProgress } from "./PageProgress.js";
|
|
27
29
|
import { Search } from "./Search.js";
|
|
@@ -29,18 +31,6 @@ import { Slot } from "./Slot.js";
|
|
|
29
31
|
import { ThemeSwitch } from "./ThemeSwitch.js";
|
|
30
32
|
import { TopNavigation } from "./TopNavigation.js";
|
|
31
33
|
|
|
32
|
-
const HeaderNavigation = lazy(() =>
|
|
33
|
-
import("./HeaderNavigation.js").then((m) => ({
|
|
34
|
-
default: m.HeaderNavigation,
|
|
35
|
-
})),
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
const SuspendedHeaderNavigation = () => (
|
|
39
|
-
<Suspense>
|
|
40
|
-
<HeaderNavigation />
|
|
41
|
-
</Suspense>
|
|
42
|
-
);
|
|
43
|
-
|
|
44
34
|
const RecursiveMenu = ({ item }: { item: ProfileNavigationItem }) => {
|
|
45
35
|
return item.children ? (
|
|
46
36
|
<DropdownMenuSub key={item.label}>
|
|
@@ -178,19 +168,21 @@ export const Header = memo(function HeaderInner() {
|
|
|
178
168
|
<div className="flex items-center gap-3.5">
|
|
179
169
|
{site?.logo ? (
|
|
180
170
|
<>
|
|
171
|
+
<Helmet>
|
|
172
|
+
<link rel="preload" as="image" href={logoLightSrc} />
|
|
173
|
+
<link rel="preload" as="image" href={logoDarkSrc} />
|
|
174
|
+
</Helmet>
|
|
181
175
|
<img
|
|
182
176
|
src={logoLightSrc}
|
|
183
177
|
alt={site.logo.alt ?? site.title}
|
|
184
178
|
style={{ width: site.logo.width }}
|
|
185
179
|
className="max-h-(--top-header-height) dark:hidden"
|
|
186
|
-
loading="lazy"
|
|
187
180
|
/>
|
|
188
181
|
<img
|
|
189
182
|
src={logoDarkSrc}
|
|
190
183
|
alt={site.logo.alt ?? site.title}
|
|
191
184
|
style={{ width: site.logo.width }}
|
|
192
185
|
className="max-h-(--top-header-height) hidden dark:block"
|
|
193
|
-
loading="lazy"
|
|
194
186
|
/>
|
|
195
187
|
</>
|
|
196
188
|
) : (
|
|
@@ -209,7 +201,7 @@ export const Header = memo(function HeaderInner() {
|
|
|
209
201
|
)}
|
|
210
202
|
{navPosition === "start" && (
|
|
211
203
|
<div className="hidden lg:block min-w-0">
|
|
212
|
-
<
|
|
204
|
+
<HeaderNavigation />
|
|
213
205
|
</div>
|
|
214
206
|
)}
|
|
215
207
|
</div>
|
|
@@ -222,7 +214,7 @@ export const Header = memo(function HeaderInner() {
|
|
|
222
214
|
/>
|
|
223
215
|
{navPosition === "center" && (
|
|
224
216
|
<div className="hidden lg:block min-w-0">
|
|
225
|
-
<
|
|
217
|
+
<HeaderNavigation />
|
|
226
218
|
</div>
|
|
227
219
|
)}
|
|
228
220
|
{authPosition === "center" && (
|
|
@@ -237,7 +229,7 @@ export const Header = memo(function HeaderInner() {
|
|
|
237
229
|
<div className="hidden lg:flex items-center text-sm gap-2">
|
|
238
230
|
{navPosition === "end" && (
|
|
239
231
|
<div className="min-w-0">
|
|
240
|
-
<
|
|
232
|
+
<HeaderNavigation />
|
|
241
233
|
</div>
|
|
242
234
|
)}
|
|
243
235
|
{authPosition === "end" && <ProfileMenu />}
|
|
@@ -31,9 +31,7 @@ export const Layout = ({ children }: { children?: ReactNode }) => {
|
|
|
31
31
|
return (
|
|
32
32
|
<TooltipProvider>
|
|
33
33
|
<Slot.Target name="layout-before-head" />
|
|
34
|
-
<
|
|
35
|
-
<Header />
|
|
36
|
-
</Suspense>
|
|
34
|
+
<Header />
|
|
37
35
|
<Slot.Target name="layout-after-head" />
|
|
38
36
|
|
|
39
37
|
<div
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { cx } from "class-variance-authority";
|
|
2
2
|
import { deepEqual } from "fast-equals";
|
|
3
|
-
import { Suspense } from "react";
|
|
4
3
|
import { NavLink, type NavLinkProps } from "react-router";
|
|
5
4
|
import { Separator } from "zudoku/ui/Separator.js";
|
|
6
5
|
import type { NavigationItem } from "../../config/validators/NavigationSchema.js";
|
|
@@ -22,27 +21,24 @@ export const TopNavigation = () => {
|
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
return (
|
|
25
|
-
<
|
|
26
|
-
<
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
item.
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
<
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
</div>
|
|
44
|
-
{/* <PageProgress /> */}
|
|
45
|
-
</Suspense>
|
|
24
|
+
<div className="items-center justify-between px-8 h-(--top-nav-height) hidden lg:flex text-sm relative">
|
|
25
|
+
<nav className="text-sm">
|
|
26
|
+
<ul className="flex flex-row items-center gap-8">
|
|
27
|
+
{filteredItems.map((item) =>
|
|
28
|
+
item.type === "separator" ? (
|
|
29
|
+
<li key={item.label} className="-mx-4 h-7">
|
|
30
|
+
<Separator orientation="vertical" />
|
|
31
|
+
</li>
|
|
32
|
+
) : item.type !== "section" && item.type !== "filter" ? (
|
|
33
|
+
<li key={item.label + item.type}>
|
|
34
|
+
<TopNavItem {...item} />
|
|
35
|
+
</li>
|
|
36
|
+
) : null,
|
|
37
|
+
)}
|
|
38
|
+
</ul>
|
|
39
|
+
</nav>
|
|
40
|
+
<Slot.Target name="top-navigation-side" />
|
|
41
|
+
</div>
|
|
46
42
|
);
|
|
47
43
|
};
|
|
48
44
|
|
|
@@ -28,14 +28,7 @@ export const MCPEndpoint = ({
|
|
|
28
28
|
? (summary ?? "mcp-server")
|
|
29
29
|
: (data?.name ?? summary ?? "mcp-server");
|
|
30
30
|
|
|
31
|
-
const
|
|
32
|
-
"mcpServers": {
|
|
33
|
-
"${name}": {
|
|
34
|
-
"command": "npx",
|
|
35
|
-
"args": ["-y", "mcp-remote", "${mcpUrl}"]
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}`;
|
|
31
|
+
const claudeCodeCommand = `claude mcp add --transport http '${name}' '${mcpUrl}'`;
|
|
39
32
|
|
|
40
33
|
const cursorConfig = `{
|
|
41
34
|
"mcpServers": {
|
|
@@ -137,29 +130,21 @@ export const MCPEndpoint = ({
|
|
|
137
130
|
<strong>Settings</strong>
|
|
138
131
|
</li>
|
|
139
132
|
<li>
|
|
140
|
-
Go to <strong>
|
|
133
|
+
Go to <strong>Connectors</strong> →{" "}
|
|
141
134
|
<strong>Add custom connector</strong> and paste the MCP URL
|
|
142
135
|
</li>
|
|
143
136
|
<li>Save and the server will appear in your conversations</li>
|
|
144
137
|
</ol>
|
|
145
138
|
<p className="text-xs text-muted-foreground mt-2">
|
|
146
|
-
Alternatively, add to
|
|
147
|
-
<InlineCode>claude_desktop_config.json</InlineCode> using{" "}
|
|
148
|
-
<InlineCode>mcp-remote</InlineCode> (requires Node.js):
|
|
139
|
+
Alternatively, add it to Claude Code CLI by running:
|
|
149
140
|
</p>
|
|
150
141
|
<SyntaxHighlight
|
|
151
142
|
showLanguageIndicator
|
|
152
|
-
title="
|
|
153
|
-
language="
|
|
154
|
-
code={
|
|
143
|
+
title="Terminal"
|
|
144
|
+
language="bash"
|
|
145
|
+
code={claudeCodeCommand}
|
|
155
146
|
className="mt-2"
|
|
156
147
|
/>
|
|
157
|
-
<p className="text-xs text-muted-foreground mt-2">
|
|
158
|
-
macOS: ~/Library/Application
|
|
159
|
-
Support/Claude/claude_desktop_config.json
|
|
160
|
-
<br />
|
|
161
|
-
Windows: %APPDATA%\Claude\claude_desktop_config.json
|
|
162
|
-
</p>
|
|
163
148
|
<a
|
|
164
149
|
href="https://modelcontextprotocol.io/quickstart/user"
|
|
165
150
|
target="_blank"
|
|
@@ -177,22 +162,23 @@ export const MCPEndpoint = ({
|
|
|
177
162
|
</Callout>
|
|
178
163
|
<ol>
|
|
179
164
|
<li>
|
|
180
|
-
Go to <strong>Settings</strong> →{" "}
|
|
181
|
-
<strong>
|
|
165
|
+
Go to <strong>Settings</strong> → <strong>Apps</strong> →{" "}
|
|
166
|
+
<strong>Advanced Settings</strong>
|
|
167
|
+
</li>
|
|
168
|
+
<li>
|
|
169
|
+
Click <strong>Create app</strong> and fill out the form
|
|
182
170
|
</li>
|
|
183
171
|
<li>
|
|
184
|
-
|
|
172
|
+
Enter the MCP server URL:
|
|
185
173
|
<InlineCode className="ml-2">{chatgptConfig}</InlineCode>
|
|
186
174
|
</li>
|
|
187
|
-
<li>Provide a name and description for your connector</li>
|
|
188
175
|
<li>
|
|
189
|
-
Save and
|
|
190
|
-
the connector before first use.
|
|
176
|
+
Save and the app will be available in your conversations
|
|
191
177
|
</li>
|
|
192
178
|
</ol>
|
|
193
179
|
|
|
194
180
|
<a
|
|
195
|
-
href="https://
|
|
181
|
+
href="https://developers.openai.com/apps-sdk/deploy/connect-chatgpt#create-a-connector"
|
|
196
182
|
target="_blank"
|
|
197
183
|
rel="noopener noreferrer"
|
|
198
184
|
className="inline-flex items-center gap-1 text-sm text-primary hover:underline"
|
|
@@ -205,7 +191,11 @@ export const MCPEndpoint = ({
|
|
|
205
191
|
<TabsContent value="cursor" className="space-y-3">
|
|
206
192
|
<ol>
|
|
207
193
|
<li>
|
|
208
|
-
<span>
|
|
194
|
+
<span>
|
|
195
|
+
Go to <strong>Settings</strong> →{" "}
|
|
196
|
+
<strong>Tools & MCPs</strong> →{" "}
|
|
197
|
+
<strong>New MCP Server</strong>, or edit:{" "}
|
|
198
|
+
</span>
|
|
209
199
|
<InlineCode>~/.cursor/mcp.json</InlineCode>
|
|
210
200
|
<span> (global) or </span>
|
|
211
201
|
<InlineCode>.cursor/mcp.json</InlineCode>
|
|
@@ -67,6 +67,7 @@ const SchemaInfoQuery = graphql(/* GraphQL */ `
|
|
|
67
67
|
tags {
|
|
68
68
|
name
|
|
69
69
|
description
|
|
70
|
+
extensions
|
|
70
71
|
}
|
|
71
72
|
components {
|
|
72
73
|
securitySchemes {
|
|
@@ -276,8 +277,8 @@ export const SchemaInfo = () => {
|
|
|
276
277
|
schema.externalDocs
|
|
277
278
|
);
|
|
278
279
|
|
|
279
|
-
const tags = schema.tags.flatMap(({ name, description }) =>
|
|
280
|
-
name ? { name, description } : [],
|
|
280
|
+
const tags = schema.tags.flatMap(({ name, description, extensions }) =>
|
|
281
|
+
name ? { name, description, extensions } : [],
|
|
281
282
|
);
|
|
282
283
|
|
|
283
284
|
return (
|
|
@@ -338,7 +339,9 @@ export const SchemaInfo = () => {
|
|
|
338
339
|
<Item key={tag.name} variant="outline" asChild>
|
|
339
340
|
<Link to={slugify(tag.name)}>
|
|
340
341
|
<ItemContent>
|
|
341
|
-
<ItemTitle>
|
|
342
|
+
<ItemTitle>
|
|
343
|
+
{tag.extensions?.["x-displayName"] ?? tag.name}
|
|
344
|
+
</ItemTitle>
|
|
342
345
|
{tag.description && (
|
|
343
346
|
<ItemDescription asChild>
|
|
344
347
|
<Markdown
|
|
@@ -16,7 +16,7 @@ type Documents = {
|
|
|
16
16
|
"\n query ServersQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n": typeof types.ServersQueryDocument;
|
|
17
17
|
"\n fragment OperationsFragment on OperationItem {\n slug\n summary\n method\n description\n operationId\n contentTypes\n path\n deprecated\n extensions\n servers {\n url\n description\n }\n parameters {\n name\n in\n description\n required\n schema\n style\n explode\n allowReserved\n examples {\n name\n description\n externalValue\n value\n summary\n }\n }\n security {\n schemes {\n scopes\n scheme {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n }\n requestBody {\n content {\n mediaType\n encoding {\n name\n }\n examples {\n name\n description\n externalValue\n value\n summary\n }\n schema\n }\n description\n required\n }\n responses {\n statusCode\n links\n description\n content {\n examples {\n name\n description\n externalValue\n value\n summary\n }\n mediaType\n encoding {\n name\n }\n schema\n }\n }\n }\n": typeof types.OperationsFragmentFragmentDoc;
|
|
18
18
|
"\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tag(slug: $tag, untagged: $untagged) {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n extensions\n next {\n name\n slug\n extensions\n }\n prev {\n name\n slug\n extensions\n }\n }\n }\n }\n": typeof types.OperationsForTagDocument;
|
|
19
|
-
"\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n": typeof types.SchemaInfoDocument;
|
|
19
|
+
"\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n extensions\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n": typeof types.SchemaInfoDocument;
|
|
20
20
|
"\n query GetSchemas($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n title\n description\n summary\n components {\n schemas {\n name\n schema\n extensions\n }\n }\n }\n }\n": typeof types.GetSchemasDocument;
|
|
21
21
|
"\n query getServerQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n": typeof types.GetServerQueryDocument;
|
|
22
22
|
"\n query GetNavigationOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n extensions\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n components {\n schemas {\n __typename\n }\n }\n }\n }\n": typeof types.GetNavigationOperationsDocument;
|
|
@@ -29,7 +29,7 @@ const documents: Documents = {
|
|
|
29
29
|
types.OperationsFragmentFragmentDoc,
|
|
30
30
|
"\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tag(slug: $tag, untagged: $untagged) {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n extensions\n next {\n name\n slug\n extensions\n }\n prev {\n name\n slug\n extensions\n }\n }\n }\n }\n":
|
|
31
31
|
types.OperationsForTagDocument,
|
|
32
|
-
"\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n":
|
|
32
|
+
"\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n extensions\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n":
|
|
33
33
|
types.SchemaInfoDocument,
|
|
34
34
|
"\n query GetSchemas($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n title\n description\n summary\n components {\n schemas {\n name\n schema\n extensions\n }\n }\n }\n }\n":
|
|
35
35
|
types.GetSchemasDocument,
|
|
@@ -63,7 +63,7 @@ export function graphql(
|
|
|
63
63
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
64
64
|
*/
|
|
65
65
|
export function graphql(
|
|
66
|
-
source: "\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n",
|
|
66
|
+
source: "\n query SchemaInfo($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n servers {\n url\n description\n }\n license {\n name\n url\n identifier\n }\n termsOfService\n externalDocs {\n description\n url\n }\n contact {\n name\n url\n email\n }\n description\n summary\n title\n url\n version\n tags {\n name\n description\n extensions\n }\n components {\n securitySchemes {\n name\n type\n description\n in\n paramName\n scheme\n bearerFormat\n openIdConnectUrl\n flows {\n implicit {\n authorizationUrl\n scopes {\n name\n description\n }\n }\n password {\n tokenUrl\n scopes {\n name\n description\n }\n }\n clientCredentials {\n tokenUrl\n scopes {\n name\n description\n }\n }\n authorizationCode {\n authorizationUrl\n tokenUrl\n scopes {\n name\n description\n }\n }\n }\n }\n }\n webhooks {\n name\n method\n summary\n description\n }\n }\n }\n",
|
|
67
67
|
): typeof import("./graphql.js").SchemaInfoDocument;
|
|
68
68
|
/**
|
|
69
69
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
@@ -528,6 +528,7 @@ export type SchemaInfoQuery = {
|
|
|
528
528
|
__typename?: "SchemaTag";
|
|
529
529
|
name?: string | null;
|
|
530
530
|
description?: string | null;
|
|
531
|
+
extensions?: any | null;
|
|
531
532
|
}>;
|
|
532
533
|
components?: {
|
|
533
534
|
__typename?: "Components";
|
|
@@ -1005,6 +1006,7 @@ export const SchemaInfoDocument = new TypedDocumentString(`
|
|
|
1005
1006
|
tags {
|
|
1006
1007
|
name
|
|
1007
1008
|
description
|
|
1009
|
+
extensions
|
|
1008
1010
|
}
|
|
1009
1011
|
components {
|
|
1010
1012
|
securitySchemes {
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type QueryKey,
|
|
5
5
|
} from "@tanstack/react-query";
|
|
6
6
|
import { HelmetProvider } from "@zudoku/react-helmet-async";
|
|
7
|
+
import { Suspense } from "react";
|
|
7
8
|
import { createMemoryRouter, Outlet, RouterProvider } from "react-router";
|
|
8
9
|
import { createRedirectRoutes } from "../../app/utils/createRedirectRoutes.js";
|
|
9
10
|
import type { ZudokuRedirect } from "../../config/validators/ZudokuConfig.js";
|
|
@@ -39,7 +40,11 @@ const getRoutesByOptions = (options: ZudokuContextOptions) => {
|
|
|
39
40
|
};
|
|
40
41
|
|
|
41
42
|
const wrapWithLayout = (route: RouteObject) => ({
|
|
42
|
-
element:
|
|
43
|
+
element: (
|
|
44
|
+
<Suspense>
|
|
45
|
+
<Layout />
|
|
46
|
+
</Suspense>
|
|
47
|
+
),
|
|
43
48
|
children: [route],
|
|
44
49
|
});
|
|
45
50
|
|