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 CHANGED
@@ -3813,7 +3813,7 @@ import {
3813
3813
  // package.json
3814
3814
  var package_default = {
3815
3815
  name: "zudoku",
3816
- version: "0.74.0",
3816
+ version: "0.74.1",
3817
3817
  type: "module",
3818
3818
  sideEffects: [
3819
3819
  "**/*.css",
@@ -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;
@@ -519,6 +519,7 @@ export type SchemaInfoQuery = {
519
519
  __typename?: "SchemaTag";
520
520
  name?: string | null;
521
521
  description?: string | null;
522
+ extensions?: any | null;
522
523
  }>;
523
524
  components?: {
524
525
  __typename?: "Components";
@@ -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 Integrations UI or `claude_desktop_config.json` using `mcp-remote`
177
- - **ChatGPT** — connector setup via Settings
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,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.74.1",
3
+ "version": "0.74.2",
4
4
  "type": "module",
5
5
  "sideEffects": [
6
6
  "**/*.css",
@@ -1,5 +1,6 @@
1
+ import { Helmet } from "@zudoku/react-helmet-async";
1
2
  import { LogOutIcon } from "lucide-react";
2
- import { lazy, memo, Suspense } from "react";
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
- <SuspendedHeaderNavigation />
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
- <SuspendedHeaderNavigation />
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
- <SuspendedHeaderNavigation />
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
- <Suspense>
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
- <Suspense>
26
- <div className="items-center justify-between px-8 h-(--top-nav-height) hidden lg:flex text-sm relative">
27
- <nav className="text-sm">
28
- <ul className="flex flex-row items-center gap-8">
29
- {filteredItems.map((item) =>
30
- item.type === "separator" ? (
31
- <li key={item.label} className="-mx-4 h-7">
32
- <Separator orientation="vertical" />
33
- </li>
34
- ) : item.type !== "section" && item.type !== "filter" ? (
35
- <li key={item.label + item.type}>
36
- <TopNavItem {...item} />
37
- </li>
38
- ) : null,
39
- )}
40
- </ul>
41
- </nav>
42
- <Slot.Target name="top-navigation-side" />
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 claudeConfig = `{
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>Integrations</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="claude_desktop_config.json"
153
- language="json"
154
- code={claudeConfig}
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>Apps & Connectors</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
- Click <strong>Add connector</strong> and enter your MCP URL:
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 enable the connector. Users must authenticate with
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://help.openai.com/en/articles/11487775-connectors-in-chatgpt"
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>Create or edit: </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>{tag.name}</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: <Layout />,
43
+ element: (
44
+ <Suspense>
45
+ <Layout />
46
+ </Suspense>
47
+ ),
43
48
  children: [route],
44
49
  });
45
50