zudoku 0.3.0-dev.11 → 0.3.0-dev.13

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 (85) hide show
  1. package/dist/app/App.js +9 -7
  2. package/dist/app/App.js.map +1 -1
  3. package/dist/config/config.d.ts +5 -14
  4. package/dist/lib/components/DevPortal.d.ts +2 -20
  5. package/dist/lib/components/DevPortal.js +1 -1
  6. package/dist/lib/components/DevPortal.js.map +1 -1
  7. package/dist/lib/components/Header.js +2 -2
  8. package/dist/lib/components/Header.js.map +1 -1
  9. package/dist/lib/components/Heading.d.ts +9 -4
  10. package/dist/lib/components/Heading.js +17 -2
  11. package/dist/lib/components/Heading.js.map +1 -1
  12. package/dist/lib/components/Layout.js +1 -1
  13. package/dist/lib/components/Layout.js.map +1 -1
  14. package/dist/lib/core/DevPortalContext.d.ts +33 -3
  15. package/dist/lib/core/DevPortalContext.js +3 -1
  16. package/dist/lib/core/DevPortalContext.js.map +1 -1
  17. package/dist/lib/plugins/markdown/MdxPage.d.ts +3 -2
  18. package/dist/lib/plugins/markdown/MdxPage.js +5 -4
  19. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  20. package/dist/lib/plugins/markdown/generateRoutes.d.ts +2 -2
  21. package/dist/lib/plugins/markdown/generateRoutes.js +2 -2
  22. package/dist/lib/plugins/markdown/generateRoutes.js.map +1 -1
  23. package/dist/lib/plugins/markdown/index.d.ts +4 -1
  24. package/dist/lib/plugins/markdown/index.js +2 -2
  25. package/dist/lib/plugins/markdown/index.js.map +1 -1
  26. package/dist/lib/plugins/openapi/OperationList.js +4 -3
  27. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  28. package/dist/lib/plugins/openapi/OperationListItem.js +8 -4
  29. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  30. package/dist/lib/plugins/openapi/ParameterList.js +1 -1
  31. package/dist/lib/plugins/openapi/ParameterList.js.map +1 -1
  32. package/dist/lib/plugins/openapi/ParameterListItem.js +1 -1
  33. package/dist/lib/plugins/openapi/ParameterListItem.js.map +1 -1
  34. package/dist/lib/plugins/openapi/RequestBodySidecarBox.js +1 -9
  35. package/dist/lib/plugins/openapi/RequestBodySidecarBox.js.map +1 -1
  36. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js +1 -1
  37. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js.map +1 -1
  38. package/dist/lib/plugins/openapi/SchemaListView.js +4 -26
  39. package/dist/lib/plugins/openapi/SchemaListView.js.map +1 -1
  40. package/dist/lib/plugins/openapi/SchemaListViewItem.d.ts +7 -0
  41. package/dist/lib/plugins/openapi/SchemaListViewItem.js +16 -0
  42. package/dist/lib/plugins/openapi/SchemaListViewItem.js.map +1 -0
  43. package/dist/lib/plugins/openapi/SchemaListViewItemGroup.d.ts +8 -0
  44. package/dist/lib/plugins/openapi/SchemaListViewItemGroup.js +17 -0
  45. package/dist/lib/plugins/openapi/SchemaListViewItemGroup.js.map +1 -0
  46. package/dist/lib/plugins/openapi/util/prose.d.ts +1 -0
  47. package/dist/lib/plugins/openapi/util/prose.js +4 -0
  48. package/dist/lib/plugins/openapi/util/prose.js.map +1 -0
  49. package/dist/lib/ui/button-variants.d.ts +1 -1
  50. package/dist/lib/util/MdxComponents.js +1 -1
  51. package/dist/lib/util/MdxComponents.js.map +1 -1
  52. package/dist/lib/util/objectEntries.d.ts +4 -0
  53. package/dist/lib/util/objectEntries.js +2 -0
  54. package/dist/lib/util/objectEntries.js.map +1 -0
  55. package/dist/lib/util/renderIf.d.ts +1 -0
  56. package/dist/lib/util/renderIf.js +2 -0
  57. package/dist/lib/util/renderIf.js.map +1 -0
  58. package/dist/vite/plugin-docs.js +1 -1
  59. package/dist/vite/plugin-docs.js.map +1 -1
  60. package/lib/{Spinner-CzCKCaUK.js → Spinner-CbtkR-Im.js} +3054 -3040
  61. package/lib/zudoku.components.js +42 -41
  62. package/lib/zudoku.plugins.js +2982 -2980
  63. package/package.json +1 -1
  64. package/src/app/App.tsx +10 -7
  65. package/src/lib/components/DevPortal.tsx +4 -25
  66. package/src/lib/components/Header.tsx +4 -4
  67. package/src/lib/components/Heading.tsx +26 -7
  68. package/src/lib/components/Layout.tsx +1 -1
  69. package/src/lib/core/DevPortalContext.ts +37 -9
  70. package/src/lib/plugins/markdown/MdxPage.tsx +49 -32
  71. package/src/lib/plugins/markdown/generateRoutes.tsx +12 -2
  72. package/src/lib/plugins/markdown/index.tsx +8 -1
  73. package/src/lib/plugins/openapi/OperationList.tsx +9 -3
  74. package/src/lib/plugins/openapi/OperationListItem.tsx +39 -18
  75. package/src/lib/plugins/openapi/ParameterList.tsx +1 -1
  76. package/src/lib/plugins/openapi/ParameterListItem.tsx +3 -4
  77. package/src/lib/plugins/openapi/RequestBodySidecarBox.tsx +2 -17
  78. package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +3 -1
  79. package/src/lib/plugins/openapi/SchemaListView.tsx +15 -182
  80. package/src/lib/plugins/openapi/SchemaListViewItem.tsx +110 -0
  81. package/src/lib/plugins/openapi/SchemaListViewItemGroup.tsx +63 -0
  82. package/src/lib/plugins/openapi/util/prose.ts +7 -0
  83. package/src/lib/util/MdxComponents.tsx +1 -1
  84. package/src/lib/util/objectEntries.ts +5 -0
  85. package/src/lib/util/renderIf.ts +4 -0
@@ -52,7 +52,9 @@ export const ResponsesSidecarBox = ({
52
52
  </span>
53
53
  )}
54
54
  <hr className="border-border my-1" />
55
- <div className="text-xs">{responses[tabIndex].description}</div>
55
+ <div className="text-xs text-muted-foreground">
56
+ {responses[tabIndex].description}
57
+ </div>
56
58
  </SidecarBox.Body>
57
59
  </SidecarBox.Root>
58
60
  );
@@ -1,10 +1,8 @@
1
- import * as Collapsible from "@radix-ui/react-collapsible";
2
- import { ListPlusIcon } from "lucide-react";
3
- import { useState } from "react";
4
1
  import { Markdown } from "../../components/Markdown.js";
5
2
  import { SchemaObject } from "../../oas/parser/index.js";
6
- import { Button } from "../../ui/Button.js";
7
- import { cn } from "../../util/cn.js";
3
+ import { objectEntries } from "../../util/objectEntries.js";
4
+ import { SchemaListViewItemGroup } from "./SchemaListViewItemGroup.js";
5
+ import { SchemaProseClasses } from "./util/prose.js";
8
6
 
9
7
  export const SchemaListView = ({
10
8
  name,
@@ -39,190 +37,25 @@ export const SchemaListView = ({
39
37
  );
40
38
 
41
39
  return (
42
- <div
43
- className={cn(
44
- "not-prose",
45
- level > 0 && "border border-border rounded text-sm",
46
- )}
47
- >
40
+ <div className="flex flex-col gap-2.5">
48
41
  {(schema.title ?? name) && (
49
42
  <div className="ml-2 my-1 font-bold">{schema.title ?? name}</div>
50
43
  )}
51
44
  {level === 0 && schema.description && (
52
- <p className="prose">{schema.description}</p>
53
- )}
54
- <ul>
55
- {Object.entries(groups).map(([group, properties]) => {
56
- return (
57
- <SchemaListViewItemGroup
58
- key={group}
59
- defaultOpen={defaultOpen}
60
- group={group as any}
61
- nestingLevel={level}
62
- properties={properties}
63
- required={schema.required ?? []}
64
- />
65
- );
66
- })}
67
- </ul>
68
- </div>
69
- );
70
- };
71
-
72
- const SchemaListViewItemGroup = ({
73
- group,
74
- properties,
75
- nestingLevel,
76
- required,
77
- defaultOpen = false,
78
- }: {
79
- group: "optional" | "required" | "deprecated";
80
- defaultOpen?: boolean;
81
- properties: [string, SchemaObject][];
82
- nestingLevel: number;
83
- required: string[];
84
- }) => {
85
- const notCollapsible =
86
- defaultOpen ||
87
- group === "required" ||
88
- properties.length === 1 ||
89
- nestingLevel === 0;
90
- const [open, setOpen] = useState(notCollapsible);
91
- if (properties.length === 0) {
92
- return;
93
- }
94
-
95
- return (
96
- <Collapsible.Root
97
- className="CollapsibleRoot"
98
- open={open}
99
- onOpenChange={setOpen}
100
- >
101
- {!open && (
102
- <Collapsible.Trigger
103
- className={cn(
104
- "py-2 hover:bg-muted w-full",
105
- group === "optional" && "font-semibold",
106
- group === "deprecated" && "text-muted-foreground",
107
- )}
108
- >
109
- {properties.length} {group} fields
110
- </Collapsible.Trigger>
45
+ <Markdown className={SchemaProseClasses} content={schema.description} />
111
46
  )}
112
-
113
- <Collapsible.Content>
114
- {properties.map(([propertyName, property]) => (
115
- <SchemaListViewItem
116
- key={propertyName}
117
- property={property}
118
- propertyName={propertyName}
119
- nestingLevel={nestingLevel}
120
- isRequired={required.includes(propertyName)}
47
+ <ul className="border-border border rounded overflow-hidden">
48
+ {objectEntries(groups).map(([group, properties]) => (
49
+ <SchemaListViewItemGroup
50
+ key={group}
51
+ defaultOpen={defaultOpen}
52
+ group={group}
53
+ nestingLevel={level}
54
+ properties={properties ?? []}
55
+ required={schema.required ?? []}
121
56
  />
122
57
  ))}
123
- </Collapsible.Content>
124
- </Collapsible.Root>
125
- );
126
- };
127
-
128
- const SchemaListViewItem = ({
129
- propertyName,
130
- property,
131
- nestingLevel,
132
- isRequired,
133
- }: {
134
- propertyName: string;
135
- isRequired: boolean;
136
- property: SchemaObject;
137
- nestingLevel: number;
138
- }) => {
139
- return (
140
- <div
141
- key={propertyName}
142
- className={cn(
143
- nestingLevel > 0 ? "py-2" : "py-4",
144
- "px-2 border-t border-border bg-border/20 hover:bg-border/30 flex gap-1 flex-col text-sm",
145
- property.deprecated && "opacity-50",
146
- )}
147
- >
148
- <div className="flex items-center gap-2 relative">
149
- <code>
150
- {propertyName} {property.title}
151
- </code>
152
-
153
- {property.type && (
154
- <span className="text-xs text-muted-foreground">{property.type}</span>
155
- )}
156
- {property.deprecated && (
157
- <span className="text-xs text-muted-foreground">Deprecated</span>
158
- )}
159
- {!isRequired && (
160
- <span className="py-px px-1.5 font-medium text-xs border border-border rounded-lg">
161
- optional {property.required}
162
- </span>
163
- )}
164
- </div>
165
- {property.description && (
166
- <Markdown
167
- content={property.description}
168
- className="text-sm leading-normal line-clamp-4 "
169
- />
170
- )}
171
-
172
- {property.enum && (
173
- <span className="text-sm text-muted-foreground flex gap-1 flex-wrap items-center">
174
- <span>Possible values</span>
175
- {property.enum
176
- .filter((value) => value)
177
- .map((value) => (
178
- <span
179
- key={value}
180
- className="font-mono text-xs border-border border bg-muted rounded px-1"
181
- >
182
- {value}
183
- </span>
184
- ))
185
- .slice(0, 4)}
186
- {property.enum.length > 4 && (
187
- <span className="font-mono text-xs border-border border bg-muted rounded px-1">
188
- ...
189
- </span>
190
- )}
191
- </span>
192
- )}
193
-
194
- <Collapsible.Root className="CollapsibleRoot" defaultOpen={false}>
195
- {property.type === "object" ||
196
- (property.type === "array" && property.items.type === "object") ? (
197
- <Collapsible.Trigger asChild>
198
- <Button variant="ghost" size="sm">
199
- Show nested fields
200
- <ListPlusIcon size={18} className="ml-1.5" />
201
- </Button>
202
- </Collapsible.Trigger>
203
- ) : null}
204
-
205
- <Collapsible.Content>
206
- {property.type === "object" && (
207
- <div className="mt-2.5">
208
- <SchemaListView
209
- schema={property}
210
- level={nestingLevel + 1}
211
- defaultOpen
212
- />
213
- </div>
214
- )}
215
- {property.type === "array" && property.items.type === "object" && (
216
- <div className="mt-2.5">
217
- <SchemaListView
218
- schema={property.items}
219
- defaultOpen
220
- level={nestingLevel + 1}
221
- />
222
- </div>
223
- )}
224
- </Collapsible.Content>
225
- </Collapsible.Root>
58
+ </ul>
226
59
  </div>
227
60
  );
228
61
  };
@@ -0,0 +1,110 @@
1
+ import * as Collapsible from "@radix-ui/react-collapsible";
2
+ import { ListPlusIcon } from "lucide-react";
3
+ import { Markdown } from "../../components/Markdown.js";
4
+ import { SchemaObject } from "../../oas/parser/index.js";
5
+ import { Button } from "../../ui/Button.js";
6
+ import { cn } from "../../util/cn.js";
7
+ import { SchemaListView } from "./SchemaListView.js";
8
+
9
+ export const SchemaListViewItem = ({
10
+ propertyName,
11
+ property,
12
+ nestingLevel,
13
+ isRequired,
14
+ }: {
15
+ propertyName: string;
16
+ isRequired: boolean;
17
+ property: SchemaObject;
18
+ nestingLevel: number;
19
+ }) => {
20
+ return (
21
+ <div
22
+ key={propertyName}
23
+ className={cn(
24
+ "p-4 bg-border/20 hover:bg-border/30 flex gap-1 flex-col text-sm",
25
+ property.deprecated && "opacity-50",
26
+ )}
27
+ >
28
+ <div className="flex items-center gap-2 relative">
29
+ <code>
30
+ {propertyName} {property.title}
31
+ </code>
32
+
33
+ {property.type && (
34
+ <span className="text-muted-foreground">{property.type}</span>
35
+ )}
36
+ {property.deprecated && (
37
+ <span className="text-muted-foreground">Deprecated</span>
38
+ )}
39
+ {!isRequired && (
40
+ <span className="py-px px-1.5 font-medium border border-border rounded-lg">
41
+ optional {property.required}
42
+ </span>
43
+ )}
44
+ </div>
45
+ {property.description && (
46
+ <Markdown
47
+ content={property.description}
48
+ className="text-sm leading-normal line-clamp-4 "
49
+ />
50
+ )}
51
+
52
+ {property.enum && (
53
+ <span className="text-sm text-muted-foreground flex gap-1 flex-wrap items-center">
54
+ <span>Possible values</span>
55
+ {/* Make values unique, some schemas have duplicates */}
56
+ {[...new Set(property.enum.filter((value) => value))]
57
+ .map((value) => (
58
+ <span
59
+ key={value}
60
+ className="font-mono text-xs border-border border bg-muted rounded px-1"
61
+ >
62
+ {value}
63
+ </span>
64
+ ))
65
+ .slice(0, 4)}
66
+ {property.enum.length > 4 && (
67
+ <span className="font-mono text-xs border-border border bg-muted rounded px-1">
68
+ ...
69
+ </span>
70
+ )}
71
+ </span>
72
+ )}
73
+
74
+ {(property.type === "object" &&
75
+ (property.properties?.length ??
76
+ Object.entries(property.additionalProperties ?? {}).length > 0)) ||
77
+ (property.type === "array" && property.items.type === "object") ? (
78
+ <Collapsible.Root className="CollapsibleRoot" defaultOpen={false}>
79
+ <Collapsible.Trigger asChild>
80
+ <Button variant="ghost" size="sm">
81
+ Show nested fields
82
+ <ListPlusIcon size={18} className="ml-1.5" />
83
+ </Button>
84
+ </Collapsible.Trigger>
85
+
86
+ <Collapsible.Content>
87
+ {property.type === "object" && (
88
+ <div className="mt-2.5">
89
+ <SchemaListView
90
+ schema={property}
91
+ level={nestingLevel + 1}
92
+ defaultOpen
93
+ />
94
+ </div>
95
+ )}
96
+ {property.type === "array" && property.items.type === "object" && (
97
+ <div className="mt-2.5">
98
+ <SchemaListView
99
+ schema={property.items}
100
+ defaultOpen
101
+ level={nestingLevel + 1}
102
+ />
103
+ </div>
104
+ )}
105
+ </Collapsible.Content>
106
+ </Collapsible.Root>
107
+ ) : null}
108
+ </div>
109
+ );
110
+ };
@@ -0,0 +1,63 @@
1
+ import * as Collapsible from "@radix-ui/react-collapsible";
2
+ import { useState } from "react";
3
+ import { SchemaObject } from "../../oas/parser/index.js";
4
+ import { cn } from "../../util/cn.js";
5
+ import { SchemaListViewItem } from "./SchemaListViewItem.js";
6
+
7
+ export const SchemaListViewItemGroup = ({
8
+ group,
9
+ properties,
10
+ nestingLevel,
11
+ required,
12
+ defaultOpen = false,
13
+ }: {
14
+ group: "optional" | "required" | "deprecated";
15
+ defaultOpen?: boolean;
16
+ properties: [string, SchemaObject][];
17
+ nestingLevel: number;
18
+ required: string[];
19
+ }) => {
20
+ const notCollapsible =
21
+ defaultOpen ||
22
+ group === "required" ||
23
+ properties.length === 1 ||
24
+ nestingLevel === 0;
25
+
26
+ const [open, setOpen] = useState(notCollapsible);
27
+
28
+ if (properties.length === 0) {
29
+ return;
30
+ }
31
+
32
+ return (
33
+ <Collapsible.Root
34
+ className="CollapsibleRoot"
35
+ open={open}
36
+ onOpenChange={setOpen}
37
+ >
38
+ {!open && (
39
+ <Collapsible.Trigger
40
+ className={cn(
41
+ "py-2 hover:bg-muted w-full",
42
+ group === "optional" && "font-semibold",
43
+ group === "deprecated" && "text-muted-foreground",
44
+ )}
45
+ >
46
+ {properties.length} {group} fields
47
+ </Collapsible.Trigger>
48
+ )}
49
+
50
+ <Collapsible.Content className="divide-y divide-border">
51
+ {properties.map(([propertyName, property]) => (
52
+ <SchemaListViewItem
53
+ key={propertyName}
54
+ property={property}
55
+ propertyName={propertyName}
56
+ nestingLevel={nestingLevel}
57
+ isRequired={required.includes(propertyName)}
58
+ />
59
+ ))}
60
+ </Collapsible.Content>
61
+ </Collapsible.Root>
62
+ );
63
+ };
@@ -0,0 +1,7 @@
1
+ import { ProseClasses } from "../../../components/Markdown.js";
2
+ import { cn } from "../../../util/cn.js";
3
+
4
+ export const SchemaProseClasses = cn(
5
+ ProseClasses,
6
+ "max-w-full prose-img:max-w-prose",
7
+ );
@@ -74,7 +74,7 @@ export const MdxComponents = {
74
74
  return (
75
75
  <SyntaxHighlight
76
76
  language={match?.[1] ?? "markup"}
77
- className="rounded-xl overflow-x-auto p-4 border border-border dark:!bg-foreground/10 dark:border-transparent"
77
+ className="rounded-xl overflow-x-auto p-4 border border-border dark:!bg-foreground/10 dark:border-transparent whitespace-nowrap"
78
78
  showLanguageIndicator
79
79
  code={String(children).trim()}
80
80
  />
@@ -0,0 +1,5 @@
1
+ type ValueOf<T> = T[keyof T];
2
+ type Entries<T> = [keyof T, ValueOf<T>][];
3
+
4
+ export const objectEntries = <T extends object>(obj: T): Entries<T> =>
5
+ Object.entries(obj) as Entries<T>;
@@ -0,0 +1,4 @@
1
+ export const renderIf = <G, R>(
2
+ variable: G | undefined | null,
3
+ callback: (variable: G) => R,
4
+ ): R | undefined => (variable ? callback(variable) : undefined);