zudoku 0.0.0-f5761c9 → 0.0.0-ff3bc72
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/config/validators/validate.d.ts +14 -10
- package/dist/config/validators/validate.js +1 -0
- package/dist/config/validators/validate.js.map +1 -1
- package/dist/lib/authentication/state.d.ts +16 -0
- package/dist/lib/authentication/state.js +5 -0
- package/dist/lib/authentication/state.js.map +1 -1
- package/dist/lib/components/Banner.js +7 -1
- package/dist/lib/components/Banner.js.map +1 -1
- package/dist/lib/components/ErrorPage.js +1 -2
- package/dist/lib/components/ErrorPage.js.map +1 -1
- package/dist/lib/components/InlineCode.d.ts +2 -1
- package/dist/lib/components/InlineCode.js +9 -1
- package/dist/lib/components/InlineCode.js.map +1 -1
- package/dist/lib/components/Layout.js +1 -1
- package/dist/lib/components/Layout.js.map +1 -1
- package/dist/lib/core/DevPortalContext.d.ts +1 -1
- package/dist/lib/oas/graphql/index.js +12 -6
- package/dist/lib/oas/graphql/index.js.map +1 -1
- package/dist/lib/oas/parser/index.d.ts +1 -0
- package/dist/lib/oas/parser/index.js.map +1 -1
- package/dist/lib/plugins/openapi/Endpoint.d.ts +1 -3
- package/dist/lib/plugins/openapi/Endpoint.js +46 -8
- package/dist/lib/plugins/openapi/Endpoint.js.map +1 -1
- package/dist/lib/plugins/openapi/OperationList.js +1 -1
- package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
- package/dist/lib/plugins/openapi/PlaygroundDialogWrapper.d.ts +2 -1
- package/dist/lib/plugins/openapi/PlaygroundDialogWrapper.js +2 -2
- package/dist/lib/plugins/openapi/PlaygroundDialogWrapper.js.map +1 -1
- package/dist/lib/plugins/openapi/Sidecar.js +14 -3
- package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
- package/dist/lib/plugins/openapi/SimpleSelect.d.ts +2 -1
- package/dist/lib/plugins/openapi/SimpleSelect.js +1 -1
- package/dist/lib/plugins/openapi/SimpleSelect.js.map +1 -1
- package/dist/lib/plugins/openapi/graphql/gql.d.ts +10 -2
- package/dist/lib/plugins/openapi/graphql/gql.js +2 -1
- package/dist/lib/plugins/openapi/graphql/gql.js.map +1 -1
- package/dist/lib/plugins/openapi/graphql/graphql.d.ts +26 -0
- package/dist/lib/plugins/openapi/graphql/graphql.js +87 -0
- package/dist/lib/plugins/openapi/graphql/graphql.js.map +1 -1
- package/dist/lib/plugins/openapi/playground/Playground.d.ts +2 -1
- package/dist/lib/plugins/openapi/playground/Playground.js +13 -5
- package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
- package/dist/lib/plugins/openapi/playground/ResponseTab.js +1 -1
- package/dist/lib/plugins/openapi/playground/ResponseTab.js.map +1 -1
- package/dist/vite/config.js +12 -12
- package/dist/vite/config.js.map +1 -1
- package/dist/vite/plugin-frontmatter.d.ts +2 -0
- package/dist/vite/plugin-frontmatter.js +30 -0
- package/dist/vite/plugin-frontmatter.js.map +1 -0
- package/dist/vite/plugin-sidebar.js +14 -1
- package/dist/vite/plugin-sidebar.js.map +1 -1
- package/dist/vite/plugin.js +2 -2
- package/dist/vite/plugin.js.map +1 -1
- package/lib/{CategoryHeading-EN3W3xEN.js → CategoryHeading-ovR-zHRq.js} +2 -2
- package/lib/{CategoryHeading-EN3W3xEN.js.map → CategoryHeading-ovR-zHRq.js.map} +1 -1
- package/lib/{DeveloperHint-CZ4VwuKw.js → DeveloperHint-YeWHKvyr.js} +2 -2
- package/lib/{DeveloperHint-CZ4VwuKw.js.map → DeveloperHint-YeWHKvyr.js.map} +1 -1
- package/lib/ErrorPage-CsZAN_za.js +16 -0
- package/lib/ErrorPage-CsZAN_za.js.map +1 -0
- package/lib/{Input-DulGxZh-.js → Input-CtVUl3eT.js} +3 -3
- package/lib/{Input-DulGxZh-.js.map → Input-CtVUl3eT.js.map} +1 -1
- package/lib/{Markdown-BUUIyZbc.js → Markdown-DapSf3wG.js} +8 -2
- package/lib/{Markdown-BUUIyZbc.js.map → Markdown-DapSf3wG.js.map} +1 -1
- package/lib/{MdxPage-COBmXj_4.js → MdxPage-BqBWsXZ1.js} +3 -3
- package/lib/{MdxPage-COBmXj_4.js.map → MdxPage-BqBWsXZ1.js.map} +1 -1
- package/lib/{OperationList-BwJXexkA.js → OperationList-CYrmxPa8.js} +150 -108
- package/lib/OperationList-CYrmxPa8.js.map +1 -0
- package/lib/{Route-CX_-Q1HO.js → Route-Q5mqNQrv.js} +2 -2
- package/lib/{Route-CX_-Q1HO.js.map → Route-Q5mqNQrv.js.map} +1 -1
- package/lib/{SidebarBadge-gvlvsv3E.js → SidebarBadge-Dx7jtnoA.js} +3 -3
- package/lib/{SidebarBadge-gvlvsv3E.js.map → SidebarBadge-Dx7jtnoA.js.map} +1 -1
- package/lib/{SlotletProvider-CULK8zmk.js → SlotletProvider-D3UD5Go3.js} +4 -4
- package/lib/{SlotletProvider-CULK8zmk.js.map → SlotletProvider-D3UD5Go3.js.map} +1 -1
- package/lib/assets/{worker-DgVH8VJc.js → worker-BP8Uzflt.js} +1293 -1286
- package/lib/assets/{worker-DgVH8VJc.js.map → worker-BP8Uzflt.js.map} +1 -1
- package/lib/{index-BuA1OA5H.js → index-BlJ2rj99.js} +1770 -1643
- package/lib/index-BlJ2rj99.js.map +1 -0
- package/lib/{index-Q0TPJvr8.js → index-BngPzhKn.js} +3 -3
- package/lib/{index-Q0TPJvr8.js.map → index-BngPzhKn.js.map} +1 -1
- package/lib/{index-BfA1oLPP.js → index-Dolisrci.js} +3 -3
- package/lib/{index-BfA1oLPP.js.map → index-Dolisrci.js.map} +1 -1
- package/lib/state-hNe1dw4B.js +548 -0
- package/lib/state-hNe1dw4B.js.map +1 -0
- package/lib/zudoku.auth-auth0.js +1 -1
- package/lib/zudoku.auth-clerk.js +1 -1
- package/lib/zudoku.auth-openid.js +4 -4
- package/lib/zudoku.components.js +470 -466
- package/lib/zudoku.components.js.map +1 -1
- package/lib/zudoku.openapi-worker.js +1617 -1610
- package/lib/zudoku.openapi-worker.js.map +1 -1
- package/lib/zudoku.plugin-api-keys.js +5 -5
- package/lib/zudoku.plugin-custom-page.js +1 -1
- package/lib/zudoku.plugin-markdown.js +1 -1
- package/lib/zudoku.plugin-openapi.js +4 -4
- package/package.json +10 -1
- package/src/lib/authentication/state.ts +17 -0
- package/src/lib/components/Banner.tsx +12 -2
- package/src/lib/components/ErrorPage.tsx +0 -2
- package/src/lib/components/InlineCode.tsx +10 -0
- package/src/lib/components/Layout.tsx +1 -1
- package/src/lib/core/DevPortalContext.ts +1 -1
- package/src/lib/oas/graphql/index.ts +15 -11
- package/src/lib/oas/parser/index.ts +1 -0
- package/src/lib/plugins/openapi/Endpoint.tsx +86 -22
- package/src/lib/plugins/openapi/OperationList.tsx +3 -1
- package/src/lib/plugins/openapi/PlaygroundDialogWrapper.tsx +3 -0
- package/src/lib/plugins/openapi/Sidecar.tsx +17 -2
- package/src/lib/plugins/openapi/SimpleSelect.tsx +10 -2
- package/src/lib/plugins/openapi/graphql/gql.ts +11 -3
- package/src/lib/plugins/openapi/graphql/graphql.ts +113 -1
- package/src/lib/plugins/openapi/playground/Playground.tsx +39 -5
- package/src/lib/plugins/openapi/playground/ResponseTab.tsx +0 -1
- package/dist/vite/plugin-icons.d.ts +0 -3
- package/dist/vite/plugin-icons.js +0 -47
- package/dist/vite/plugin-icons.js.map +0 -1
- package/lib/ErrorPage-C5Pnyfbg.js +0 -18
- package/lib/ErrorPage-C5Pnyfbg.js.map +0 -1
- package/lib/OperationList-BwJXexkA.js.map +0 -1
- package/lib/index-BuA1OA5H.js.map +0 -1
- package/lib/state-BUM4jc0J.js +0 -288
- package/lib/state-BUM4jc0J.js.map +0 -1
|
@@ -131,6 +131,7 @@ export type Schema = {
|
|
|
131
131
|
openapi: Scalars["String"]["output"];
|
|
132
132
|
operations: Array<OperationItem>;
|
|
133
133
|
paths: Array<PathItem>;
|
|
134
|
+
servers: Array<Server>;
|
|
134
135
|
tags: Array<SchemaTag>;
|
|
135
136
|
title: Scalars["String"]["output"];
|
|
136
137
|
url: Scalars["String"]["output"];
|
|
@@ -157,12 +158,32 @@ export type SchemaTag = {
|
|
|
157
158
|
|
|
158
159
|
export type SchemaType = "file" | "raw" | "url";
|
|
159
160
|
|
|
161
|
+
export type Server = {
|
|
162
|
+
__typename?: "Server";
|
|
163
|
+
description?: Maybe<Scalars["String"]["output"]>;
|
|
164
|
+
url: Scalars["String"]["output"];
|
|
165
|
+
};
|
|
166
|
+
|
|
160
167
|
export type TagItem = {
|
|
161
168
|
__typename?: "TagItem";
|
|
162
169
|
description?: Maybe<Scalars["String"]["output"]>;
|
|
163
170
|
name: Scalars["String"]["output"];
|
|
164
171
|
};
|
|
165
172
|
|
|
173
|
+
export type ServersQueryQueryVariables = Exact<{
|
|
174
|
+
input: Scalars["JSON"]["input"];
|
|
175
|
+
type: SchemaType;
|
|
176
|
+
}>;
|
|
177
|
+
|
|
178
|
+
export type ServersQueryQuery = {
|
|
179
|
+
__typename?: "Query";
|
|
180
|
+
schema: {
|
|
181
|
+
__typename?: "Schema";
|
|
182
|
+
url: string;
|
|
183
|
+
servers: Array<{ __typename?: "Server"; url: string }>;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
|
|
166
187
|
export type OperationsFragmentFragment = {
|
|
167
188
|
__typename?: "OperationItem";
|
|
168
189
|
slug: string;
|
|
@@ -249,7 +270,11 @@ export type GetServerQueryQueryVariables = Exact<{
|
|
|
249
270
|
|
|
250
271
|
export type GetServerQueryQuery = {
|
|
251
272
|
__typename?: "Query";
|
|
252
|
-
schema: {
|
|
273
|
+
schema: {
|
|
274
|
+
__typename?: "Schema";
|
|
275
|
+
url: string;
|
|
276
|
+
servers: Array<{ __typename?: "Server"; url: string }>;
|
|
277
|
+
};
|
|
253
278
|
};
|
|
254
279
|
|
|
255
280
|
export type GetCategoriesQueryVariables = Exact<{
|
|
@@ -423,6 +448,83 @@ export const OperationsFragmentFragmentDoc = {
|
|
|
423
448
|
},
|
|
424
449
|
],
|
|
425
450
|
} as unknown as DocumentNode<OperationsFragmentFragment, unknown>;
|
|
451
|
+
export const ServersQueryDocument = {
|
|
452
|
+
kind: "Document",
|
|
453
|
+
definitions: [
|
|
454
|
+
{
|
|
455
|
+
kind: "OperationDefinition",
|
|
456
|
+
operation: "query",
|
|
457
|
+
name: { kind: "Name", value: "ServersQuery" },
|
|
458
|
+
variableDefinitions: [
|
|
459
|
+
{
|
|
460
|
+
kind: "VariableDefinition",
|
|
461
|
+
variable: {
|
|
462
|
+
kind: "Variable",
|
|
463
|
+
name: { kind: "Name", value: "input" },
|
|
464
|
+
},
|
|
465
|
+
type: {
|
|
466
|
+
kind: "NonNullType",
|
|
467
|
+
type: { kind: "NamedType", name: { kind: "Name", value: "JSON" } },
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
kind: "VariableDefinition",
|
|
472
|
+
variable: { kind: "Variable", name: { kind: "Name", value: "type" } },
|
|
473
|
+
type: {
|
|
474
|
+
kind: "NonNullType",
|
|
475
|
+
type: {
|
|
476
|
+
kind: "NamedType",
|
|
477
|
+
name: { kind: "Name", value: "SchemaType" },
|
|
478
|
+
},
|
|
479
|
+
},
|
|
480
|
+
},
|
|
481
|
+
],
|
|
482
|
+
selectionSet: {
|
|
483
|
+
kind: "SelectionSet",
|
|
484
|
+
selections: [
|
|
485
|
+
{
|
|
486
|
+
kind: "Field",
|
|
487
|
+
name: { kind: "Name", value: "schema" },
|
|
488
|
+
arguments: [
|
|
489
|
+
{
|
|
490
|
+
kind: "Argument",
|
|
491
|
+
name: { kind: "Name", value: "input" },
|
|
492
|
+
value: {
|
|
493
|
+
kind: "Variable",
|
|
494
|
+
name: { kind: "Name", value: "input" },
|
|
495
|
+
},
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
kind: "Argument",
|
|
499
|
+
name: { kind: "Name", value: "type" },
|
|
500
|
+
value: {
|
|
501
|
+
kind: "Variable",
|
|
502
|
+
name: { kind: "Name", value: "type" },
|
|
503
|
+
},
|
|
504
|
+
},
|
|
505
|
+
],
|
|
506
|
+
selectionSet: {
|
|
507
|
+
kind: "SelectionSet",
|
|
508
|
+
selections: [
|
|
509
|
+
{ kind: "Field", name: { kind: "Name", value: "url" } },
|
|
510
|
+
{
|
|
511
|
+
kind: "Field",
|
|
512
|
+
name: { kind: "Name", value: "servers" },
|
|
513
|
+
selectionSet: {
|
|
514
|
+
kind: "SelectionSet",
|
|
515
|
+
selections: [
|
|
516
|
+
{ kind: "Field", name: { kind: "Name", value: "url" } },
|
|
517
|
+
],
|
|
518
|
+
},
|
|
519
|
+
},
|
|
520
|
+
],
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
],
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
],
|
|
527
|
+
} as unknown as DocumentNode<ServersQueryQuery, ServersQueryQueryVariables>;
|
|
426
528
|
export const AllOperationsDocument = {
|
|
427
529
|
kind: "Document",
|
|
428
530
|
definitions: [
|
|
@@ -727,6 +829,16 @@ export const GetServerQueryDocument = {
|
|
|
727
829
|
kind: "SelectionSet",
|
|
728
830
|
selections: [
|
|
729
831
|
{ kind: "Field", name: { kind: "Name", value: "url" } },
|
|
832
|
+
{
|
|
833
|
+
kind: "Field",
|
|
834
|
+
name: { kind: "Name", value: "servers" },
|
|
835
|
+
selectionSet: {
|
|
836
|
+
kind: "SelectionSet",
|
|
837
|
+
selections: [
|
|
838
|
+
{ kind: "Field", name: { kind: "Name", value: "url" } },
|
|
839
|
+
],
|
|
840
|
+
},
|
|
841
|
+
},
|
|
730
842
|
],
|
|
731
843
|
},
|
|
732
844
|
},
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useMutation } from "@tanstack/react-query";
|
|
2
|
-
import { Fragment, useEffect, useRef } from "react";
|
|
2
|
+
import { Fragment, useEffect, useRef, useTransition } from "react";
|
|
3
3
|
import { FormProvider, useForm } from "react-hook-form";
|
|
4
|
+
import { useSelectedServerStore } from "../../../authentication/state.js";
|
|
4
5
|
import { useApiIdentities } from "../../../components/context/ZudokuContext.js";
|
|
5
6
|
import {
|
|
6
7
|
Select,
|
|
@@ -62,6 +63,7 @@ export type PlaygroundForm = {
|
|
|
62
63
|
|
|
63
64
|
export type PlaygroundContentProps = {
|
|
64
65
|
server: string;
|
|
66
|
+
servers?: string[];
|
|
65
67
|
url: string;
|
|
66
68
|
method: string;
|
|
67
69
|
headers?: Header[];
|
|
@@ -72,6 +74,7 @@ export type PlaygroundContentProps = {
|
|
|
72
74
|
|
|
73
75
|
export const Playground = ({
|
|
74
76
|
server,
|
|
77
|
+
servers,
|
|
75
78
|
url,
|
|
76
79
|
method,
|
|
77
80
|
headers = [],
|
|
@@ -79,6 +82,8 @@ export const Playground = ({
|
|
|
79
82
|
pathParams = [],
|
|
80
83
|
defaultBody = "",
|
|
81
84
|
}: PlaygroundContentProps) => {
|
|
85
|
+
const { selectedServer, setSelectedServer } = useSelectedServerStore();
|
|
86
|
+
const [, startTransition] = useTransition();
|
|
82
87
|
const { register, control, handleSubmit, watch, setValue, ...form } =
|
|
83
88
|
useForm<PlaygroundForm>({
|
|
84
89
|
defaultValues: {
|
|
@@ -114,7 +119,7 @@ export const Playground = ({
|
|
|
114
119
|
|
|
115
120
|
const queryMutation = useMutation({
|
|
116
121
|
mutationFn: async (data: PlaygroundForm) => {
|
|
117
|
-
const requestUrl = createUrl(server, url, data);
|
|
122
|
+
const requestUrl = createUrl(selectedServer ?? server, url, data);
|
|
118
123
|
const start = performance.now();
|
|
119
124
|
|
|
120
125
|
const request = new Request(requestUrl, {
|
|
@@ -200,19 +205,48 @@ export const Playground = ({
|
|
|
200
205
|
</Fragment>
|
|
201
206
|
));
|
|
202
207
|
|
|
208
|
+
const serverSelect = (
|
|
209
|
+
<div className="inline-block opacity-50 hover:opacity-100 transition">
|
|
210
|
+
{servers && servers.length > 1 ? (
|
|
211
|
+
<Select
|
|
212
|
+
onValueChange={(value) => {
|
|
213
|
+
startTransition(() => {
|
|
214
|
+
setSelectedServer(value);
|
|
215
|
+
});
|
|
216
|
+
}}
|
|
217
|
+
value={selectedServer}
|
|
218
|
+
>
|
|
219
|
+
<SelectTrigger className="p-0 border-none flex-row-reverse bg-transparent text-xs gap-0.5 h-auto">
|
|
220
|
+
<SelectValue />
|
|
221
|
+
</SelectTrigger>
|
|
222
|
+
<SelectContent>
|
|
223
|
+
{servers.map((s) => (
|
|
224
|
+
<SelectItem key={s} value={s}>
|
|
225
|
+
{s.replace(/^https?:\/\//, "")}
|
|
226
|
+
</SelectItem>
|
|
227
|
+
))}
|
|
228
|
+
</SelectContent>
|
|
229
|
+
</Select>
|
|
230
|
+
) : (
|
|
231
|
+
<span>{server.replace(/^https?:\/\//, "")}</span>
|
|
232
|
+
)}
|
|
233
|
+
</div>
|
|
234
|
+
);
|
|
235
|
+
|
|
203
236
|
return (
|
|
204
237
|
<FormProvider
|
|
205
238
|
{...{ register, control, handleSubmit, watch, setValue, ...form }}
|
|
206
239
|
>
|
|
207
240
|
<form onSubmit={handleSubmit((data) => queryMutation.mutateAsync(data))}>
|
|
208
|
-
<div className="grid grid-cols-
|
|
241
|
+
<div className="grid grid-cols-[8fr_7fr] text-sm h-full">
|
|
209
242
|
<div className="flex flex-col gap-4 p-8 bg-muted/50 after:bg-muted-foreground/20 relative after:absolute after:w-px after:inset-0 after:left-auto">
|
|
210
243
|
<div className="flex gap-2 items-stretch">
|
|
211
244
|
<div className="flex flex-1 items-center w-full border rounded-md">
|
|
212
245
|
<div className="border-r p-2 bg-muted rounded-l-md self-stretch font-semibold font-mono">
|
|
213
246
|
{method.toUpperCase()}
|
|
214
247
|
</div>
|
|
215
|
-
<div className="p-2 font-mono text-xs">
|
|
248
|
+
<div className="flex items-center flex-wrap p-2 font-mono text-xs">
|
|
249
|
+
{serverSelect}
|
|
216
250
|
{path}
|
|
217
251
|
{urlQueryParams.length > 0 ? "?" : ""}
|
|
218
252
|
{urlQueryParams}
|
|
@@ -296,7 +330,7 @@ export const Playground = ({
|
|
|
296
330
|
</TabsContent>
|
|
297
331
|
</Tabs>
|
|
298
332
|
</div>
|
|
299
|
-
<div className="p-8 bg-muted/70">
|
|
333
|
+
<div className="min-w-0 p-8 bg-muted/70">
|
|
300
334
|
{queryMutation.error ? (
|
|
301
335
|
<div className="flex flex-col gap-2">
|
|
302
336
|
{formState.pathParams.some((p) => p.value === "") && (
|
|
@@ -54,7 +54,6 @@ export const ResponseTab = ({
|
|
|
54
54
|
view === "raw" ? (jsonContent ? "plain" : detectedLanguage) : "json"
|
|
55
55
|
}
|
|
56
56
|
noBackground
|
|
57
|
-
showLanguageIndicator
|
|
58
57
|
// playground dialog has h-5/6 ≈ 83.333vh
|
|
59
58
|
className="overflow-x-auto p-4 text-xs max-h-[calc(83.333vh-180px)]"
|
|
60
59
|
code={view === "raw" ? body : beautifiedBody}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import matter from "gray-matter";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
-
const matchIconAnnotation = /"icon":\s*"(.*?)"/g;
|
|
4
|
-
const toPascalCase = (str) => str.replace(/(^\w|-\w)/g, (match) => match.replace("-", "").toUpperCase());
|
|
5
|
-
export const replaceSidebarIcons = (code) => {
|
|
6
|
-
const collectedIcons = new Set();
|
|
7
|
-
let match;
|
|
8
|
-
while ((match = matchIconAnnotation.exec(code)) !== null) {
|
|
9
|
-
collectedIcons.add(match[1]);
|
|
10
|
-
}
|
|
11
|
-
const importStatement = `import { ${[...collectedIcons].map(toPascalCase).join(", ")} } from "zudoku/icons";`;
|
|
12
|
-
const replacedString = code.replaceAll(matchIconAnnotation,
|
|
13
|
-
// The element will be created by the implementers side
|
|
14
|
-
(_, iconName) => `"icon": ${toPascalCase(iconName)}`);
|
|
15
|
-
return `${importStatement}export const configuredSidebar = ${replacedString};`;
|
|
16
|
-
};
|
|
17
|
-
// This plugin is responsible to restart the dev server when a sidebar icon is changed inside a markdown file.
|
|
18
|
-
export const viteIconsPlugin = () => {
|
|
19
|
-
const iconMap = new Map();
|
|
20
|
-
return {
|
|
21
|
-
enforce: "pre",
|
|
22
|
-
name: "zudoku-icons-plugin",
|
|
23
|
-
configureServer: ({ watcher, restart }) => {
|
|
24
|
-
watcher.on("change", async (filePath) => {
|
|
25
|
-
if (/\.mdx?$/.test(filePath)) {
|
|
26
|
-
const code = await readFile(filePath, "utf-8");
|
|
27
|
-
const { sidebar_icon: sidebarIcon } = matter(code).data;
|
|
28
|
-
const previousIcon = iconMap.get(filePath);
|
|
29
|
-
if ((!previousIcon && sidebarIcon) ||
|
|
30
|
-
(previousIcon && !sidebarIcon) ||
|
|
31
|
-
previousIcon !== sidebarIcon) {
|
|
32
|
-
await restart();
|
|
33
|
-
}
|
|
34
|
-
iconMap.set(filePath, sidebarIcon);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
},
|
|
38
|
-
async load(id) {
|
|
39
|
-
if (/\.mdx?$/.test(id)) {
|
|
40
|
-
const code = await readFile(id, "utf-8");
|
|
41
|
-
const { sidebar_icon: sidebarIcon } = matter(code).data;
|
|
42
|
-
iconMap.set(id, sidebarIcon);
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
};
|
|
47
|
-
//# sourceMappingURL=plugin-icons.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-icons.js","sourceRoot":"","sources":["../../src/vite/plugin-icons.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAEjD,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CACnC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,EAAE;IAClD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzD,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;IAC9G,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CACpC,mBAAmB;IACnB,uDAAuD;IACvD,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,WAAW,YAAY,CAAC,QAAQ,CAAC,EAAE,CACrD,CAAC;IAEF,OAAO,GAAG,eAAe,oCAAoC,cAAc,GAAG,CAAC;AACjF,CAAC,CAAC;AAEF,8GAA8G;AAC9G,MAAM,CAAC,MAAM,eAAe,GAAG,GAAW,EAAE;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,qBAAqB;QAC3B,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACtC,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC/C,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;oBACxD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAE3C,IACE,CAAC,CAAC,YAAY,IAAI,WAAW,CAAC;wBAC9B,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC;wBAC9B,YAAY,KAAK,WAAW,EAC5B,CAAC;wBACD,MAAM,OAAO,EAAE,CAAC;oBAClB,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE;YACX,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { j as r } from "./jsx-runtime-B6kdoens.js";
|
|
2
|
-
import { L as a } from "./index-BG0g4WW0.js";
|
|
3
|
-
import { C as n } from "./CategoryHeading-EN3W3xEN.js";
|
|
4
|
-
import { P as i, H as t } from "./Markdown-BUUIyZbc.js";
|
|
5
|
-
const p = ({
|
|
6
|
-
title: e = "An error occurred",
|
|
7
|
-
message: o,
|
|
8
|
-
category: s
|
|
9
|
-
}) => /* @__PURE__ */ r.jsxs("div", { className: i + " h-full pt-[--padding-content-top]", children: [
|
|
10
|
-
s && /* @__PURE__ */ r.jsx(n, { children: s }),
|
|
11
|
-
e && /* @__PURE__ */ r.jsx(t, { level: 1, className: "flex gap-3.5 items-center", children: e }),
|
|
12
|
-
/* @__PURE__ */ r.jsx("p", { children: o }),
|
|
13
|
-
/* @__PURE__ */ r.jsx(a, { to: "/", children: "Go back home" })
|
|
14
|
-
] });
|
|
15
|
-
export {
|
|
16
|
-
p as E
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=ErrorPage-C5Pnyfbg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorPage-C5Pnyfbg.js","sources":["../src/lib/components/ErrorPage.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { CategoryHeading } from \"./CategoryHeading.js\";\nimport { Heading } from \"./Heading.js\";\nimport { ProseClasses } from \"./Markdown.js\";\n\nexport const ErrorPage = ({\n title = \"An error occurred\",\n message,\n category,\n}: {\n title?: ReactNode;\n message?: ReactNode;\n category?: ReactNode;\n}) => {\n return (\n <div className={ProseClasses + \" h-full pt-[--padding-content-top]\"}>\n {category && <CategoryHeading>{category}</CategoryHeading>}\n {title && (\n <Heading level={1} className=\"flex gap-3.5 items-center\">\n {title}\n </Heading>\n )}\n <p>{message}</p>\n <Link to=\"/\">Go back home</Link>\n </div>\n );\n};\n"],"names":["ErrorPage","title","message","category","jsxs","ProseClasses","jsx","CategoryHeading","Heading","Link"],"mappings":";;;;AAMO,MAAMA,IAAY,CAAC;AAAA,EACxB,OAAAC,IAAQ;AAAA,EACR,SAAAC;AAAA,EACA,UAAAC;AACF,MAMKC,gBAAAA,EAAAA,KAAA,OAAA,EAAI,WAAWC,IAAe,sCAC5B,UAAA;AAAA,EAAYF,KAAAG,gBAAAA,EAAAA,IAACC,KAAiB,UAASJ,EAAA,CAAA;AAAA,EACvCF,KACEK,gBAAAA,EAAAA,IAAAE,GAAA,EAAQ,OAAO,GAAG,WAAU,6BAC1B,UACHP,GAAA;AAAA,EAEFK,gBAAAA,EAAAA,IAAC,OAAG,UAAQJ,EAAA,CAAA;AAAA,EACXI,gBAAAA,EAAA,IAAAG,GAAA,EAAK,IAAG,KAAI,UAAY,gBAAA;AAC3B,EAAA,CAAA;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperationList-BwJXexkA.js","sources":["../src/lib/plugins/openapi/graphql/fragment-masking.ts","../src/lib/plugins/openapi/Endpoint.tsx","../src/lib/util/groupBy.ts","../src/lib/util/renderIf.ts","../src/lib/plugins/openapi/ParameterListItem.tsx","../src/lib/plugins/openapi/ParameterList.tsx","../src/lib/util/objectEntries.ts","../src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupConnector.tsx","../src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupItem.tsx","../src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroup.tsx","../src/lib/plugins/openapi/schema/utils.ts","../src/lib/plugins/openapi/schema/SchemaComponents.tsx","../src/lib/plugins/openapi/schema/SchemaView.tsx","../src/lib/plugins/openapi/OperationListItem.tsx","../src/lib/plugins/openapi/OperationList.tsx"],"sourcesContent":["/* eslint-disable */\nimport type {\n DocumentTypeDecoration,\n ResultOf,\n TypedDocumentNode,\n} from \"@graphql-typed-document-node/core\";\nimport type { FragmentDefinitionNode } from \"graphql\";\nimport type { Incremental } from \"./graphql.js\";\n\nexport type FragmentType<\n TDocumentType extends DocumentTypeDecoration<any, any>,\n> =\n TDocumentType extends DocumentTypeDecoration<infer TType, any>\n ? [TType] extends [{ \" $fragmentName\"?: infer TKey }]\n ? TKey extends string\n ? { \" $fragmentRefs\"?: { [key in TKey]: TType } }\n : never\n : never\n : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>,\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined,\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null,\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | FragmentType<DocumentTypeDecoration<TType, any>>\n | null\n | undefined,\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>,\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n | null\n | undefined,\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>,\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n | null\n | undefined,\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | FragmentType<DocumentTypeDecoration<TType, any>>\n | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n | null\n | undefined,\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n return fragmentType as any;\n}\n\nexport function makeFragmentData<\n F extends DocumentTypeDecoration<any, any>,\n FT extends ResultOf<F>,\n>(data: FT, _fragment: F): FragmentType<F> {\n return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n queryNode: DocumentTypeDecoration<TQuery, any>,\n fragmentNode: TypedDocumentNode<TFrag>,\n data:\n | FragmentType<TypedDocumentNode<Incremental<TFrag>, any>>\n | null\n | undefined,\n): data is FragmentType<typeof fragmentNode> {\n const deferredFields = (\n queryNode as {\n __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> };\n }\n ).__meta__?.deferredFields;\n\n if (!deferredFields) return true;\n\n const fragDef = fragmentNode.definitions[0] as\n | FragmentDefinitionNode\n | undefined;\n const fragName = fragDef?.name?.value;\n\n const fields = (fragName && deferredFields[fragName]) || [];\n return fields.length > 0 && fields.every((field) => data && field in data);\n}\n","import { CheckIcon, CopyIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { InlineCode } from \"../../components/InlineCode.js\";\n\nexport const Endpoint = ({ url }: { url: string }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n return (\n <div className=\"my-4 flex items-center justify-end gap-2 text-sm\">\n <span className=\"font-medium\">Endpoint:</span>\n <InlineCode className=\"p-1.5 flex gap-2.5 items-center text-xs\">\n {url}\n <button\n onClick={() => {\n void navigator.clipboard.writeText(url).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n });\n }}\n type=\"button\"\n >\n {isCopied ? (\n <CheckIcon className=\"text-green-600\" size={14} />\n ) : (\n <CopyIcon size={14} strokeWidth={1.3} />\n )}\n </button>\n </InlineCode>\n </div>\n );\n};\n","export const groupBy = <\n T extends Record<PropertyKey, any>,\n KeySelector extends (item: T) => PropertyKey,\n>(\n arr: T[],\n keySelector: KeySelector,\n): Partial<Record<ReturnType<KeySelector>, T[]>> => {\n return arr.reduce(\n (accumulator, val) => {\n const groupedKey = keySelector(val) as ReturnType<KeySelector>;\n if (!accumulator[groupedKey]) {\n accumulator[groupedKey] = [];\n }\n accumulator[groupedKey].push(val);\n return accumulator;\n },\n {} as Record<ReturnType<KeySelector>, T[]>,\n );\n};\n","export const renderIf = <G, R>(\n variable: G | undefined | null,\n callback: (variable: G) => R,\n): R | undefined => (variable ? callback(variable) : undefined);\n","import { Markdown } from \"../../components/Markdown.js\";\nimport { type SchemaObject } from \"../../oas/graphql/index.js\";\nimport { ColorizedParam } from \"./ColorizedParam.js\";\nimport type { OperationListItemResult } from \"./OperationList.js\";\nimport type { ParameterGroup } from \"./OperationListItem.js\";\n\nconst getParameterSchema = (\n parameter: ParameterListItemResult,\n): SchemaObject => {\n if (parameter.schema != null && typeof parameter.schema === \"object\") {\n return parameter.schema;\n }\n return {\n type: \"string\",\n };\n};\n\nexport type ParameterListItemResult = NonNullable<\n OperationListItemResult[\"parameters\"]\n>[number];\n\nexport const ParameterListItem = ({\n parameter,\n group,\n id,\n}: {\n parameter: ParameterListItemResult;\n group: ParameterGroup;\n id: string;\n}) => (\n <li className=\"p-4 bg-border/20 text-sm flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <code>\n {group === \"path\" ? (\n <ColorizedParam\n name={parameter.name}\n backgroundOpacity=\"15%\"\n slug={id + \"-\" + parameter.name.toLocaleLowerCase()}\n />\n ) : (\n parameter.name\n )}\n </code>\n {parameter.required && (\n <span className=\"py-px px-1.5 font-medium bg-primary/75 text-muted rounded-lg\">\n required\n </span>\n )}\n {getParameterSchema(parameter).type && (\n <span className=\"text-muted-foreground\">\n {getParameterSchema(parameter).type}\n </span>\n )}\n </div>\n {parameter.description && (\n <Markdown\n content={parameter.description}\n className=\"text-sm prose-p:my-1 prose-code:whitespace-pre-line\"\n />\n )}\n </li>\n);\n","import { Heading } from \"../../components/Heading.js\";\nimport { Card } from \"../../ui/Card.js\";\nimport type { ParameterGroup } from \"./OperationListItem.js\";\nimport {\n ParameterListItem,\n type ParameterListItemResult,\n} from \"./ParameterListItem.js\";\n\nexport const ParameterList = ({\n group,\n parameters,\n id,\n}: {\n group: ParameterGroup;\n parameters: ParameterListItemResult[];\n id: string;\n}) => (\n <>\n <Heading level={3} id={`${id}/${group}-parameters`} className=\"capitalize\">\n {group === \"header\" ? \"Headers\" : `${group} Parameters`}\n </Heading>\n <Card>\n <ul className=\"list-none m-0 px-0 divide-y \">\n {parameters\n .sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1))\n .map((parameter) => (\n <ParameterListItem\n key={`${parameter.name}-${parameter.in}`}\n parameter={parameter}\n id={id}\n group={group}\n />\n ))}\n </ul>\n </Card>\n </>\n);\n","type ValueOf<T> = T[keyof T];\ntype Entries<T> = [keyof T, ValueOf<T>][];\n\nexport const objectEntries = <T extends object>(obj: T): Entries<T> =>\n Object.entries(obj) as Entries<T>;\n","import {\n ChevronDownIcon,\n CircleDotIcon,\n CircleFadingPlusIcon,\n CircleIcon,\n} from \"lucide-react\";\nimport { cn } from \"../../../../util/cn.js\";\n\nimport type { LogicalGroupType } from \"../utils.js\";\n\nconst iconMap = {\n AND: <CircleFadingPlusIcon size={16} className=\"fill-card\" />,\n OR: <CircleDotIcon size={16} className=\"fill-card\" />,\n ONE: <CircleIcon size={14} className=\"fill-card\" />,\n} as const;\n\nconst colorClass = {\n AND: \"text-green-500 dark:text-green-300/60\",\n OR: \"text-blue-400 dark:text-blue-500\",\n ONE: \"text-purple-500 dark:text-purple-300/60\",\n} as const;\n\nexport const LogicalGroupConnector = ({\n type,\n isOpen,\n className,\n}: {\n type: LogicalGroupType;\n isOpen: boolean;\n className?: string;\n}) => {\n return (\n <div\n className={cn(\n colorClass[type],\n \"relative text-sm flex py-2\",\n \"before:border-l before:absolute before:-top-2 before:-bottom-2 before:border-border before:border-dashed before:content-['']\",\n className,\n )}\n >\n <div className=\"-translate-x-[7px] flex gap-1 items-center\">\n {iconMap[type]}\n <div\n className={cn(\n \"translate-y-px mx-px opacity-0 group-hover:opacity-100 transition\",\n !isOpen && \"-rotate-90\",\n )}\n >\n <ChevronDownIcon size={16} />\n </div>\n </div>\n </div>\n );\n};\n","import * as Collapsible from \"@radix-ui/react-collapsible\";\nimport { useState } from \"react\";\nimport type { SchemaObject } from \"../../../../oas/parser/index.js\";\nimport { SchemaView } from \"../SchemaView.js\";\nimport type { LogicalGroupType } from \"../utils.js\";\nimport { LogicalGroupConnector } from \"./LogicalGroupConnector.js\";\n\nexport const LogicalGroupItem = (props: {\n type: LogicalGroupType;\n schema: SchemaObject;\n level: number;\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n\n return (\n <Collapsible.Root\n open={isOpen}\n onOpenChange={() => setIsOpen((prev) => !prev)}\n className=\"group\"\n >\n <Collapsible.Trigger>\n <LogicalGroupConnector type={props.type} isOpen={isOpen} />\n </Collapsible.Trigger>\n {!isOpen && <div className=\"wavy-line bg-border translate-y-1\" />}\n <Collapsible.Content>\n <SchemaView schema={props.schema} level={props.level + 1} />\n </Collapsible.Content>\n </Collapsible.Root>\n );\n};\n","import * as Collapsible from \"@radix-ui/react-collapsible\";\nimport { SquareMinusIcon, SquarePlusIcon } from \"lucide-react\";\nimport type { SchemaObject } from \"../../../../oas/parser/index.js\";\nimport { Card } from \"../../../../ui/Card.js\";\nimport type { LogicalGroupType } from \"../utils.js\";\nimport { LogicalGroupItem } from \"./LogicalGroupItem.js\";\n\nconst typeLabel = {\n AND: \"All of\",\n OR: \"Any of\",\n ONE: \"One of\",\n};\n\nexport const LogicalGroup = ({\n schemas,\n type,\n isOpen,\n level,\n toggleOpen,\n}: {\n schemas: SchemaObject[];\n type: LogicalGroupType;\n isOpen: boolean;\n toggleOpen: () => void;\n level: number;\n}) => (\n <Collapsible.Root open={isOpen} onOpenChange={toggleOpen} asChild>\n <Card className=\"px-6\">\n <Collapsible.Trigger className=\"flex gap-2 items-center py-2 w-full text-sm text-muted-foreground -translate-x-1.5\">\n {isOpen ? <SquareMinusIcon size={14} /> : <SquarePlusIcon size={14} />}\n <span>{typeLabel[type]}</span>\n </Collapsible.Trigger>\n\n <Collapsible.Content className=\"pb-4\">\n {schemas.map((subSchema, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <LogicalGroupItem\n key={index}\n type={type}\n schema={subSchema}\n level={level}\n />\n ))}\n </Collapsible.Content>\n </Card>\n </Collapsible.Root>\n);\n","import type { SchemaObject } from \"../../../oas/parser/index.js\";\n\nexport const isComplexType = (value: SchemaObject) =>\n value.type === \"object\" ||\n (value.type === \"array\" &&\n typeof value.items === \"object\" &&\n (!value.items.type || value.items.type === \"object\"));\n\nexport const hasLogicalGroupings = (value: SchemaObject) =>\n Boolean(value.oneOf ?? value.allOf ?? value.anyOf);\n\nexport const LogicalSchemaTypeMap = {\n allOf: \"AND\",\n anyOf: \"OR\",\n oneOf: \"ONE\",\n} as const;\n\nexport type LogicalGroupType = \"AND\" | \"OR\" | \"ONE\";\n","import * as Collapsible from \"@radix-ui/react-collapsible\";\nimport { ListPlusIcon } from \"lucide-react\";\nimport { useCallback, useState } from \"react\";\nimport { Markdown, ProseClasses } from \"../../../components/Markdown.js\";\nimport type { SchemaObject } from \"../../../oas/parser/index.js\";\nimport { Button } from \"../../../ui/Button.js\";\nimport { cn } from \"../../../util/cn.js\";\nimport { objectEntries } from \"../../../util/objectEntries.js\";\nimport { LogicalGroup } from \"./LogicalGroup/LogicalGroup.js\";\nimport { SchemaView } from \"./SchemaView.js\";\nimport {\n hasLogicalGroupings,\n isComplexType,\n LogicalSchemaTypeMap,\n} from \"./utils.js\";\n\nexport const SchemaLogicalGroup = ({\n schema,\n level,\n}: {\n schema: SchemaObject;\n level: number;\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n const toggleOpen = useCallback(() => setIsOpen((prev) => !prev), []);\n\n for (const [key, type] of objectEntries(LogicalSchemaTypeMap)) {\n if (!schema[key]) continue;\n\n return (\n <LogicalGroup\n schemas={schema[key]}\n type={type}\n isOpen={isOpen}\n toggleOpen={toggleOpen}\n level={level}\n />\n );\n }\n};\n\nexport const SchemaPropertyItem = ({\n name,\n schema,\n group,\n level,\n defaultOpen = false,\n showCollapseButton = true,\n}: {\n name: string;\n schema: SchemaObject;\n group: \"required\" | \"optional\" | \"deprecated\";\n level: number;\n defaultOpen?: boolean;\n showCollapseButton?: boolean;\n}) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n return (\n <li className=\"p-4 bg-border/20 hover:bg-border/30\">\n <div className=\"flex flex-col gap-1 justify-between text-sm\">\n <div className=\"flex gap-2 items-center\">\n <code>{name}</code>\n <span className=\"text-muted-foreground\">\n {schema.type === \"array\" && schema.items.type ? (\n <span>{schema.items.type}[]</span>\n ) : Array.isArray(schema.type) ? (\n <span>{schema.type.join(\" | \")}</span>\n ) : (\n <span>{schema.type}</span>\n )}\n </span>\n {group === \"optional\" && (\n <span className=\"py-px px-1.5 font-medium border rounded-lg\">\n optional\n </span>\n )}\n </div>\n\n {schema.description && (\n <Markdown\n className={cn(ProseClasses, \"text-sm leading-normal line-clamp-4\")}\n content={schema.description}\n />\n )}\n\n {(hasLogicalGroupings(schema) || isComplexType(schema)) && (\n <Collapsible.Root\n defaultOpen={defaultOpen}\n open={isOpen}\n onOpenChange={() => setIsOpen(!isOpen)}\n >\n {showCollapseButton && (\n <Collapsible.Trigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2 flex gap-1.5\"\n >\n <ListPlusIcon size={18} />\n {!isOpen\n ? \"Show nested properties\"\n : \"Hide nested properties\"}\n </Button>\n </Collapsible.Trigger>\n )}\n <Collapsible.Content>\n <div className=\"mt-2\">\n {hasLogicalGroupings(schema) ? (\n <SchemaLogicalGroup schema={schema} level={level + 1} />\n ) : schema.type === \"object\" ? (\n <SchemaView schema={schema} level={level + 1} />\n ) : (\n schema.type === \"array\" &&\n typeof schema.items === \"object\" && (\n <SchemaView schema={schema.items} level={level + 1} />\n )\n )}\n </div>\n </Collapsible.Content>\n </Collapsible.Root>\n )}\n </div>\n </li>\n );\n};\n","import { Markdown, ProseClasses } from \"../../../components/Markdown.js\";\nimport type { SchemaObject } from \"../../../oas/parser/index.js\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../../../ui/Card.js\";\nimport { cn } from \"../../../util/cn.js\";\nimport { groupBy } from \"../../../util/groupBy.js\";\nimport { SchemaLogicalGroup, SchemaPropertyItem } from \"./SchemaComponents.js\";\nimport { hasLogicalGroupings } from \"./utils.js\";\n\nexport const SchemaView = ({\n schema,\n level = 0,\n defaultOpen = false,\n}: {\n schema?: SchemaObject | null;\n level?: number;\n defaultOpen?: boolean;\n}) => {\n if (!schema || Object.keys(schema).length === 0) {\n return (\n <Card className=\"p-4\">\n <span className=\"text-sm text-muted-foreground italic\">\n No response specified\n </span>\n </Card>\n );\n }\n\n const renderSchema = (schema: SchemaObject, level: number) => {\n if (hasLogicalGroupings(schema)) {\n return <SchemaLogicalGroup schema={schema} level={level} />;\n }\n\n // Sometimes items is not defined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (schema.type === \"array\" && schema.items) {\n const itemsSchema = schema.items as SchemaObject;\n\n if (\n typeof itemsSchema.type === \"string\" &&\n [\"string\", \"number\", \"boolean\", \"integer\"].includes(itemsSchema.type)\n ) {\n return (\n <Card className=\"p-4\">\n <span className=\"text-sm text-muted-foreground\">\n {itemsSchema.type}[]\n </span>\n {schema.description && (\n <Markdown\n className={cn(\n ProseClasses,\n \"text-sm leading-normal line-clamp-4\",\n )}\n content={schema.description}\n />\n )}\n </Card>\n );\n } else if (itemsSchema.type === \"object\") {\n return (\n <Card className=\"flex flex-col gap-2 bg-border/30 p-4\">\n <span className=\"text-sm text-muted-foreground\">object[]</span>\n {renderSchema(itemsSchema, level + 1)}\n </Card>\n );\n } else {\n return renderSchema(itemsSchema, level + 1);\n }\n }\n\n if (schema.type === \"object\" && !schema.properties) {\n return (\n <Card className=\"p-4 flex gap-2 items-center\">\n {\"name\" in schema && <>{schema.name}</>}\n <span className=\"text-sm text-muted-foreground\">object</span>\n {schema.description && (\n <Markdown\n className={cn(\n ProseClasses,\n \"text-sm leading-normal line-clamp-4\",\n )}\n content={schema.description}\n />\n )}\n </Card>\n );\n }\n\n if (schema.properties) {\n const groupedProperties = groupBy(\n Object.entries(schema.properties),\n ([propertyName, property]) => {\n return property.deprecated\n ? \"deprecated\"\n : schema.required?.includes(propertyName)\n ? \"required\"\n : \"optional\";\n },\n );\n\n const groupNames = [\"required\", \"optional\", \"deprecated\"] as const;\n\n return (\n <Card className=\"divide-y overflow-hidden\">\n {groupNames.map(\n (group) =>\n groupedProperties[group] && (\n <ul key={group} className=\"divide-y\">\n {groupedProperties[group].map(([name, schema]) => (\n <SchemaPropertyItem\n key={name}\n name={name}\n schema={schema}\n group={group}\n level={level}\n defaultOpen={defaultOpen}\n />\n ))}\n </ul>\n ),\n )}\n </Card>\n );\n }\n\n if (\n typeof schema.type === \"string\" &&\n [\"string\", \"number\", \"boolean\", \"integer\", \"null\"].includes(schema.type)\n ) {\n return (\n <Card className=\"p-4\">\n <span className=\"text-sm text-muted-foreground\">{schema.type}</span>\n {schema.description && (\n <Markdown\n className={cn(\n ProseClasses,\n \"text-sm leading-normal line-clamp-4\",\n )}\n content={schema.description}\n />\n )}\n </Card>\n );\n }\n\n if (schema.additionalProperties) {\n return (\n <Card className=\"my-2\">\n <CardHeader>\n <CardTitle>Additional Properties:</CardTitle>\n </CardHeader>\n <CardContent>\n {renderSchema(\n schema.additionalProperties as SchemaObject,\n level + 1,\n )}\n </CardContent>\n </Card>\n );\n }\n\n return null;\n };\n\n return renderSchema(schema, level);\n};\n","import { useState } from \"react\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Markdown, ProseClasses } from \"../../components/Markdown.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../ui/Tabs.js\";\nimport { groupBy } from \"../../util/groupBy.js\";\nimport { renderIf } from \"../../util/renderIf.js\";\nimport { OperationsFragment } from \"./OperationList.js\";\nimport { ParameterList } from \"./ParameterList.js\";\nimport { Sidecar } from \"./Sidecar.js\";\nimport { FragmentType, useFragment } from \"./graphql/index.js\";\nimport { SchemaView } from \"./schema/SchemaView.js\";\n\nexport const PARAM_GROUPS = [\"path\", \"query\", \"header\", \"cookie\"] as const;\nexport type ParameterGroup = (typeof PARAM_GROUPS)[number];\n\nexport const OperationListItem = ({\n operationFragment,\n}: {\n operationFragment: FragmentType<typeof OperationsFragment>;\n}) => {\n const operation = useFragment(OperationsFragment, operationFragment);\n const groupedParameters = groupBy(\n operation.parameters ?? [],\n (param) => param.in,\n );\n\n const first = operation.responses.at(0);\n const [selectedResponse, setSelectedResponse] = useState(first?.statusCode);\n\n return (\n <div\n key={operation.operationId}\n className=\"grid grid-cols-1 lg:grid-cols-[4fr_3fr] gap-8 items-start border-b-2 mb-16 pb-16\"\n >\n <div className=\"flex flex-col gap-4\">\n <Heading level={2} id={operation.slug} registerSidebarAnchor>\n {operation.summary}\n </Heading>\n {operation.description && (\n <Markdown\n className={`${ProseClasses} max-w-full prose-img:max-w-prose`}\n content={operation.description}\n />\n )}\n {operation.parameters && operation.parameters.length > 0 && (\n <>\n {PARAM_GROUPS.flatMap((group) =>\n groupedParameters[group]?.length ? (\n <ParameterList\n key={group}\n id={operation.slug}\n parameters={groupedParameters[group]}\n group={group}\n />\n ) : (\n []\n ),\n )}\n </>\n )}\n {renderIf(operation.requestBody?.content?.at(0)?.schema, (schema) => (\n <div className=\"mt-4 flex flex-col gap-4\">\n <Heading\n level={3}\n className=\"capitalize\"\n id={`${operation.slug}/request-body`}\n registerSidebarAnchor\n >\n Request Body\n </Heading>\n <SchemaView schema={schema} />\n </div>\n ))}\n {operation.responses.length > 0 && (\n <>\n <Heading\n level={3}\n className=\"capitalize mt-8 pt-8 border-t\"\n id={`${operation.slug}/responses`}\n registerSidebarAnchor\n >\n Responses\n </Heading>\n <Tabs\n onValueChange={(value) => setSelectedResponse(value)}\n value={selectedResponse}\n >\n {operation.responses.length > 1 && (\n <TabsList>\n {operation.responses.map((response) => (\n <TabsTrigger\n value={response.statusCode}\n key={response.statusCode}\n title={response.description ?? undefined}\n >\n {response.statusCode}\n </TabsTrigger>\n ))}\n </TabsList>\n )}\n <ul className=\"list-none m-0 px-0\">\n {operation.responses.map((response) => (\n <TabsContent\n value={response.statusCode}\n key={response.statusCode}\n >\n <SchemaView\n schema={\n response.content?.find((content) => content.schema)\n ?.schema\n }\n />\n </TabsContent>\n ))}\n </ul>\n </Tabs>\n </>\n )}\n </div>\n\n <Sidecar\n selectedResponse={selectedResponse}\n onSelectResponse={setSelectedResponse}\n operation={operation}\n />\n </div>\n );\n};\n","import { ResultOf } from \"@graphql-typed-document-node/core\";\nimport { CategoryHeading } from \"../../components/CategoryHeading.js\";\nimport { DeveloperHint } from \"../../components/DeveloperHint.js\";\nimport { ErrorPage } from \"../../components/ErrorPage.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { InlineCode } from \"../../components/InlineCode.js\";\nimport { Markdown, ProseClasses } from \"../../components/Markdown.js\";\nimport { SyntaxHighlight } from \"../../components/SyntaxHighlight.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { Endpoint } from \"./Endpoint.js\";\nimport { OperationListItem } from \"./OperationListItem.js\";\nimport StaggeredRender from \"./StaggeredRender.js\";\nimport { useOasConfig } from \"./context.js\";\nimport { graphql } from \"./graphql/index.js\";\nimport { useQuery } from \"./util/urql.js\";\n\nexport const OperationsFragment = graphql(/* GraphQL */ `\n fragment OperationsFragment on OperationItem {\n slug\n summary\n method\n description\n operationId\n contentTypes\n path\n parameters {\n name\n in\n description\n required\n schema\n style\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 schema\n }\n description\n required\n }\n responses {\n statusCode\n links\n description\n content {\n mediaType\n encoding {\n name\n }\n schema\n }\n }\n }\n`);\n\nexport type OperationListItemResult = ResultOf<typeof OperationsFragment>;\n\nconst AllOperationsQuery = graphql(/* GraphQL */ `\n query AllOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n description\n title\n url\n version\n tags {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n }\n }\n }\n`);\n\nconst suspenseContext = { suspense: true };\n\nexport const OperationList = () => {\n const { type, input } = useOasConfig();\n\n const [result] = useQuery({\n query: AllOperationsQuery,\n variables: { type, input },\n context: suspenseContext,\n });\n\n const error = result.error?.graphQLErrors.at(0);\n\n // Looks like there is no Suspense level error handling (yet)?\n // So we handle the error case in the component directly\n if (error) {\n return (\n <ErrorPage\n category=\"Error\"\n title=\"Schema cannot be displayed\"\n message={\n <>\n <DeveloperHint className=\"mb-4\">\n Check your configuration value <InlineCode>apis.type</InlineCode>{\" \"}\n and <InlineCode>apis.input</InlineCode> in the Zudoku config.\n </DeveloperHint>\n An error occurred while trying to fetch the API reference:\n <SyntaxHighlight code={error.toString()} language=\"plain\" />\n </>\n }\n />\n );\n }\n\n if (!result.data) return null;\n\n return (\n <div className=\"pt-[--padding-content-top]\">\n <div\n className={cn(ProseClasses, \"mb-16 max-w-full prose-img:max-w-prose\")}\n >\n <CategoryHeading>Overview</CategoryHeading>\n <Heading level={1} id=\"description\" registerSidebarAnchor>\n {result.data.schema.title}\n </Heading>\n <Markdown content={result.data.schema.description ?? \"\"} />\n </div>\n <hr />\n <Endpoint url={result.data.schema.url} />\n\n {result.data.schema.tags\n .filter((tag) => tag.operations.length > 0)\n .map((tag) => (\n <div key={tag.name}>\n {tag.name && <CategoryHeading>{tag.name}</CategoryHeading>}\n {tag.description && (\n <Markdown\n className={`${ProseClasses} max-w-full prose-img:max-w-prose w-full mt-2 mb-12`}\n content={tag.description}\n />\n )}\n <div className=\"operation mb-12\">\n <StaggeredRender>\n {tag.operations.map((fragment) => (\n <OperationListItem\n key={fragment.slug}\n operationFragment={fragment}\n />\n ))}\n </StaggeredRender>\n </div>\n </div>\n ))}\n </div>\n );\n};\n"],"names":["useFragment","_documentNode","fragmentType","Endpoint","url","isCopied","setIsCopied","useState","jsxs","jsx","InlineCode","CheckIcon","CopyIcon","groupBy","arr","keySelector","accumulator","val","groupedKey","renderIf","variable","callback","getParameterSchema","parameter","ParameterListItem","group","id","ColorizedParam","Markdown","ParameterList","parameters","Fragment","Heading","Card","a","b","objectEntries","obj","iconMap","CircleFadingPlusIcon","CircleDotIcon","CircleIcon","colorClass","LogicalGroupConnector","type","isOpen","className","cn","ChevronDownIcon","LogicalGroupItem","props","setIsOpen","Collapsible.Root","prev","Collapsible.Trigger","Collapsible.Content","SchemaView","typeLabel","LogicalGroup","schemas","level","toggleOpen","SquareMinusIcon","SquarePlusIcon","subSchema","index","isComplexType","value","hasLogicalGroupings","LogicalSchemaTypeMap","SchemaLogicalGroup","schema","useCallback","key","SchemaPropertyItem","name","defaultOpen","showCollapseButton","ProseClasses","Button","ListPlusIcon","renderSchema","itemsSchema","groupedProperties","propertyName","property","groupNames","CardHeader","CardTitle","CardContent","PARAM_GROUPS","OperationListItem","operationFragment","operation","OperationsFragment","groupedParameters","param","first","selectedResponse","setSelectedResponse","_a","_c","_b","Tabs","TabsList","response","TabsTrigger","TabsContent","content","Sidecar","graphql","AllOperationsQuery","suspenseContext","OperationList","input","useOasConfig","result","useQuery","error","ErrorPage","DeveloperHint","SyntaxHighlight","CategoryHeading","tag","StaggeredRender","fragment"],"mappings":"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"}
|