zudoku 0.74.0 → 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.
Files changed (97) hide show
  1. package/dist/cli/cli.js +171 -12
  2. package/dist/declarations/config/validators/ZudokuConfig.d.ts +1 -2
  3. package/dist/declarations/lib/authentication/components/LogoutCallbackHandler.d.ts +3 -0
  4. package/dist/declarations/lib/authentication/providers/firebase.d.ts +2 -2
  5. package/dist/declarations/lib/authentication/providers/openid.d.ts +2 -0
  6. package/dist/declarations/lib/components/Header.d.ts +1 -1
  7. package/dist/declarations/lib/core/ZudokuContext.d.ts +2 -0
  8. package/dist/declarations/lib/plugins/openapi/SecurityRequirements.d.ts +21 -0
  9. package/dist/declarations/lib/plugins/openapi/SimpleSelect.d.ts +2 -1
  10. package/dist/declarations/lib/plugins/openapi/graphql/gql.d.ts +2 -2
  11. package/dist/declarations/lib/plugins/openapi/graphql/graphql.d.ts +154 -2
  12. package/dist/declarations/lib/plugins/openapi/interfaces.d.ts +1 -0
  13. package/dist/declarations/lib/plugins/openapi/playground/AuthorizeDialog.d.ts +6 -0
  14. package/dist/declarations/lib/plugins/openapi/playground/IdentitySelector.d.ts +8 -1
  15. package/dist/declarations/lib/plugins/openapi/playground/Playground.d.ts +61 -2
  16. package/dist/declarations/lib/plugins/openapi/playground/scheme-forms/ApiKeySchemeForm.d.ts +7 -0
  17. package/dist/declarations/lib/plugins/openapi/playground/scheme-forms/HttpBasicSchemeForm.d.ts +4 -0
  18. package/dist/declarations/lib/plugins/openapi/playground/scheme-forms/HttpBearerSchemeForm.d.ts +7 -0
  19. package/dist/declarations/lib/plugins/openapi/playground/scheme-forms/types.d.ts +25 -0
  20. package/dist/declarations/lib/plugins/openapi/playground/securityCredentialsStore.d.ts +46 -0
  21. package/dist/declarations/lib/ui/Callout.d.ts +5 -5
  22. package/dist/declarations/lib/util/markdown.d.ts +1 -0
  23. package/dist/flat-config.d.ts +2 -1
  24. package/docs/configuration/api-reference.md +5 -0
  25. package/docs/configuration/authentication-auth0.md +2 -2
  26. package/docs/configuration/authentication-azure-ad.md +4 -13
  27. package/docs/configuration/authentication-clerk.md +17 -16
  28. package/docs/configuration/authentication-firebase.md +1 -1
  29. package/docs/configuration/authentication-supabase.md +165 -44
  30. package/docs/configuration/authentication.md +7 -7
  31. package/docs/configuration/oauth-security-schemes.md +123 -0
  32. package/docs/configuration/site.md +39 -0
  33. package/docs/guides/mcp-servers.md +3 -3
  34. package/package.json +8 -8
  35. package/src/app/main.css +10 -1
  36. package/src/config/validators/ZudokuConfig.ts +1 -1
  37. package/src/lib/authentication/components/LogoutCallbackHandler.tsx +17 -0
  38. package/src/lib/authentication/hook.ts +0 -3
  39. package/src/lib/authentication/providers/auth0.tsx +17 -16
  40. package/src/lib/authentication/providers/azureb2c.tsx +0 -1
  41. package/src/lib/authentication/providers/clerk.tsx +3 -3
  42. package/src/lib/authentication/providers/firebase.tsx +9 -4
  43. package/src/lib/authentication/providers/openid.tsx +38 -16
  44. package/src/lib/authentication/providers/supabase.tsx +3 -1
  45. package/src/lib/components/AiAssistantMenuItems.tsx +2 -2
  46. package/src/lib/components/Header.tsx +10 -18
  47. package/src/lib/components/Layout.tsx +1 -3
  48. package/src/lib/components/MobileTopNavigation.tsx +2 -2
  49. package/src/lib/components/NotFoundPage.tsx +6 -0
  50. package/src/lib/components/TopNavigation.tsx +18 -22
  51. package/src/lib/components/navigation/NavigationCategory.tsx +3 -0
  52. package/src/lib/core/ZudokuContext.ts +3 -0
  53. package/src/lib/oas/graphql/index.ts +220 -0
  54. package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +7 -5
  55. package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +2 -2
  56. package/src/lib/plugins/markdown/MdxPage.tsx +23 -8
  57. package/src/lib/plugins/openapi/Endpoint.tsx +4 -2
  58. package/src/lib/plugins/openapi/MCPEndpoint.tsx +32 -50
  59. package/src/lib/plugins/openapi/OperationList.tsx +46 -0
  60. package/src/lib/plugins/openapi/OperationListItem.tsx +19 -13
  61. package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +21 -0
  62. package/src/lib/plugins/openapi/SchemaInfo.tsx +133 -25
  63. package/src/lib/plugins/openapi/SecurityRequirements.tsx +155 -0
  64. package/src/lib/plugins/openapi/Sidecar.tsx +47 -1
  65. package/src/lib/plugins/openapi/SimpleSelect.tsx +4 -1
  66. package/src/lib/plugins/openapi/graphql/gql.ts +6 -6
  67. package/src/lib/plugins/openapi/graphql/graphql.ts +301 -2
  68. package/src/lib/plugins/openapi/index.tsx +1 -1
  69. package/src/lib/plugins/openapi/interfaces.ts +1 -0
  70. package/src/lib/plugins/openapi/playground/AuthorizeDialog.tsx +168 -0
  71. package/src/lib/plugins/openapi/playground/CollapsibleHeader.tsx +3 -0
  72. package/src/lib/plugins/openapi/playground/Headers.tsx +3 -2
  73. package/src/lib/plugins/openapi/playground/IdentitySelector.tsx +44 -2
  74. package/src/lib/plugins/openapi/playground/ParamsGrid.tsx +2 -1
  75. package/src/lib/plugins/openapi/playground/Playground.tsx +150 -17
  76. package/src/lib/plugins/openapi/playground/QueryParams.tsx +1 -1
  77. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +26 -8
  78. package/src/lib/plugins/openapi/playground/result-panel/ResultPanel.tsx +7 -1
  79. package/src/lib/plugins/openapi/playground/scheme-forms/ApiKeySchemeForm.tsx +34 -0
  80. package/src/lib/plugins/openapi/playground/scheme-forms/HttpBasicSchemeForm.tsx +40 -0
  81. package/src/lib/plugins/openapi/playground/scheme-forms/HttpBearerSchemeForm.tsx +34 -0
  82. package/src/lib/plugins/openapi/playground/scheme-forms/types.ts +35 -0
  83. package/src/lib/plugins/openapi/playground/securityCredentialsStore.ts +181 -0
  84. package/src/lib/testing/index.tsx +6 -1
  85. package/src/lib/ui/Callout.tsx +13 -6
  86. package/src/lib/ui/Dialog.tsx +2 -0
  87. package/src/lib/ui/DropdownMenu.tsx +3 -3
  88. package/src/lib/ui/EmbeddedCodeBlock.tsx +3 -1
  89. package/src/lib/ui/NativeSelect.tsx +0 -1
  90. package/src/lib/ui/Secret.tsx +6 -4
  91. package/src/lib/ui/Select.tsx +4 -4
  92. package/src/lib/ui/Value.tsx +6 -1
  93. package/src/lib/util/markdown.ts +7 -0
  94. package/src/vite/plugin-api.ts +2 -0
  95. package/src/vite/plugin-markdown-export.ts +20 -3
  96. package/src/vite-env.d.ts +2 -0
  97. package/src/zuplo/enrich-with-zuplo-mcp.ts +24 -23
package/dist/cli/cli.js CHANGED
@@ -3193,7 +3193,6 @@ var init_ZudokuConfig = __esm({
3193
3193
  "apple",
3194
3194
  "yahoo",
3195
3195
  "password",
3196
- "phone",
3197
3196
  "emailLink"
3198
3197
  ])
3199
3198
  ).optional(),
@@ -3319,6 +3318,7 @@ var init_ZudokuConfig = __esm({
3319
3318
  dir: z7.enum(["ltr", "rtl"]).optional(),
3320
3319
  logo: LogoSchema,
3321
3320
  showPoweredBy: z7.boolean().optional(),
3321
+ notFoundPage: z7.custom(),
3322
3322
  banner: z7.object({
3323
3323
  message: z7.custom(),
3324
3324
  color: z7.custom(
@@ -3813,7 +3813,7 @@ import {
3813
3813
  // package.json
3814
3814
  var package_default = {
3815
3815
  name: "zudoku",
3816
- version: "0.73.1",
3816
+ version: "0.74.1",
3817
3817
  type: "module",
3818
3818
  sideEffects: [
3819
3819
  "**/*.css",
@@ -3893,7 +3893,7 @@ var package_default = {
3893
3893
  "@apidevtools/json-schema-ref-parser": "15.3.1",
3894
3894
  "@envelop/core": "5.5.1",
3895
3895
  "@graphql-typed-document-node/core": "3.2.0",
3896
- "@hono/node-server": "1.19.11",
3896
+ "@hono/node-server": "1.19.13",
3897
3897
  "@lekoarts/rehype-meta-as-attributes": "3.0.3",
3898
3898
  "@mdx-js/react": "3.1.1",
3899
3899
  "@mdx-js/rollup": "3.1.1",
@@ -3930,8 +3930,8 @@ var package_default = {
3930
3930
  "@shikijs/transformers": "3.23.0",
3931
3931
  "@tailwindcss/typography": "0.5.19",
3932
3932
  "@tailwindcss/vite": "4.2.1",
3933
- "@tanem/react-nprogress": "6.0.2",
3934
- "@tanstack/react-query": "5.90.21",
3933
+ "@tanem/react-nprogress": "6.0.3",
3934
+ "@tanstack/react-query": "5.97.0",
3935
3935
  "@types/react": "catalog:",
3936
3936
  "@types/react-dom": "catalog:",
3937
3937
  "@vitejs/plugin-react": "5.1.4",
@@ -3958,7 +3958,7 @@ var package_default = {
3958
3958
  "hast-util-heading-rank": "3.0.0",
3959
3959
  "hast-util-to-jsx-runtime": "2.3.6",
3960
3960
  "hast-util-to-string": "3.0.1",
3961
- hono: "4.12.5",
3961
+ hono: "4.12.12",
3962
3962
  "http-terminator": "3.2.0",
3963
3963
  "javascript-stringify": "2.1.0",
3964
3964
  "json-schema-to-typescript-lite": "15.0.0",
@@ -4003,14 +4003,14 @@ var package_default = {
4003
4003
  "unist-util-visit": "5.1.0",
4004
4004
  vaul: "1.1.2",
4005
4005
  vfile: "6.0.3",
4006
- vite: "7.3.1",
4006
+ vite: "7.3.2",
4007
4007
  yaml: "2.8.3",
4008
4008
  yargs: "18.0.0",
4009
4009
  zod: "4.3.6",
4010
4010
  zustand: "5.0.12"
4011
4011
  },
4012
4012
  devDependencies: {
4013
- "@clerk/clerk-js": "^5.125.3",
4013
+ "@clerk/clerk-js": "^6.0.0",
4014
4014
  "@graphql-codegen/cli": "6.1.2",
4015
4015
  "@inkeep/cxkit-types": "0.5.116",
4016
4016
  "@testing-library/dom": "catalog:",
@@ -4034,7 +4034,7 @@ var package_default = {
4034
4034
  react: "catalog:",
4035
4035
  "react-dom": "catalog:",
4036
4036
  tsx: "4.21.0",
4037
- typescript: "5.9.3"
4037
+ typescript: "catalog:"
4038
4038
  },
4039
4039
  peerDependencies: {
4040
4040
  "@azure/msal-browser": "^4.13.0",
@@ -4918,6 +4918,131 @@ var WebhookItem = builder.objectRef("WebhookItem").implement({
4918
4918
  operationId: t.exposeString("operationId", { nullable: true })
4919
4919
  })
4920
4920
  });
4921
+ var SecuritySchemeTypeEnum = builder.enumType("SecuritySchemeType", {
4922
+ values: ["apiKey", "http", "oauth2", "openIdConnect", "mutualTLS"]
4923
+ });
4924
+ var SecuritySchemeInEnum = builder.enumType("SecuritySchemeIn", {
4925
+ values: ["header", "query", "cookie"]
4926
+ });
4927
+ var OAuthScopeItem = builder.objectRef("OAuthScopeItem").implement({
4928
+ fields: (t) => ({
4929
+ name: t.exposeString("name"),
4930
+ description: t.exposeString("description")
4931
+ })
4932
+ });
4933
+ var OAuthFlowItem = builder.objectRef("OAuthFlowItem").implement({
4934
+ fields: (t) => ({
4935
+ authorizationUrl: t.exposeString("authorizationUrl", { nullable: true }),
4936
+ tokenUrl: t.exposeString("tokenUrl", { nullable: true }),
4937
+ refreshUrl: t.exposeString("refreshUrl", { nullable: true }),
4938
+ scopes: t.field({
4939
+ type: [OAuthScopeItem],
4940
+ resolve: (parent) => Object.entries(parent.scopes ?? {}).map(([name, description]) => ({
4941
+ name,
4942
+ description
4943
+ }))
4944
+ })
4945
+ })
4946
+ });
4947
+ var OAuthFlowsItem = builder.objectRef("OAuthFlowsItem").implement({
4948
+ fields: (t) => ({
4949
+ implicit: t.field({
4950
+ type: OAuthFlowItem,
4951
+ resolve: (parent) => parent.implicit ?? null,
4952
+ nullable: true
4953
+ }),
4954
+ password: t.field({
4955
+ type: OAuthFlowItem,
4956
+ resolve: (parent) => parent.password ?? null,
4957
+ nullable: true
4958
+ }),
4959
+ clientCredentials: t.field({
4960
+ type: OAuthFlowItem,
4961
+ resolve: (parent) => parent.clientCredentials ?? null,
4962
+ nullable: true
4963
+ }),
4964
+ authorizationCode: t.field({
4965
+ type: OAuthFlowItem,
4966
+ resolve: (parent) => parent.authorizationCode ?? null,
4967
+ nullable: true
4968
+ })
4969
+ })
4970
+ });
4971
+ var SecuritySchemeItem = builder.objectRef("SecuritySchemeItem").implement({
4972
+ fields: (t) => ({
4973
+ name: t.exposeString("name"),
4974
+ type: t.field({
4975
+ type: SecuritySchemeTypeEnum,
4976
+ resolve: (parent) => parent.type
4977
+ }),
4978
+ description: t.exposeString("description", { nullable: true }),
4979
+ in: t.field({
4980
+ type: SecuritySchemeInEnum,
4981
+ resolve: (parent) => parent.in ?? null,
4982
+ nullable: true
4983
+ }),
4984
+ paramName: t.exposeString("paramName", { nullable: true }),
4985
+ scheme: t.exposeString("scheme", { nullable: true }),
4986
+ bearerFormat: t.exposeString("bearerFormat", { nullable: true }),
4987
+ openIdConnectUrl: t.exposeString("openIdConnectUrl", { nullable: true }),
4988
+ flows: t.field({
4989
+ type: OAuthFlowsItem,
4990
+ resolve: (parent) => parent.flows ?? null,
4991
+ nullable: true
4992
+ }),
4993
+ extensions: t.field({
4994
+ type: JSONObjectScalar,
4995
+ resolve: (parent) => parent.extensions ?? null,
4996
+ nullable: true
4997
+ })
4998
+ })
4999
+ });
5000
+ var SecurityRequirementScheme = builder.objectRef("SecurityRequirementScheme").implement({
5001
+ fields: (t) => ({
5002
+ scheme: t.field({
5003
+ type: SecuritySchemeItem,
5004
+ resolve: (parent) => parent.scheme
5005
+ }),
5006
+ scopes: t.stringList({ resolve: (parent) => parent.scopes })
5007
+ })
5008
+ });
5009
+ var SecurityRequirementItem = builder.objectRef("SecurityRequirementItem").implement({
5010
+ fields: (t) => ({
5011
+ schemes: t.field({
5012
+ type: [SecurityRequirementScheme],
5013
+ resolve: (parent) => parent.schemes
5014
+ })
5015
+ })
5016
+ });
5017
+ var resolveSecuritySchemes = (schema2) => {
5018
+ const securitySchemes = schema2.components?.securitySchemes ?? {};
5019
+ return Object.entries(securitySchemes).map(
5020
+ ([name, scheme]) => ({
5021
+ name,
5022
+ type: scheme.type,
5023
+ description: scheme.description,
5024
+ in: scheme.in,
5025
+ paramName: scheme.name,
5026
+ // apiKey's `name` field (parameter name)
5027
+ scheme: scheme.scheme,
5028
+ // http scheme (e.g. "bearer", "basic")
5029
+ bearerFormat: scheme.bearerFormat,
5030
+ openIdConnectUrl: scheme.openIdConnectUrl,
5031
+ flows: scheme.flows,
5032
+ extensions: resolveExtensions(scheme)
5033
+ })
5034
+ );
5035
+ };
5036
+ var resolveSecurityRequirements = (securityArray, securitySchemes) => {
5037
+ if (!securityArray) return [];
5038
+ return securityArray.map((req) => ({
5039
+ schemes: Object.entries(req).filter(([key]) => !key.startsWith("__")).flatMap(([schemeName, scopes]) => {
5040
+ const scheme = securitySchemes.find((s) => s.name === schemeName);
5041
+ if (!scheme) return [];
5042
+ return [{ scheme, scopes }];
5043
+ })
5044
+ }));
5045
+ };
4921
5046
  var resolveWebhooks = (schema2) => {
4922
5047
  const webhooks = schema2.webhooks ?? {};
4923
5048
  return Object.entries(webhooks).flatMap(
@@ -5117,6 +5242,16 @@ var OperationItem = builder.objectRef("OperationItem").implement({
5117
5242
  nullable: true
5118
5243
  }),
5119
5244
  deprecated: t.exposeBoolean("deprecated", { nullable: true }),
5245
+ security: t.field({
5246
+ type: [SecurityRequirementItem],
5247
+ nullable: true,
5248
+ resolve: (parent, _, ctx) => {
5249
+ const securitySchemes = resolveSecuritySchemes(ctx.schema);
5250
+ const securityArray = parent.security ?? ctx.schema.security;
5251
+ if (!securityArray) return null;
5252
+ return resolveSecurityRequirements(securityArray, securitySchemes);
5253
+ }
5254
+ }),
5120
5255
  extensions: t.field({
5121
5256
  type: JSONObjectScalar,
5122
5257
  resolve: (parent) => resolveExtensions(parent),
@@ -5147,6 +5282,11 @@ Components.implement({
5147
5282
  }));
5148
5283
  },
5149
5284
  nullable: true
5285
+ }),
5286
+ securitySchemes: t.field({
5287
+ type: [SecuritySchemeItem],
5288
+ resolve: (_parent, _args, ctx) => resolveSecuritySchemes(ctx.schema),
5289
+ nullable: true
5150
5290
  })
5151
5291
  })
5152
5292
  });
@@ -5244,6 +5384,15 @@ var Schema = builder.objectRef("Schema").implement({
5244
5384
  resolve: (root) => root.components,
5245
5385
  nullable: true
5246
5386
  }),
5387
+ security: t.field({
5388
+ type: [SecurityRequirementItem],
5389
+ nullable: true,
5390
+ resolve: (root) => {
5391
+ const securitySchemes = resolveSecuritySchemes(root);
5392
+ if (!root.security) return null;
5393
+ return resolveSecurityRequirements(root.security, securitySchemes);
5394
+ }
5395
+ }),
5247
5396
  extensions: t.field({
5248
5397
  type: JSONObjectScalar,
5249
5398
  resolve: (root) => resolveExtensions(root),
@@ -6125,6 +6274,7 @@ var viteApiPlugin = async () => {
6125
6274
  ` supportedLanguages: config.defaults?.apis?.supportedLanguages,`,
6126
6275
  ` disablePlayground: config.defaults?.apis?.disablePlayground,`,
6127
6276
  ` disableSidecar: config.defaults?.apis?.disableSidecar,`,
6277
+ ` disableSecurity: config.defaults?.apis?.disableSecurity ?? true,`,
6128
6278
  ` showVersionSelect: config.defaults?.apis?.showVersionSelect ?? "if-available",`,
6129
6279
  ` expandAllTags: config.defaults?.apis?.expandAllTags ?? true,`,
6130
6280
  ` showInfoPage: config.defaults?.apis?.showInfoPage ?? true,`,
@@ -6149,6 +6299,7 @@ var viteApiPlugin = async () => {
6149
6299
  ` supportedLanguages: config.defaults?.apis?.supportedLanguages,`,
6150
6300
  ` disablePlayground: config.defaults?.apis?.disablePlayground,`,
6151
6301
  ` disableSidecar: config.defaults?.apis?.disableSidecar,`,
6302
+ ` disableSecurity: config.defaults?.apis?.disableSecurity ?? true,`,
6152
6303
  ` showVersionSelect: config.defaults?.apis?.showVersionSelect ?? "if-available",`,
6153
6304
  ` expandAllTags: config.defaults?.apis?.expandAllTags ?? false,`,
6154
6305
  ` showInfoPage: config.defaults?.apis?.showInfoPage ?? true,`,
@@ -6612,6 +6763,16 @@ var getMarkdownOutputPath = (distDir, routePath) => {
6612
6763
  const segments = routePath === "/" ? ["index"] : routePath.split("/").filter(Boolean);
6613
6764
  return `${path14.join(distDir, ...segments)}.md`;
6614
6765
  };
6766
+ var resolveMarkdownRoutePath = (requestUrl, basePath) => {
6767
+ const pathname = requestUrl.split(/[?#]/)[0] ?? requestUrl;
6768
+ const routePath = joinUrl(
6769
+ pathname.slice(basePath.length).replace(/\.mdx?$/, "")
6770
+ );
6771
+ if (routePath === "/index") {
6772
+ return "/";
6773
+ }
6774
+ return routePath;
6775
+ };
6615
6776
  var viteMarkdownExportPlugin = () => {
6616
6777
  let markdownFiles = {};
6617
6778
  let markdownFileInfos = [];
@@ -6663,9 +6824,7 @@ var viteMarkdownExportPlugin = () => {
6663
6824
  return next();
6664
6825
  }
6665
6826
  const basePath = joinUrl(config2.basePath);
6666
- const routePath = joinUrl(
6667
- req.url.slice(basePath.length).replace(/\.mdx?$/, "")
6668
- );
6827
+ const routePath = resolveMarkdownRoutePath(req.url, basePath);
6669
6828
  const filePath = markdownFiles[routePath];
6670
6829
  if (!filePath) return next();
6671
6830
  try {
@@ -310,7 +310,6 @@ declare const AuthenticationSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
310
310
  apple: "apple";
311
311
  facebook: "facebook";
312
312
  github: "github";
313
- phone: "phone";
314
313
  twitter: "twitter";
315
314
  google: "google";
316
315
  microsoft: "microsoft";
@@ -465,6 +464,7 @@ export declare const ZudokuConfig: z.ZodObject<{
465
464
  reloadDocument: z.ZodOptional<z.ZodBoolean>;
466
465
  }, z.core.$strip>>;
467
466
  showPoweredBy: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
467
+ notFoundPage: z.ZodOptional<z.ZodCustom<NonNullable<ReactNode>, NonNullable<ReactNode>>>;
468
468
  banner: z.ZodOptional<z.ZodObject<{
469
469
  message: z.ZodCustom<NonNullable<ReactNode>, NonNullable<ReactNode>>;
470
470
  color: z.ZodOptional<z.ZodCustom<"info" | (string & {}) | "note" | "tip" | "caution" | "danger", "info" | (string & {}) | "note" | "tip" | "caution" | "danger">>;
@@ -6674,7 +6674,6 @@ export declare const ZudokuConfig: z.ZodObject<{
6674
6674
  apple: "apple";
6675
6675
  facebook: "facebook";
6676
6676
  github: "github";
6677
- phone: "phone";
6678
6677
  twitter: "twitter";
6679
6678
  google: "google";
6680
6679
  microsoft: "microsoft";
@@ -0,0 +1,3 @@
1
+ export declare function LogoutCallbackHandler({ handleLogoutCallback, }: {
2
+ handleLogoutCallback: () => string;
3
+ }): null;
@@ -10,5 +10,5 @@ declare module "../state.js" {
10
10
  firebase: FirebaseProviderData;
11
11
  }
12
12
  }
13
- declare const supabaseAuth: AuthenticationProviderInitializer<FirebaseAuthenticationConfig>;
14
- export default supabaseAuth;
13
+ declare const firebaseAuth: AuthenticationProviderInitializer<FirebaseAuthenticationConfig>;
14
+ export default firebaseAuth;
@@ -18,6 +18,7 @@ declare module "../state.js" {
18
18
  }
19
19
  }
20
20
  export declare const OPENID_CALLBACK_PATH = "/oauth/callback";
21
+ export declare const OPENID_LOGOUT_CALLBACK_PATH = "/oauth/logout-callback";
21
22
  export declare class OpenIDAuthenticationProvider extends CoreAuthenticationPlugin implements AuthenticationPlugin {
22
23
  protected client: oauth.Client;
23
24
  protected issuer: string;
@@ -48,6 +49,7 @@ export declare class OpenIDAuthenticationProvider extends CoreAuthenticationPlug
48
49
  signRequest: (request: Request) => Promise<Request>;
49
50
  signOut: (_: AuthActionContext) => Promise<void>;
50
51
  onPageLoad: () => Promise<void>;
52
+ handleLogoutCallback: () => string;
51
53
  handleCallback: () => Promise<string>;
52
54
  getRoutes(): {
53
55
  path: string;
@@ -1 +1 @@
1
- export declare const Header: import("react").NamedExoticComponent<object>;
1
+ export declare const Header: import("react").MemoExoticComponent<() => import("react/jsx-runtime").JSX.Element>;
@@ -61,6 +61,7 @@ type Site = Partial<{
61
61
  href?: string;
62
62
  reloadDocument?: boolean;
63
63
  };
64
+ notFoundPage?: ReactNode;
64
65
  banner?: {
65
66
  message: ReactNode;
66
67
  color?: "note" | "tip" | "info" | "caution" | "danger" | (string & {});
@@ -110,6 +111,7 @@ export declare class ZudokuContext {
110
111
  readonly queryClient: QueryClient;
111
112
  readonly options: ZudokuContextOptions;
112
113
  readonly env: Record<string, string | undefined>;
114
+ readonly notFoundPage?: ReactNode;
113
115
  readonly protectedRoutes: ReturnType<typeof normalizeProtectedRoutes>;
114
116
  private readonly plugins;
115
117
  private readonly emitter;
@@ -0,0 +1,21 @@
1
+ import type { SecuritySchemeIn, SecuritySchemeType } from "./graphql/graphql.js";
2
+ type SecurityScheme = {
3
+ name: string;
4
+ type: SecuritySchemeType;
5
+ description?: string | null;
6
+ in?: SecuritySchemeIn | null;
7
+ paramName?: string | null;
8
+ scheme?: string | null;
9
+ bearerFormat?: string | null;
10
+ openIdConnectUrl?: string | null;
11
+ };
12
+ type SecurityRequirement = {
13
+ schemes: Array<{
14
+ scopes: Array<string>;
15
+ scheme: SecurityScheme;
16
+ }>;
17
+ };
18
+ export declare const SecurityRequirements: ({ security, }: {
19
+ security?: SecurityRequirement[] | null;
20
+ }) => import("react/jsx-runtime").JSX.Element | null;
21
+ export {};
@@ -1,5 +1,5 @@
1
1
  import type { ChangeEventHandler } from "react";
2
- export declare const SimpleSelect: ({ value, onChange, className, options, showChevrons, }: {
2
+ export declare const SimpleSelect: ({ value, onChange, className, options, showChevrons, "aria-label": ariaLabel, }: {
3
3
  value: string;
4
4
  onChange: ChangeEventHandler<HTMLSelectElement>;
5
5
  className?: string;
@@ -8,4 +8,5 @@ export declare const SimpleSelect: ({ value, onChange, className, options, showC
8
8
  label: string;
9
9
  }[];
10
10
  showChevrons?: boolean;
11
+ "aria-label"?: string;
11
12
  }) => import("react/jsx-runtime").JSX.Element;
@@ -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
- 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 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;
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 schemas {\n name\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;
@@ -57,6 +57,7 @@ export type Scalars = {
57
57
  export type Components = {
58
58
  __typename?: "Components";
59
59
  schemas?: Maybe<Array<SchemaItem>>;
60
+ securitySchemes?: Maybe<Array<SecuritySchemeItem>>;
60
61
  };
61
62
  export type EncodingItem = {
62
63
  __typename?: "EncodingItem";
@@ -82,6 +83,25 @@ export type MediaTypeObject = {
82
83
  mediaType: Scalars["String"]["output"];
83
84
  schema?: Maybe<Scalars["JSONSchema"]["output"]>;
84
85
  };
86
+ export type OAuthFlowItem = {
87
+ __typename?: "OAuthFlowItem";
88
+ authorizationUrl?: Maybe<Scalars["String"]["output"]>;
89
+ refreshUrl?: Maybe<Scalars["String"]["output"]>;
90
+ scopes: Array<OAuthScopeItem>;
91
+ tokenUrl?: Maybe<Scalars["String"]["output"]>;
92
+ };
93
+ export type OAuthFlowsItem = {
94
+ __typename?: "OAuthFlowsItem";
95
+ authorizationCode?: Maybe<OAuthFlowItem>;
96
+ clientCredentials?: Maybe<OAuthFlowItem>;
97
+ implicit?: Maybe<OAuthFlowItem>;
98
+ password?: Maybe<OAuthFlowItem>;
99
+ };
100
+ export type OAuthScopeItem = {
101
+ __typename?: "OAuthScopeItem";
102
+ description: Scalars["String"]["output"];
103
+ name: Scalars["String"]["output"];
104
+ };
85
105
  export type OperationItem = {
86
106
  __typename?: "OperationItem";
87
107
  contentTypes: Array<Scalars["String"]["output"]>;
@@ -94,6 +114,7 @@ export type OperationItem = {
94
114
  path: Scalars["String"]["output"];
95
115
  requestBody?: Maybe<RequestBodyObject>;
96
116
  responses: Array<ResponseItem>;
117
+ security?: Maybe<Array<SecurityRequirementItem>>;
97
118
  servers: Array<Server>;
98
119
  slug: Scalars["String"]["output"];
99
120
  summary?: Maybe<Scalars["String"]["output"]>;
@@ -154,6 +175,7 @@ export type Schema = {
154
175
  openapi: Scalars["String"]["output"];
155
176
  operations: Array<OperationItem>;
156
177
  paths: Array<PathItem>;
178
+ security?: Maybe<Array<SecurityRequirementItem>>;
157
179
  servers: Array<Server>;
158
180
  summary?: Maybe<Scalars["String"]["output"]>;
159
181
  tag?: Maybe<SchemaTag>;
@@ -211,6 +233,30 @@ export type SchemaTag = {
211
233
  slug?: Maybe<Scalars["String"]["output"]>;
212
234
  };
213
235
  export type SchemaType = "file" | "raw" | "url";
236
+ export type SecurityRequirementItem = {
237
+ __typename?: "SecurityRequirementItem";
238
+ schemes: Array<SecurityRequirementScheme>;
239
+ };
240
+ export type SecurityRequirementScheme = {
241
+ __typename?: "SecurityRequirementScheme";
242
+ scheme: SecuritySchemeItem;
243
+ scopes: Array<Scalars["String"]["output"]>;
244
+ };
245
+ export type SecuritySchemeIn = "cookie" | "header" | "query";
246
+ export type SecuritySchemeItem = {
247
+ __typename?: "SecuritySchemeItem";
248
+ bearerFormat?: Maybe<Scalars["String"]["output"]>;
249
+ description?: Maybe<Scalars["String"]["output"]>;
250
+ extensions?: Maybe<Scalars["JSONObject"]["output"]>;
251
+ flows?: Maybe<OAuthFlowsItem>;
252
+ in?: Maybe<SecuritySchemeIn>;
253
+ name: Scalars["String"]["output"];
254
+ openIdConnectUrl?: Maybe<Scalars["String"]["output"]>;
255
+ paramName?: Maybe<Scalars["String"]["output"]>;
256
+ scheme?: Maybe<Scalars["String"]["output"]>;
257
+ type: SecuritySchemeType;
258
+ };
259
+ export type SecuritySchemeType = "apiKey" | "http" | "mutualTLS" | "oauth2" | "openIdConnect";
214
260
  export type Server = {
215
261
  __typename?: "Server";
216
262
  description?: Maybe<Scalars["String"]["output"]>;
@@ -280,6 +326,64 @@ export type OperationsFragmentFragment = {
280
326
  summary?: string | null;
281
327
  }> | null;
282
328
  }> | null;
329
+ security?: Array<{
330
+ __typename?: "SecurityRequirementItem";
331
+ schemes: Array<{
332
+ __typename?: "SecurityRequirementScheme";
333
+ scopes: Array<string>;
334
+ scheme: {
335
+ __typename?: "SecuritySchemeItem";
336
+ name: string;
337
+ type: SecuritySchemeType;
338
+ description?: string | null;
339
+ in?: SecuritySchemeIn | null;
340
+ paramName?: string | null;
341
+ scheme?: string | null;
342
+ bearerFormat?: string | null;
343
+ openIdConnectUrl?: string | null;
344
+ flows?: {
345
+ __typename?: "OAuthFlowsItem";
346
+ implicit?: {
347
+ __typename?: "OAuthFlowItem";
348
+ authorizationUrl?: string | null;
349
+ scopes: Array<{
350
+ __typename?: "OAuthScopeItem";
351
+ name: string;
352
+ description: string;
353
+ }>;
354
+ } | null;
355
+ password?: {
356
+ __typename?: "OAuthFlowItem";
357
+ tokenUrl?: string | null;
358
+ scopes: Array<{
359
+ __typename?: "OAuthScopeItem";
360
+ name: string;
361
+ description: string;
362
+ }>;
363
+ } | null;
364
+ clientCredentials?: {
365
+ __typename?: "OAuthFlowItem";
366
+ tokenUrl?: string | null;
367
+ scopes: Array<{
368
+ __typename?: "OAuthScopeItem";
369
+ name: string;
370
+ description: string;
371
+ }>;
372
+ } | null;
373
+ authorizationCode?: {
374
+ __typename?: "OAuthFlowItem";
375
+ authorizationUrl?: string | null;
376
+ tokenUrl?: string | null;
377
+ scopes: Array<{
378
+ __typename?: "OAuthScopeItem";
379
+ name: string;
380
+ description: string;
381
+ }>;
382
+ } | null;
383
+ } | null;
384
+ };
385
+ }>;
386
+ }> | null;
283
387
  requestBody?: {
284
388
  __typename?: "RequestBodyObject";
285
389
  description?: string | null;
@@ -415,12 +519,60 @@ export type SchemaInfoQuery = {
415
519
  __typename?: "SchemaTag";
416
520
  name?: string | null;
417
521
  description?: string | null;
522
+ extensions?: any | null;
418
523
  }>;
419
524
  components?: {
420
525
  __typename?: "Components";
421
- schemas?: Array<{
422
- __typename?: "SchemaItem";
526
+ securitySchemes?: Array<{
527
+ __typename?: "SecuritySchemeItem";
423
528
  name: string;
529
+ type: SecuritySchemeType;
530
+ description?: string | null;
531
+ in?: SecuritySchemeIn | null;
532
+ paramName?: string | null;
533
+ scheme?: string | null;
534
+ bearerFormat?: string | null;
535
+ openIdConnectUrl?: string | null;
536
+ flows?: {
537
+ __typename?: "OAuthFlowsItem";
538
+ implicit?: {
539
+ __typename?: "OAuthFlowItem";
540
+ authorizationUrl?: string | null;
541
+ scopes: Array<{
542
+ __typename?: "OAuthScopeItem";
543
+ name: string;
544
+ description: string;
545
+ }>;
546
+ } | null;
547
+ password?: {
548
+ __typename?: "OAuthFlowItem";
549
+ tokenUrl?: string | null;
550
+ scopes: Array<{
551
+ __typename?: "OAuthScopeItem";
552
+ name: string;
553
+ description: string;
554
+ }>;
555
+ } | null;
556
+ clientCredentials?: {
557
+ __typename?: "OAuthFlowItem";
558
+ tokenUrl?: string | null;
559
+ scopes: Array<{
560
+ __typename?: "OAuthScopeItem";
561
+ name: string;
562
+ description: string;
563
+ }>;
564
+ } | null;
565
+ authorizationCode?: {
566
+ __typename?: "OAuthFlowItem";
567
+ authorizationUrl?: string | null;
568
+ tokenUrl?: string | null;
569
+ scopes: Array<{
570
+ __typename?: "OAuthScopeItem";
571
+ name: string;
572
+ description: string;
573
+ }>;
574
+ } | null;
575
+ } | null;
424
576
  }> | null;
425
577
  } | null;
426
578
  webhooks: Array<{
@@ -70,6 +70,7 @@ type BaseOasConfig = {
70
70
  }[];
71
71
  disablePlayground?: boolean;
72
72
  disableSidecar?: boolean;
73
+ disableSecurity?: boolean;
73
74
  showVersionSelect?: "always" | "if-available" | "hide";
74
75
  expandAllTags?: boolean;
75
76
  showInfoPage?: boolean;
@@ -0,0 +1,6 @@
1
+ import type { SecuritySchemeData } from "./scheme-forms/types.js";
2
+ export declare const AuthorizeDialog: ({ securitySchemes, open, onOpenChange, }: {
3
+ securitySchemes: SecuritySchemeData[];
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ }) => import("react/jsx-runtime").JSX.Element | null;