zudoku 0.13.5 → 0.13.7

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 (286) hide show
  1. package/dist/app/main.js +1 -1
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/lib/authentication/components/CallbackHandler.js +21 -31
  4. package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
  5. package/dist/lib/errors/ErrorAlert.d.ts +1 -1
  6. package/dist/lib/errors/ErrorAlert.js +8 -3
  7. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  8. package/dist/lib/plugins/api-keys/CreateApiKey.js +1 -1
  9. package/dist/lib/plugins/api-keys/CreateApiKey.js.map +1 -1
  10. package/dist/lib/plugins/openapi/Sidecar.js +2 -2
  11. package/dist/lib/plugins/openapi/playground/Playground.js +1 -1
  12. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  13. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js +1 -1
  14. package/dist/lib/plugins/openapi/playground/PlaygroundDialog.js.map +1 -1
  15. package/dist/lib/ui/Accordion.d.ts +7 -0
  16. package/dist/lib/ui/Accordion.js +14 -0
  17. package/dist/lib/ui/Accordion.js.map +1 -0
  18. package/dist/lib/ui/Alert.d.ts +8 -0
  19. package/dist/lib/ui/Alert.js +23 -0
  20. package/dist/lib/ui/Alert.js.map +1 -0
  21. package/dist/lib/ui/AlertDialog.d.ts +20 -0
  22. package/dist/lib/ui/AlertDialog.js +27 -0
  23. package/dist/lib/ui/AlertDialog.js.map +1 -0
  24. package/dist/lib/ui/AspectRatio.d.ts +3 -0
  25. package/dist/lib/ui/AspectRatio.js +4 -0
  26. package/dist/lib/ui/AspectRatio.js.map +1 -0
  27. package/dist/lib/ui/Badge.d.ts +9 -0
  28. package/dist/lib/ui/Badge.js +21 -0
  29. package/dist/lib/ui/Badge.js.map +1 -0
  30. package/dist/lib/ui/Breadcrumb.d.ts +19 -0
  31. package/dist/lib/ui/Breadcrumb.js +24 -0
  32. package/dist/lib/ui/Breadcrumb.js.map +1 -0
  33. package/dist/lib/ui/Button.d.ts +1 -2
  34. package/dist/lib/ui/Button.js +1 -1
  35. package/dist/lib/ui/Button.js.map +1 -1
  36. package/dist/lib/ui/Carousel.d.ts +18 -0
  37. package/dist/lib/ui/Carousel.js +99 -0
  38. package/dist/lib/ui/Carousel.js.map +1 -0
  39. package/dist/lib/ui/Checkbox.d.ts +4 -0
  40. package/dist/lib/ui/Checkbox.js +9 -0
  41. package/dist/lib/ui/Checkbox.js.map +1 -0
  42. package/dist/lib/ui/Collapsible.d.ts +5 -0
  43. package/dist/lib/ui/Collapsible.js +6 -0
  44. package/dist/lib/ui/Collapsible.js.map +1 -0
  45. package/dist/lib/{components → ui}/Dialog.js +2 -2
  46. package/dist/lib/ui/Dialog.js.map +1 -0
  47. package/dist/lib/ui/Form.d.ts +23 -0
  48. package/dist/lib/ui/Form.js +63 -0
  49. package/dist/lib/ui/Form.js.map +1 -0
  50. package/dist/lib/ui/HoverCard.d.ts +6 -0
  51. package/dist/lib/ui/HoverCard.js +10 -0
  52. package/dist/lib/ui/HoverCard.js.map +1 -0
  53. package/dist/lib/ui/Label.d.ts +5 -0
  54. package/dist/lib/ui/Label.js +10 -0
  55. package/dist/lib/ui/Label.js.map +1 -0
  56. package/dist/lib/ui/Pagination.d.ts +28 -0
  57. package/dist/lib/ui/Pagination.js +24 -0
  58. package/dist/lib/ui/Pagination.js.map +1 -0
  59. package/dist/lib/ui/Popover.d.ts +6 -0
  60. package/dist/lib/ui/Popover.js +10 -0
  61. package/dist/lib/ui/Popover.js.map +1 -0
  62. package/dist/lib/ui/Progress.d.ts +4 -0
  63. package/dist/lib/ui/Progress.js +8 -0
  64. package/dist/lib/ui/Progress.js.map +1 -0
  65. package/dist/lib/ui/RadioGroup.d.ts +5 -0
  66. package/dist/lib/ui/RadioGroup.js +15 -0
  67. package/dist/lib/ui/RadioGroup.js.map +1 -0
  68. package/dist/lib/ui/ScrollArea.d.ts +5 -0
  69. package/dist/lib/ui/ScrollArea.js +12 -0
  70. package/dist/lib/ui/ScrollArea.js.map +1 -0
  71. package/dist/lib/ui/Select.js.map +1 -0
  72. package/dist/lib/ui/Skeleton.d.ts +2 -0
  73. package/dist/lib/ui/Skeleton.js +7 -0
  74. package/dist/lib/ui/Skeleton.js.map +1 -0
  75. package/dist/lib/ui/Slider.d.ts +4 -0
  76. package/dist/lib/ui/Slider.js +8 -0
  77. package/dist/lib/ui/Slider.js.map +1 -0
  78. package/dist/lib/ui/Switch.d.ts +4 -0
  79. package/dist/lib/ui/Switch.js +8 -0
  80. package/dist/lib/ui/Switch.js.map +1 -0
  81. package/dist/lib/ui/Textarea.d.ts +4 -0
  82. package/dist/lib/ui/Textarea.js +9 -0
  83. package/dist/lib/ui/Textarea.js.map +1 -0
  84. package/dist/lib/ui/Toggle.d.ts +12 -0
  85. package/dist/lib/ui/Toggle.js +26 -0
  86. package/dist/lib/ui/Toggle.js.map +1 -0
  87. package/dist/lib/ui/ToggleGroup.d.ts +12 -0
  88. package/dist/lib/ui/ToggleGroup.js +21 -0
  89. package/dist/lib/ui/ToggleGroup.js.map +1 -0
  90. package/dist/lib/ui/Tooltip.d.ts +7 -0
  91. package/dist/lib/ui/Tooltip.js +11 -0
  92. package/dist/lib/ui/Tooltip.js.map +1 -0
  93. package/dist/lib/util/invariant.d.ts +9 -0
  94. package/dist/lib/util/invariant.js +7 -3
  95. package/dist/lib/util/invariant.js.map +1 -1
  96. package/dist/vite/plugin-component.js +17 -7
  97. package/dist/vite/plugin-component.js.map +1 -1
  98. package/lib/{AuthenticationPlugin-D1nhROkO.js → AuthenticationPlugin-Bpdes0cJ.js} +3 -3
  99. package/lib/{AuthenticationPlugin-D1nhROkO.js.map → AuthenticationPlugin-Bpdes0cJ.js.map} +1 -1
  100. package/lib/{CategoryHeading-B7TlPvuN.js → CategoryHeading-Bb9dqxD3.js} +4 -4
  101. package/lib/{CategoryHeading-B7TlPvuN.js.map → CategoryHeading-Bb9dqxD3.js.map} +1 -1
  102. package/lib/{DeveloperHint-B_QCCafl.js → DeveloperHint-DHdLXGHA.js} +2 -2
  103. package/lib/{DeveloperHint-B_QCCafl.js.map → DeveloperHint-DHdLXGHA.js.map} +1 -1
  104. package/lib/{Markdown-Y__eLG0x.js → Markdown-1BO9EA_X.js} +4265 -6649
  105. package/lib/Markdown-1BO9EA_X.js.map +1 -0
  106. package/lib/{MdxPage-B4FcPIi5.js → MdxPage-BEOcOICU.js} +28 -27
  107. package/lib/{MdxPage-B4FcPIi5.js.map → MdxPage-BEOcOICU.js.map} +1 -1
  108. package/lib/{OperationList-C2jKCTwZ.js → OperationList-Cea2Yt8e.js} +131 -128
  109. package/lib/{OperationList-C2jKCTwZ.js.map → OperationList-Cea2Yt8e.js.map} +1 -1
  110. package/lib/{Route-DWXcQzRK.js → Route-BHT-onwf.js} +3 -3
  111. package/lib/{Route-DWXcQzRK.js.map → Route-BHT-onwf.js.map} +1 -1
  112. package/lib/Select-m1aXZGAP.js +223 -0
  113. package/lib/Select-m1aXZGAP.js.map +1 -0
  114. package/lib/SlotletProvider-CPfsBw39.js +241 -0
  115. package/lib/SlotletProvider-CPfsBw39.js.map +1 -0
  116. package/lib/Spinner-C6zroowC.js +40 -0
  117. package/lib/Spinner-C6zroowC.js.map +1 -0
  118. package/lib/StaggeredRender-DDHSzQKE.js +17 -0
  119. package/lib/StaggeredRender-DDHSzQKE.js.map +1 -0
  120. package/lib/{ZudokuContext-MRoel6bS.js → ZudokuContext-D1D8Anlj.js} +20 -20
  121. package/lib/{ZudokuContext-MRoel6bS.js.map → ZudokuContext-D1D8Anlj.js.map} +1 -1
  122. package/lib/_commonjsHelpers-BkfeUUK-.js +29 -0
  123. package/lib/_commonjsHelpers-BkfeUUK-.js.map +1 -0
  124. package/lib/cn-BmFQLtkS.js +2279 -0
  125. package/lib/cn-BmFQLtkS.js.map +1 -0
  126. package/lib/hook-JSRuxV1P.js +229 -0
  127. package/lib/hook-JSRuxV1P.js.map +1 -0
  128. package/lib/index-Bn6Lc9tq.js +9 -0
  129. package/lib/{index-DJqnphbT.js.map → index-Bn6Lc9tq.js.map} +1 -1
  130. package/lib/index-BuAyrJe3.js +46 -0
  131. package/lib/index-BuAyrJe3.js.map +1 -0
  132. package/lib/{index-DFN92YJN.js → index-CRo94sKK.js} +5 -4
  133. package/lib/{index-DFN92YJN.js.map → index-CRo94sKK.js.map} +1 -1
  134. package/lib/{index-Dso_b0di.js → index-Cj-F-4ME.js} +1207 -1424
  135. package/lib/index-Cj-F-4ME.js.map +1 -0
  136. package/lib/{index-D06ATMgg.js → index-LNp6rxyU.js} +2 -2
  137. package/lib/{index-D06ATMgg.js.map → index-LNp6rxyU.js.map} +1 -1
  138. package/lib/index.esm-C5mr_sKO.js +1193 -0
  139. package/lib/index.esm-C5mr_sKO.js.map +1 -0
  140. package/lib/invariant-Caa8-XvF.js +26 -0
  141. package/lib/invariant-Caa8-XvF.js.map +1 -0
  142. package/lib/ui/Accordion.js +47 -0
  143. package/lib/ui/Accordion.js.map +1 -0
  144. package/lib/ui/Alert.js +51 -0
  145. package/lib/ui/Alert.js.map +1 -0
  146. package/lib/ui/AlertDialog.js +114 -0
  147. package/lib/ui/AlertDialog.js.map +1 -0
  148. package/lib/ui/AspectRatio.js +6 -0
  149. package/lib/ui/AspectRatio.js.map +1 -0
  150. package/lib/ui/Badge.js +27 -0
  151. package/lib/ui/Badge.js.map +1 -0
  152. package/lib/ui/Breadcrumb.js +94 -0
  153. package/lib/ui/Breadcrumb.js.map +1 -0
  154. package/lib/ui/Button.js +49 -0
  155. package/lib/ui/Button.js.map +1 -0
  156. package/lib/ui/Callout.js +77 -0
  157. package/lib/ui/Callout.js.map +1 -0
  158. package/lib/ui/Card.js +62 -0
  159. package/lib/ui/Card.js.map +1 -0
  160. package/lib/ui/Carousel.js +1410 -0
  161. package/lib/ui/Carousel.js.map +1 -0
  162. package/lib/ui/Checkbox.js +28 -0
  163. package/lib/ui/Checkbox.js.map +1 -0
  164. package/lib/ui/Collapsible.js +8 -0
  165. package/lib/ui/Collapsible.js.map +1 -0
  166. package/lib/ui/Dialog.js +101 -0
  167. package/lib/ui/Dialog.js.map +1 -0
  168. package/lib/ui/Drawer.js +1153 -0
  169. package/lib/ui/Drawer.js.map +1 -0
  170. package/lib/ui/DropdownMenu.js +145 -0
  171. package/lib/ui/DropdownMenu.js.map +1 -0
  172. package/lib/ui/Form.js +95 -0
  173. package/lib/ui/Form.js.map +1 -0
  174. package/lib/ui/HoverCard.js +24 -0
  175. package/lib/ui/HoverCard.js.map +1 -0
  176. package/lib/ui/Input.js +22 -0
  177. package/lib/ui/Input.js.map +1 -0
  178. package/lib/ui/Label.js +20 -0
  179. package/lib/ui/Label.js.map +1 -0
  180. package/lib/ui/Note.js +51 -0
  181. package/lib/ui/Note.js.map +1 -0
  182. package/lib/ui/Pagination.js +106 -0
  183. package/lib/ui/Pagination.js.map +1 -0
  184. package/lib/ui/Popover.js +24 -0
  185. package/lib/ui/Popover.js.map +1 -0
  186. package/lib/ui/Progress.js +27 -0
  187. package/lib/ui/Progress.js.map +1 -0
  188. package/lib/ui/RadioGroup.js +32 -0
  189. package/lib/ui/RadioGroup.js.map +1 -0
  190. package/lib/ui/ScrollArea.js +39 -0
  191. package/lib/ui/ScrollArea.js.map +1 -0
  192. package/lib/ui/Select.js +122 -0
  193. package/lib/ui/Select.js.map +1 -0
  194. package/lib/ui/Skeleton.js +18 -0
  195. package/lib/ui/Skeleton.js.map +1 -0
  196. package/lib/ui/Slider.js +24 -0
  197. package/lib/ui/Slider.js.map +1 -0
  198. package/lib/ui/Switch.js +28 -0
  199. package/lib/ui/Switch.js.map +1 -0
  200. package/lib/ui/Tabs.js +47 -0
  201. package/lib/ui/Tabs.js.map +1 -0
  202. package/lib/ui/Textarea.js +21 -0
  203. package/lib/ui/Textarea.js.map +1 -0
  204. package/lib/ui/Toggle.js +38 -0
  205. package/lib/ui/Toggle.js.map +1 -0
  206. package/lib/ui/ToggleGroup.js +42 -0
  207. package/lib/ui/ToggleGroup.js.map +1 -0
  208. package/lib/ui/Tooltip.js +24 -0
  209. package/lib/ui/Tooltip.js.map +1 -0
  210. package/lib/{useExposedProps-BWwxa-Hg.js → useExposedProps-B9K-9GTc.js} +2 -2
  211. package/lib/{useExposedProps-BWwxa-Hg.js.map → useExposedProps-B9K-9GTc.js.map} +1 -1
  212. package/lib/{utils-C8S3st2k.js → utils-B2yoT99j.js} +63 -63
  213. package/lib/{utils-C8S3st2k.js.map → utils-B2yoT99j.js.map} +1 -1
  214. package/lib/zudoku.auth-clerk.js +1 -1
  215. package/lib/zudoku.auth-openid.js +477 -483
  216. package/lib/zudoku.auth-openid.js.map +1 -1
  217. package/lib/zudoku.components.js +847 -2845
  218. package/lib/zudoku.components.js.map +1 -1
  219. package/lib/zudoku.openapi-worker.js +2 -2
  220. package/lib/zudoku.plugin-api-keys.js +68 -75
  221. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  222. package/lib/zudoku.plugin-custom-pages.js +14 -13
  223. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  224. package/lib/zudoku.plugin-markdown.js +1 -1
  225. package/lib/zudoku.plugin-openapi.js +6 -6
  226. package/package.json +28 -6
  227. package/src/app/main.tsx +1 -1
  228. package/src/lib/authentication/components/CallbackHandler.tsx +20 -51
  229. package/src/lib/errors/ErrorAlert.tsx +18 -5
  230. package/src/lib/plugins/api-keys/CreateApiKey.tsx +2 -2
  231. package/src/lib/plugins/openapi/Sidecar.tsx +2 -2
  232. package/src/lib/plugins/openapi/playground/Playground.tsx +3 -3
  233. package/src/lib/plugins/openapi/playground/PlaygroundDialog.tsx +1 -1
  234. package/src/lib/ui/Accordion.tsx +56 -0
  235. package/src/lib/ui/Alert.tsx +59 -0
  236. package/src/lib/ui/AlertDialog.tsx +139 -0
  237. package/src/lib/ui/AspectRatio.tsx +5 -0
  238. package/src/lib/ui/Badge.tsx +36 -0
  239. package/src/lib/ui/Breadcrumb.tsx +115 -0
  240. package/src/lib/ui/Button.tsx +1 -1
  241. package/src/lib/ui/Carousel.tsx +260 -0
  242. package/src/lib/ui/Checkbox.tsx +28 -0
  243. package/src/lib/ui/Collapsible.tsx +9 -0
  244. package/src/lib/{components → ui}/Dialog.tsx +4 -3
  245. package/src/lib/ui/Form.tsx +177 -0
  246. package/src/lib/ui/HoverCard.tsx +27 -0
  247. package/src/lib/ui/Label.tsx +24 -0
  248. package/src/lib/ui/Pagination.tsx +117 -0
  249. package/src/lib/ui/Popover.tsx +29 -0
  250. package/src/lib/ui/Progress.tsx +26 -0
  251. package/src/lib/ui/RadioGroup.tsx +42 -0
  252. package/src/lib/ui/ScrollArea.tsx +46 -0
  253. package/src/lib/ui/Skeleton.tsx +15 -0
  254. package/src/lib/ui/Slider.tsx +26 -0
  255. package/src/lib/ui/Switch.tsx +27 -0
  256. package/src/lib/ui/Textarea.tsx +23 -0
  257. package/src/lib/ui/Toggle.tsx +43 -0
  258. package/src/lib/ui/ToggleGroup.tsx +59 -0
  259. package/src/lib/ui/Tooltip.tsx +28 -0
  260. package/src/lib/util/invariant.ts +15 -3
  261. package/dist/internal.d.ts +0 -1
  262. package/dist/internal.js +0 -2
  263. package/dist/internal.js.map +0 -1
  264. package/dist/lib/components/Dialog.js.map +0 -1
  265. package/dist/lib/components/Select.js.map +0 -1
  266. package/lib/ErrorPage-DqqAV1dr.js +0 -16
  267. package/lib/ErrorPage-DqqAV1dr.js.map +0 -1
  268. package/lib/Input-DrR6P3mq.js +0 -2229
  269. package/lib/Input-DrR6P3mq.js.map +0 -1
  270. package/lib/Markdown-Y__eLG0x.js.map +0 -1
  271. package/lib/SidebarBadge-C0iWtji9.js +0 -503
  272. package/lib/SidebarBadge-C0iWtji9.js.map +0 -1
  273. package/lib/SlotletProvider-DmqWiVFt.js +0 -239
  274. package/lib/SlotletProvider-DmqWiVFt.js.map +0 -1
  275. package/lib/Spinner-3cQDBVGr.js +0 -7
  276. package/lib/Spinner-3cQDBVGr.js.map +0 -1
  277. package/lib/index-Ch8VO_uX.js +0 -2867
  278. package/lib/index-Ch8VO_uX.js.map +0 -1
  279. package/lib/index-DJqnphbT.js +0 -35
  280. package/lib/index-Dso_b0di.js.map +0 -1
  281. package/lib/index-bYAqbdYl.js +0 -124
  282. package/lib/index-bYAqbdYl.js.map +0 -1
  283. /package/dist/lib/{components → ui}/Dialog.d.ts +0 -0
  284. /package/dist/lib/{components → ui}/Select.d.ts +0 -0
  285. /package/dist/lib/{components → ui}/Select.js +0 -0
  286. /package/src/lib/{components → ui}/Select.tsx +0 -0
@@ -13,8 +13,8 @@ var Sn = (t, e, n, i) => ({
13
13
  return l(t, e, i);
14
14
  }
15
15
  });
16
- import { a as $l } from "./index-D06ATMgg.js";
17
- import { g as jl } from "./index-DJqnphbT.js";
16
+ import { a as $l } from "./index-LNp6rxyU.js";
17
+ import { g as jl } from "./_commonjsHelpers-BkfeUUK-.js";
18
18
  import { C as Qa, b as Wa, m as Ha, f as Ya } from "./urql-core-KJnLL26g.js";
19
19
  function Pl(t, e) {
20
20
  for (var n = 0; n < e.length; n++) {
@@ -1,40 +1,33 @@
1
1
  import { j as e } from "./jsx-runtime-B6kdoens.js";
2
- import { S as x, R as f } from "./SlotletProvider-DmqWiVFt.js";
3
- import { u as g, a as d, I as j, S as v, b as w, c as b, d as k, e as K, f as m } from "./Input-DrR6P3mq.js";
4
- import { a as N, L as u, O as I } from "./index-DFN92YJN.js";
5
- import { u as h, a as E, b as S } from "./ZudokuContext-MRoel6bS.js";
6
- import { B as l, n as A } from "./index-Ch8VO_uX.js";
7
- import { D as C } from "./DeveloperHint-B_QCCafl.js";
2
+ import { S as m, R as f } from "./SlotletProvider-CPfsBw39.js";
3
+ import { i as c } from "./invariant-Caa8-XvF.js";
4
+ import { u as d, S as g, a as j, b as v, c as w, d as b, e as x } from "./Select-m1aXZGAP.js";
5
+ import { a as k } from "./index.esm-C5mr_sKO.js";
6
+ import { a as K, L as u, O as N } from "./index-CRo94sKK.js";
7
+ import { u as h, a as I, e as S } from "./ZudokuContext-D1D8Anlj.js";
8
+ import { Button as l } from "./ui/Button.js";
9
+ import { Input as A } from "./ui/Input.js";
10
+ import { u as C } from "./hook-JSRuxV1P.js";
11
+ import { D as E } from "./DeveloperHint-DHdLXGHA.js";
8
12
  import { RotateCwIcon as P, TrashIcon as D, EyeOffIcon as R, EyeIcon as q, CheckIcon as O, CopyIcon as z } from "lucide-react";
9
13
  import { useState as p } from "react";
10
- import { a as T } from "./Markdown-Y__eLG0x.js";
11
- function c(t, s) {
12
- if (t)
13
- return;
14
- const i = typeof s == "function" ? s() : s;
15
- throw new F(i ?? "Invariant failed");
16
- }
17
- class F extends Error {
18
- constructor(s) {
19
- super(s), this.name = "ZudokuError";
20
- }
21
- }
22
- const L = ({ service: t }) => {
23
- const s = h(), i = N(), n = g({
14
+ import { c as T } from "./cn-BmFQLtkS.js";
15
+ const F = ({ service: t }) => {
16
+ const s = h(), r = K(), n = k({
24
17
  defaultValues: {
25
18
  expiresOn: "30"
26
19
  }
27
20
  }), o = d({
28
- mutationFn: ({ description: a, expiresOn: r }) => {
21
+ mutationFn: ({ description: a, expiresOn: i }) => {
29
22
  if (!t.createKey)
30
23
  throw new Error("deleteKey not implemented");
31
- const y = r !== "never" ? V(Number(r)) : void 0;
24
+ const y = i !== "never" ? L(Number(i)) : void 0;
32
25
  return t.createKey(
33
26
  { description: a, expiresOn: y },
34
27
  s
35
28
  );
36
29
  },
37
- onSuccess: () => i("/settings/api-keys/")
30
+ onSuccess: () => r("/settings/api-keys/")
38
31
  });
39
32
  return t.createKey ? /* @__PURE__ */ e.jsxs("div", { className: "max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]", children: [
40
33
  /* @__PURE__ */ e.jsx("div", { className: "flex justify-between mb-4 border-b pb-1", children: /* @__PURE__ */ e.jsx("h1", { className: "font-medium text-2xl", children: "New API Key" }) }),
@@ -44,21 +37,21 @@ const L = ({ service: t }) => {
44
37
  onSubmit: n.handleSubmit((a) => o.mutate(a)),
45
38
  children: /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2 flex-col", children: [
46
39
  "Note",
47
- /* @__PURE__ */ e.jsx(j, { ...n.register("description") }),
40
+ /* @__PURE__ */ e.jsx(A, { ...n.register("description") }),
48
41
  "Expiration",
49
42
  /* @__PURE__ */ e.jsxs(
50
- v,
43
+ g,
51
44
  {
52
45
  onValueChange: (a) => n.setValue("expiresOn", a),
53
46
  defaultValue: n.getValues("expiresOn"),
54
47
  children: [
55
- /* @__PURE__ */ e.jsx(w, { children: /* @__PURE__ */ e.jsx(b, {}) }),
56
- /* @__PURE__ */ e.jsx(k, { children: /* @__PURE__ */ e.jsxs(K, { children: [
57
- [7, 30, 60, 90].map((a) => /* @__PURE__ */ e.jsxs(m, { value: String(a), children: [
48
+ /* @__PURE__ */ e.jsx(j, { children: /* @__PURE__ */ e.jsx(v, {}) }),
49
+ /* @__PURE__ */ e.jsx(w, { children: /* @__PURE__ */ e.jsxs(b, { children: [
50
+ [7, 30, 60, 90].map((a) => /* @__PURE__ */ e.jsxs(x, { value: String(a), children: [
58
51
  a,
59
52
  " days"
60
53
  ] }, a)),
61
- /* @__PURE__ */ e.jsx(m, { value: "never", children: "Never" })
54
+ /* @__PURE__ */ e.jsx(x, { value: "never", children: "Never" })
62
55
  ] }) })
63
56
  ]
64
57
  }
@@ -71,48 +64,48 @@ const L = ({ service: t }) => {
71
64
  }
72
65
  )
73
66
  ] }) : null;
74
- }, V = (t) => {
67
+ }, L = (t) => {
75
68
  const s = /* @__PURE__ */ new Date();
76
69
  return s.setDate(s.getDate() + t), s.toISOString();
77
- }, M = () => {
78
- const t = A();
79
- return t.isAuthEnabled && t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(I, {}) : t.isAuthEnabled ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: [
70
+ }, V = () => {
71
+ const t = C();
72
+ return t.isAuthEnabled && t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(N, {}) : t.isAuthEnabled ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: [
80
73
  "Please login first to view this page",
81
74
  /* @__PURE__ */ e.jsx(l, { onClick: () => t.login(), children: "Login" })
82
- ] }) : /* @__PURE__ */ e.jsx("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: /* @__PURE__ */ e.jsxs(C, { className: "max-w-[600px]", children: [
75
+ ] }) : /* @__PURE__ */ e.jsx("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: /* @__PURE__ */ e.jsxs(E, { className: "max-w-[600px]", children: [
83
76
  "Authentication needs to be enabled for API keys to work. Enable it in your Zudoku configuration under ",
84
77
  /* @__PURE__ */ e.jsx("code", { children: "authentication" }),
85
78
  "."
86
79
  ] }) });
87
- }, _ = ({ service: t }) => {
88
- const s = h(), i = E(), { data: n } = S({
80
+ }, M = ({ service: t }) => {
81
+ const s = h(), r = I(), { data: n } = S({
89
82
  queryFn: () => t.getKeys(s),
90
83
  queryKey: ["api-keys"],
91
84
  retry: !1
92
85
  }), o = d({
93
- mutationFn: (r) => {
86
+ mutationFn: (i) => {
94
87
  if (!t.deleteKey)
95
88
  throw new Error("deleteKey not implemented");
96
- return t.deleteKey(r, s);
89
+ return t.deleteKey(i, s);
97
90
  },
98
91
  onSuccess: () => {
99
- i.invalidateQueries({ queryKey: ["api-keys"] });
92
+ r.invalidateQueries({ queryKey: ["api-keys"] });
100
93
  }
101
94
  }), a = d({
102
- mutationFn: (r) => {
95
+ mutationFn: (i) => {
103
96
  if (!t.rollKey)
104
97
  throw new Error("rollKey not implemented");
105
- return t.rollKey(r, s);
98
+ return t.rollKey(i, s);
106
99
  },
107
- onSuccess: () => i.invalidateQueries({ queryKey: ["api-keys"] })
100
+ onSuccess: () => r.invalidateQueries({ queryKey: ["api-keys"] })
108
101
  });
109
102
  return /* @__PURE__ */ e.jsxs("div", { className: "max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]", children: [
110
- /* @__PURE__ */ e.jsx(x, { name: "api-keys-list-page" }),
103
+ /* @__PURE__ */ e.jsx(m, { name: "api-keys-list-page" }),
111
104
  /* @__PURE__ */ e.jsxs("div", { className: "flex justify-between mb-4 border-b pb-3", children: [
112
105
  /* @__PURE__ */ e.jsx("h1", { className: "font-medium text-2xl", children: "API Keys" }),
113
106
  t.createKey && /* @__PURE__ */ e.jsx(l, { asChild: !0, children: /* @__PURE__ */ e.jsx(u, { to: "/settings/api-keys/new", children: "Create API Key" }) })
114
107
  ] }),
115
- /* @__PURE__ */ e.jsx(x, { name: "api-keys-list-page-before-keys" }),
108
+ /* @__PURE__ */ e.jsx(m, { name: "api-keys-list-page-before-keys" }),
116
109
  n.length === 0 ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-4 items-center p-8 border rounded bg-muted/30 text-muted-foreground", children: [
117
110
  /* @__PURE__ */ e.jsxs("p", { className: "text-center", children: [
118
111
  "No API keys created yet.",
@@ -127,25 +120,25 @@ const L = ({ service: t }) => {
127
120
  "grid grid-cols-1 rounded border divide-y divide-border",
128
121
  "lg:grid-cols-[minmax(250px,min-content)_1fr_min-content]"
129
122
  ),
130
- children: n.map((r) => /* @__PURE__ */ e.jsxs(
123
+ children: n.map((i) => /* @__PURE__ */ e.jsxs(
131
124
  "li",
132
125
  {
133
126
  className: "p-5 grid grid-cols-subgrid col-span-full gap-2 items-center",
134
127
  children: [
135
128
  /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-1 text-sm", children: [
136
- r.description ?? r.id,
129
+ i.description ?? i.id,
137
130
  /* @__PURE__ */ e.jsxs("div", { className: "text-muted-foreground text-xs", children: [
138
- r.createdOn && /* @__PURE__ */ e.jsxs("div", { children: [
131
+ i.createdOn && /* @__PURE__ */ e.jsxs("div", { children: [
139
132
  "Created on ",
140
- new Date(r.createdOn).toLocaleDateString()
133
+ new Date(i.createdOn).toLocaleDateString()
141
134
  ] }),
142
- r.expiresOn && /* @__PURE__ */ e.jsxs("div", { children: [
135
+ i.expiresOn && /* @__PURE__ */ e.jsxs("div", { children: [
143
136
  "Expires on ",
144
- new Date(r.expiresOn).toLocaleDateString()
137
+ new Date(i.expiresOn).toLocaleDateString()
145
138
  ] })
146
139
  ] })
147
140
  ] }),
148
- /* @__PURE__ */ e.jsx("div", { className: "items-center flex lg:justify-center", children: /* @__PURE__ */ e.jsx(Q, { apiKey: r.key }) }),
141
+ /* @__PURE__ */ e.jsx("div", { className: "items-center flex lg:justify-center", children: /* @__PURE__ */ e.jsx(_, { apiKey: i.key }) }),
149
142
  /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2", children: [
150
143
  t.rollKey && /* @__PURE__ */ e.jsx(
151
144
  l,
@@ -154,7 +147,7 @@ const L = ({ service: t }) => {
154
147
  title: "Roll this key",
155
148
  variant: "ghost",
156
149
  onClick: () => {
157
- confirm("Do you want to roll this key?") && a.mutate(r.id);
150
+ confirm("Do you want to roll this key?") && a.mutate(i.id);
158
151
  },
159
152
  children: /* @__PURE__ */ e.jsx(P, { size: 16 })
160
153
  }
@@ -165,7 +158,7 @@ const L = ({ service: t }) => {
165
158
  variant: "ghost",
166
159
  size: "icon",
167
160
  onClick: () => {
168
- confirm("Do you want to delete this key?") && o.mutate(r.id);
161
+ confirm("Do you want to delete this key?") && o.mutate(i.id);
169
162
  },
170
163
  disabled: o.isPending,
171
164
  children: /* @__PURE__ */ e.jsx(D, { size: 16 })
@@ -174,20 +167,20 @@ const L = ({ service: t }) => {
174
167
  ] })
175
168
  ]
176
169
  },
177
- r.id
170
+ i.id
178
171
  ))
179
172
  }
180
173
  )
181
174
  ] });
182
- }, Q = ({ apiKey: t }) => {
183
- const [s, i] = p(!1), [n, o] = p(!1);
175
+ }, _ = ({ apiKey: t }) => {
176
+ const [s, r] = p(!1), [n, o] = p(!1);
184
177
  return /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2 items-center text-sm", children: [
185
178
  /* @__PURE__ */ e.jsx("div", { className: "border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono truncate h-9 items-center flex px-2", children: s ? t : "•".repeat(t.length) }),
186
179
  /* @__PURE__ */ e.jsx(
187
180
  l,
188
181
  {
189
182
  variant: "outline",
190
- onClick: () => i((a) => !a),
183
+ onClick: () => r((a) => !a),
191
184
  size: "icon",
192
185
  children: s ? /* @__PURE__ */ e.jsx(R, { size: 16 }) : /* @__PURE__ */ e.jsx(q, { size: 16 })
193
186
  }
@@ -206,18 +199,18 @@ const L = ({ service: t }) => {
206
199
  }
207
200
  )
208
201
  ] });
209
- }, Z = "https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev", B = (t) => ({
210
- deleteKey: async (s, i) => {
202
+ }, Q = "https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev", G = (t) => ({
203
+ deleteKey: async (s, r) => {
211
204
  const n = new Request(t + `/v1/developer/api-keys/${s}`, {
212
205
  method: "DELETE"
213
206
  });
214
- await i.signRequest(n);
207
+ await r.signRequest(n);
215
208
  const o = await fetch(n);
216
209
  c(o.ok, "Failed to delete API key");
217
210
  },
218
- rollKey: async (s, i) => {
211
+ rollKey: async (s, r) => {
219
212
  const n = await fetch(
220
- await i.signRequest(
213
+ await r.signRequest(
221
214
  new Request(t + `/v1/developer/api-keys/${s}/key`, {
222
215
  method: "DELETE"
223
216
  })
@@ -225,7 +218,7 @@ const L = ({ service: t }) => {
225
218
  );
226
219
  c(n.ok, "Failed to delete API key");
227
220
  },
228
- createKey: async (s, i) => {
221
+ createKey: async (s, r) => {
229
222
  const n = new Request(t + "/v1/developer/api-keys", {
230
223
  method: "POST",
231
224
  headers: {
@@ -233,18 +226,18 @@ const L = ({ service: t }) => {
233
226
  },
234
227
  body: JSON.stringify(s)
235
228
  });
236
- await i.signRequest(n);
229
+ await r.signRequest(n);
237
230
  const o = await fetch(n);
238
231
  c(o.ok, "Failed to create API key");
239
232
  },
240
233
  getKeys: async (s) => {
241
- const i = new Request(t + "/v1/developer/api-keys");
242
- await s.signRequest(i);
243
- const n = await fetch(i);
234
+ const r = new Request(t + "/v1/developer/api-keys");
235
+ await s.signRequest(r);
236
+ const n = await fetch(r);
244
237
  return c(n.ok, "Failed to fetch API keys"), await n.json();
245
238
  }
246
- }), se = (t) => {
247
- const s = "endpoint" in t ? t.endpoint : Z, i = "getKeys" in t ? t : B(s);
239
+ }), re = (t) => {
240
+ const s = "endpoint" in t ? t.endpoint : Q, r = "getKeys" in t ? t : G(s);
248
241
  return {
249
242
  getProfileMenuItems: () => [
250
243
  {
@@ -254,8 +247,8 @@ const L = ({ service: t }) => {
254
247
  ],
255
248
  getIdentities: async (n) => {
256
249
  try {
257
- return (await i.getKeys(n)).map((a) => ({
258
- authorizeRequest: (r) => (r.headers.set("Authorization", `Bearer ${a.key}`), r),
250
+ return (await r.getKeys(n)).map((a) => ({
251
+ authorizeRequest: (i) => (i.headers.set("Authorization", `Bearer ${a.key}`), i),
259
252
  id: a.id,
260
253
  label: a.description ?? a.id
261
254
  }));
@@ -265,16 +258,16 @@ const L = ({ service: t }) => {
265
258
  },
266
259
  getRoutes: () => [
267
260
  {
268
- element: /* @__PURE__ */ e.jsx(M, {}),
261
+ element: /* @__PURE__ */ e.jsx(V, {}),
269
262
  errorElement: /* @__PURE__ */ e.jsx(f, {}),
270
263
  children: [
271
264
  {
272
265
  path: "/settings/api-keys",
273
- element: /* @__PURE__ */ e.jsx(_, { service: i })
266
+ element: /* @__PURE__ */ e.jsx(M, { service: r })
274
267
  },
275
268
  {
276
269
  path: "/settings/api-keys/new",
277
- element: /* @__PURE__ */ e.jsx(L, { service: i })
270
+ element: /* @__PURE__ */ e.jsx(F, { service: r })
278
271
  }
279
272
  ]
280
273
  }
@@ -282,6 +275,6 @@ const L = ({ service: t }) => {
282
275
  };
283
276
  };
284
277
  export {
285
- se as apiKeyPlugin
278
+ re as apiKeyPlugin
286
279
  };
287
280
  //# sourceMappingURL=zudoku.plugin-api-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-api-keys.js","sources":["../src/lib/util/invariant.ts","../src/lib/plugins/api-keys/CreateApiKey.tsx","../src/lib/plugins/api-keys/ProtectedRoute.tsx","../src/lib/plugins/api-keys/SettingsApiKeys.tsx","../src/lib/plugins/api-keys/index.tsx"],"sourcesContent":["export default function invariant(\n condition: any,\n // Not providing an inline default argument for message as the result is smaller\n /**\n * Can provide a string, or a function that returns a string for cases where\n * the message takes a fair amount of effort to compute\n */\n message?: string | (() => string),\n): asserts condition {\n if (condition) {\n return;\n }\n // Condition not passed\n\n const provided: string | undefined =\n typeof message === \"function\" ? message() : message;\n\n throw new ZudokuError(provided ?? \"Invariant failed\");\n}\n\nclass ZudokuError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ZudokuError\";\n }\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/Select.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { Input } from \"../../ui/Input.js\";\nimport { ApiKeyService } from \"./index.js\";\n\ntype CreateApiKey = { description: string; expiresOn?: string };\n\nexport const CreateApiKey = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const navigate = useNavigate();\n const form = useForm<CreateApiKey>({\n defaultValues: {\n expiresOn: \"30\",\n },\n });\n const createKeyMutation = useMutation({\n mutationFn: ({ description, expiresOn }: CreateApiKey) => {\n if (!service.createKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n const expiresOnDate =\n expiresOn !== \"never\" ? addDaysToDate(Number(expiresOn)) : undefined;\n\n return service.createKey(\n { description: description, expiresOn: expiresOnDate },\n context,\n );\n },\n onSuccess: () => navigate(\"/settings/api-keys/\"),\n });\n\n if (!service.createKey) {\n return null;\n }\n\n return (\n <div className=\"max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b pb-1\">\n <h1 className=\"font-medium text-2xl\">New API Key</h1>\n </div>\n <form\n onSubmit={form.handleSubmit((data) => createKeyMutation.mutate(data))}\n >\n <div className=\"flex gap-2 flex-col\">\n Note\n <Input {...form.register(\"description\")} />\n Expiration\n <Select\n onValueChange={(value) => form.setValue(\"expiresOn\", value)}\n defaultValue={form.getValues(\"expiresOn\")}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {[7, 30, 60, 90].map((option) => (\n <SelectItem value={String(option)} key={option}>\n {option} days\n </SelectItem>\n ))}\n <SelectItem value=\"never\">Never</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button>Generate Key</Button>\n <Button variant=\"outline\" asChild>\n <Link to=\"/settings/api-keys/\">Cancel</Link>\n </Button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nconst addDaysToDate = (days: number): string => {\n const date = new Date();\n date.setDate(date.getDate() + days);\n return date.toISOString();\n};\n","import { Outlet } from \"react-router-dom\";\nimport { useAuth } from \"../../authentication/hook.js\";\nimport { DeveloperHint } from \"../../components/DeveloperHint.js\";\nimport { Button } from \"../../ui/Button.js\";\n\nexport const ProtectedRoute = () => {\n const auth = useAuth();\n\n // TODO: should we suspend here somehow?\n if (auth.isAuthEnabled && auth.isPending) {\n return null;\n }\n\n return auth.isAuthenticated ? (\n <Outlet />\n ) : !auth.isAuthEnabled ? (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n <DeveloperHint className=\"max-w-[600px]\">\n Authentication needs to be enabled for API keys to work. Enable it in\n your Zudoku configuration under <code>authentication</code>.\n </DeveloperHint>\n </div>\n ) : (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n Please login first to view this page\n <Button onClick={() => auth.login()}>Login</Button>\n </div>\n );\n};\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport {\n CheckIcon,\n CopyIcon,\n EyeIcon,\n EyeOffIcon,\n RotateCwIcon,\n TrashIcon,\n} from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { Slotlet } from \"../../components/SlotletProvider.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { ApiKeyService } from \"./index.js\";\n\nexport const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery({\n queryFn: () => service.getKeys(context),\n queryKey: [\"api-keys\"],\n retry: false,\n });\n\n const deleteKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.deleteKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n return service.deleteKey(id, context);\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [\"api-keys\"] });\n },\n });\n\n const rollKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.rollKey) {\n throw new Error(\"rollKey not implemented\");\n }\n\n return service.rollKey(id, context);\n },\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"api-keys\"] }),\n });\n\n return (\n <div className=\"max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <Slotlet name=\"api-keys-list-page\" />\n\n <div className=\"flex justify-between mb-4 border-b pb-3\">\n <h1 className=\"font-medium text-2xl\">API Keys</h1>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n\n <Slotlet name=\"api-keys-list-page-before-keys\" />\n\n {data.length === 0 ? (\n <div className=\"flex flex-col justify-center gap-4 items-center p-8 border rounded bg-muted/30 text-muted-foreground\">\n <p className=\"text-center\">\n No API keys created yet.\n <br />\n Get started and create your first key.\n </p>\n {service.createKey && (\n <Button asChild variant=\"outline\">\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n ) : (\n <ul\n className={cn(\n \"grid grid-cols-1 rounded border divide-y divide-border\",\n \"lg:grid-cols-[minmax(250px,min-content)_1fr_min-content]\",\n )}\n >\n {data.map((key) => (\n <li\n className=\"p-5 grid grid-cols-subgrid col-span-full gap-2 items-center\"\n key={key.id}\n >\n <div className=\"flex flex-col gap-1 text-sm\">\n {key.description ?? key.id}\n <div className=\"text-muted-foreground text-xs\">\n {key.createdOn && (\n <div>\n Created on {new Date(key.createdOn).toLocaleDateString()}\n </div>\n )}\n {key.expiresOn && (\n <div>\n Expires on {new Date(key.expiresOn).toLocaleDateString()}\n </div>\n )}\n </div>\n </div>\n <div className=\"items-center flex lg:justify-center\">\n <RevealApiKey apiKey={key.key} />\n </div>\n <div className=\"flex gap-2\">\n {service.rollKey && (\n <Button\n size=\"icon\"\n title=\"Roll this key\"\n variant=\"ghost\"\n onClick={() => {\n if (!confirm(\"Do you want to roll this key?\")) {\n return;\n }\n\n rollKeyMutation.mutate(key.id);\n }}\n >\n <RotateCwIcon size={16} />\n </Button>\n )}\n {service.deleteKey && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (!confirm(\"Do you want to delete this key?\")) {\n return;\n }\n\n deleteKeyMutation.mutate(key.id);\n }}\n disabled={deleteKeyMutation.isPending}\n >\n <TrashIcon size={16} />\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nconst RevealApiKey = ({ apiKey }: { apiKey: string }) => {\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n\n return (\n <div className=\"flex gap-2 items-center text-sm\">\n <div className=\"border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono truncate h-9 items-center flex px-2\">\n {revealed ? apiKey : \"•\".repeat(apiKey.length)}\n </div>\n <Button\n variant=\"outline\"\n onClick={() => setRevealed((prev) => !prev)}\n size=\"icon\"\n >\n {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n void navigator.clipboard.writeText(apiKey).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }}\n size=\"icon\"\n >\n {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}\n </Button>\n </div>\n );\n};\n","import { type RouteObject } from \"react-router-dom\";\nimport { DevPortalContext } from \"../../core/DevPortalContext.js\";\nimport {\n type ApiIdentityPlugin,\n type DevPortalPlugin,\n ProfileMenuPlugin,\n} from \"../../core/plugins.js\";\nimport { RouterError } from \"../../errors/RouterError.js\";\nimport invariant from \"../../util/invariant.js\";\nimport { CreateApiKey } from \"./CreateApiKey.js\";\nimport { ProtectedRoute } from \"./ProtectedRoute.js\";\nimport { SettingsApiKeys } from \"./SettingsApiKeys.js\";\n\nconst DEFAULT_API_KEY_ENDPOINT =\n \"https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev\";\n\nexport type ApiKeyService = {\n getKeys: (context: DevPortalContext) => Promise<ApiKey[]>;\n rollKey?: (id: string, context: DevPortalContext) => Promise<void>;\n deleteKey?: (id: string, context: DevPortalContext) => Promise<void>;\n updateKeyDescription?: (\n apiKey: { id: string; description: string },\n context: DevPortalContext,\n ) => Promise<void>;\n getUsage?: (apiKeys: string[], context: DevPortalContext) => Promise<void>;\n createKey?: (\n apiKey: { description: string; expiresOn?: string },\n context: DevPortalContext,\n ) => Promise<void>;\n};\n\nexport type GetApiKeysOptions = ApiKeyService | { endpoint: string } | object;\n\nexport type ApiKeyPluginOptions = object & GetApiKeysOptions;\n\nexport interface ApiKey {\n id: string;\n description?: string;\n createdOn?: string;\n updatedOn?: string;\n expiresOn?: string;\n key: string;\n}\n\nconst createDefaultHandler = (endpoint: string): ApiKeyService => {\n return {\n deleteKey: async (id, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys/${id}`, {\n method: \"DELETE\",\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to delete API key\");\n },\n rollKey: async (id, context) => {\n const response = await fetch(\n await context.signRequest(\n new Request(endpoint + `/v1/developer/api-keys/${id}/key`, {\n method: \"DELETE\",\n }),\n ),\n );\n invariant(response.ok, \"Failed to delete API key\");\n },\n createKey: async (apiKey, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(apiKey),\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to create API key\");\n },\n getKeys: async (context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`);\n\n await context.signRequest(request);\n\n const keys = await fetch(request);\n invariant(keys.ok, \"Failed to fetch API keys\");\n\n return await keys.json();\n },\n };\n};\n\nexport const apiKeyPlugin = (\n options: ApiKeyPluginOptions,\n): DevPortalPlugin & ApiIdentityPlugin & ProfileMenuPlugin => {\n const endpoint =\n \"endpoint\" in options ? options.endpoint : DEFAULT_API_KEY_ENDPOINT;\n\n const service =\n \"getKeys\" in options ? options : createDefaultHandler(endpoint);\n\n return {\n getProfileMenuItems: () => [\n {\n label: \"API Keys\",\n path: \"/settings/api-keys\",\n },\n ],\n getIdentities: async (context) => {\n try {\n const keys = await service.getKeys(context);\n\n return keys.map((key) => ({\n authorizeRequest: (request) => {\n request.headers.set(\"Authorization\", `Bearer ${key.key}`);\n return request;\n },\n id: key.id,\n label: key.description ?? key.id,\n }));\n } catch {\n return [];\n }\n },\n getRoutes: (): RouteObject[] => {\n // TODO: Make lazy\n return [\n {\n element: <ProtectedRoute />,\n errorElement: <RouterError />,\n children: [\n {\n path: \"/settings/api-keys\",\n element: <SettingsApiKeys service={service} />,\n },\n {\n path: \"/settings/api-keys/new\",\n element: <CreateApiKey service={service} />,\n },\n ],\n },\n ];\n },\n };\n};\n"],"names":["invariant","condition","message","provided","ZudokuError","CreateApiKey","service","context","useZudoku","navigate","useNavigate","form","useForm","createKeyMutation","useMutation","description","expiresOn","expiresOnDate","addDaysToDate","jsxs","jsx","data","Input","Select","value","SelectTrigger","SelectValue","SelectContent","SelectGroup","option","SelectItem","Button","Link","days","date","ProtectedRoute","auth","useAuth","Outlet","DeveloperHint","SettingsApiKeys","queryClient","useQueryClient","useSuspenseQuery","deleteKeyMutation","id","rollKeyMutation","Slotlet","cn","key","RevealApiKey","RotateCwIcon","TrashIcon","apiKey","revealed","setRevealed","useState","copied","setCopied","prev","EyeOffIcon","EyeIcon","CheckIcon","CopyIcon","DEFAULT_API_KEY_ENDPOINT","createDefaultHandler","endpoint","request","response","keys","apiKeyPlugin","options","RouterError"],"mappings":"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"}
1
+ {"version":3,"file":"zudoku.plugin-api-keys.js","sources":["../src/lib/plugins/api-keys/CreateApiKey.tsx","../src/lib/plugins/api-keys/ProtectedRoute.tsx","../src/lib/plugins/api-keys/SettingsApiKeys.tsx","../src/lib/plugins/api-keys/index.tsx"],"sourcesContent":["import { useMutation } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"zudoku/ui/Select.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { Input } from \"../../ui/Input.js\";\nimport { ApiKeyService } from \"./index.js\";\n\ntype CreateApiKey = { description: string; expiresOn?: string };\n\nexport const CreateApiKey = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const navigate = useNavigate();\n const form = useForm<CreateApiKey>({\n defaultValues: {\n expiresOn: \"30\",\n },\n });\n const createKeyMutation = useMutation({\n mutationFn: ({ description, expiresOn }: CreateApiKey) => {\n if (!service.createKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n const expiresOnDate =\n expiresOn !== \"never\" ? addDaysToDate(Number(expiresOn)) : undefined;\n\n return service.createKey(\n { description: description, expiresOn: expiresOnDate },\n context,\n );\n },\n onSuccess: () => navigate(\"/settings/api-keys/\"),\n });\n\n if (!service.createKey) {\n return null;\n }\n\n return (\n <div className=\"max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b pb-1\">\n <h1 className=\"font-medium text-2xl\">New API Key</h1>\n </div>\n <form\n onSubmit={form.handleSubmit((data) => createKeyMutation.mutate(data))}\n >\n <div className=\"flex gap-2 flex-col\">\n Note\n <Input {...form.register(\"description\")} />\n Expiration\n <Select\n onValueChange={(value) => form.setValue(\"expiresOn\", value)}\n defaultValue={form.getValues(\"expiresOn\")}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {[7, 30, 60, 90].map((option) => (\n <SelectItem value={String(option)} key={option}>\n {option} days\n </SelectItem>\n ))}\n <SelectItem value=\"never\">Never</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button>Generate Key</Button>\n <Button variant=\"outline\" asChild>\n <Link to=\"/settings/api-keys/\">Cancel</Link>\n </Button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nconst addDaysToDate = (days: number): string => {\n const date = new Date();\n date.setDate(date.getDate() + days);\n return date.toISOString();\n};\n","import { Outlet } from \"react-router-dom\";\nimport { useAuth } from \"../../authentication/hook.js\";\nimport { DeveloperHint } from \"../../components/DeveloperHint.js\";\nimport { Button } from \"../../ui/Button.js\";\n\nexport const ProtectedRoute = () => {\n const auth = useAuth();\n\n // TODO: should we suspend here somehow?\n if (auth.isAuthEnabled && auth.isPending) {\n return null;\n }\n\n return auth.isAuthenticated ? (\n <Outlet />\n ) : !auth.isAuthEnabled ? (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n <DeveloperHint className=\"max-w-[600px]\">\n Authentication needs to be enabled for API keys to work. Enable it in\n your Zudoku configuration under <code>authentication</code>.\n </DeveloperHint>\n </div>\n ) : (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2\">\n Please login first to view this page\n <Button onClick={() => auth.login()}>Login</Button>\n </div>\n );\n};\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport {\n CheckIcon,\n CopyIcon,\n EyeIcon,\n EyeOffIcon,\n RotateCwIcon,\n TrashIcon,\n} from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { Slotlet } from \"../../components/SlotletProvider.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { ApiKeyService } from \"./index.js\";\n\nexport const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {\n const context = useZudoku();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery({\n queryFn: () => service.getKeys(context),\n queryKey: [\"api-keys\"],\n retry: false,\n });\n\n const deleteKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.deleteKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n return service.deleteKey(id, context);\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [\"api-keys\"] });\n },\n });\n\n const rollKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.rollKey) {\n throw new Error(\"rollKey not implemented\");\n }\n\n return service.rollKey(id, context);\n },\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"api-keys\"] }),\n });\n\n return (\n <div className=\"max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <Slotlet name=\"api-keys-list-page\" />\n\n <div className=\"flex justify-between mb-4 border-b pb-3\">\n <h1 className=\"font-medium text-2xl\">API Keys</h1>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n\n <Slotlet name=\"api-keys-list-page-before-keys\" />\n\n {data.length === 0 ? (\n <div className=\"flex flex-col justify-center gap-4 items-center p-8 border rounded bg-muted/30 text-muted-foreground\">\n <p className=\"text-center\">\n No API keys created yet.\n <br />\n Get started and create your first key.\n </p>\n {service.createKey && (\n <Button asChild variant=\"outline\">\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n ) : (\n <ul\n className={cn(\n \"grid grid-cols-1 rounded border divide-y divide-border\",\n \"lg:grid-cols-[minmax(250px,min-content)_1fr_min-content]\",\n )}\n >\n {data.map((key) => (\n <li\n className=\"p-5 grid grid-cols-subgrid col-span-full gap-2 items-center\"\n key={key.id}\n >\n <div className=\"flex flex-col gap-1 text-sm\">\n {key.description ?? key.id}\n <div className=\"text-muted-foreground text-xs\">\n {key.createdOn && (\n <div>\n Created on {new Date(key.createdOn).toLocaleDateString()}\n </div>\n )}\n {key.expiresOn && (\n <div>\n Expires on {new Date(key.expiresOn).toLocaleDateString()}\n </div>\n )}\n </div>\n </div>\n <div className=\"items-center flex lg:justify-center\">\n <RevealApiKey apiKey={key.key} />\n </div>\n <div className=\"flex gap-2\">\n {service.rollKey && (\n <Button\n size=\"icon\"\n title=\"Roll this key\"\n variant=\"ghost\"\n onClick={() => {\n if (!confirm(\"Do you want to roll this key?\")) {\n return;\n }\n\n rollKeyMutation.mutate(key.id);\n }}\n >\n <RotateCwIcon size={16} />\n </Button>\n )}\n {service.deleteKey && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (!confirm(\"Do you want to delete this key?\")) {\n return;\n }\n\n deleteKeyMutation.mutate(key.id);\n }}\n disabled={deleteKeyMutation.isPending}\n >\n <TrashIcon size={16} />\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nconst RevealApiKey = ({ apiKey }: { apiKey: string }) => {\n const [revealed, setRevealed] = useState(false);\n const [copied, setCopied] = useState(false);\n\n return (\n <div className=\"flex gap-2 items-center text-sm\">\n <div className=\"border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono truncate h-9 items-center flex px-2\">\n {revealed ? apiKey : \"•\".repeat(apiKey.length)}\n </div>\n <Button\n variant=\"outline\"\n onClick={() => setRevealed((prev) => !prev)}\n size=\"icon\"\n >\n {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n void navigator.clipboard.writeText(apiKey).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n }}\n size=\"icon\"\n >\n {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}\n </Button>\n </div>\n );\n};\n","import { type RouteObject } from \"react-router-dom\";\nimport { DevPortalContext } from \"../../core/DevPortalContext.js\";\nimport {\n type ApiIdentityPlugin,\n type DevPortalPlugin,\n ProfileMenuPlugin,\n} from \"../../core/plugins.js\";\nimport { RouterError } from \"../../errors/RouterError.js\";\nimport invariant from \"../../util/invariant.js\";\nimport { CreateApiKey } from \"./CreateApiKey.js\";\nimport { ProtectedRoute } from \"./ProtectedRoute.js\";\nimport { SettingsApiKeys } from \"./SettingsApiKeys.js\";\n\nconst DEFAULT_API_KEY_ENDPOINT =\n \"https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev\";\n\nexport type ApiKeyService = {\n getKeys: (context: DevPortalContext) => Promise<ApiKey[]>;\n rollKey?: (id: string, context: DevPortalContext) => Promise<void>;\n deleteKey?: (id: string, context: DevPortalContext) => Promise<void>;\n updateKeyDescription?: (\n apiKey: { id: string; description: string },\n context: DevPortalContext,\n ) => Promise<void>;\n getUsage?: (apiKeys: string[], context: DevPortalContext) => Promise<void>;\n createKey?: (\n apiKey: { description: string; expiresOn?: string },\n context: DevPortalContext,\n ) => Promise<void>;\n};\n\nexport type GetApiKeysOptions = ApiKeyService | { endpoint: string } | object;\n\nexport type ApiKeyPluginOptions = object & GetApiKeysOptions;\n\nexport interface ApiKey {\n id: string;\n description?: string;\n createdOn?: string;\n updatedOn?: string;\n expiresOn?: string;\n key: string;\n}\n\nconst createDefaultHandler = (endpoint: string): ApiKeyService => {\n return {\n deleteKey: async (id, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys/${id}`, {\n method: \"DELETE\",\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to delete API key\");\n },\n rollKey: async (id, context) => {\n const response = await fetch(\n await context.signRequest(\n new Request(endpoint + `/v1/developer/api-keys/${id}/key`, {\n method: \"DELETE\",\n }),\n ),\n );\n invariant(response.ok, \"Failed to delete API key\");\n },\n createKey: async (apiKey, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(apiKey),\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to create API key\");\n },\n getKeys: async (context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`);\n\n await context.signRequest(request);\n\n const keys = await fetch(request);\n invariant(keys.ok, \"Failed to fetch API keys\");\n\n return await keys.json();\n },\n };\n};\n\nexport const apiKeyPlugin = (\n options: ApiKeyPluginOptions,\n): DevPortalPlugin & ApiIdentityPlugin & ProfileMenuPlugin => {\n const endpoint =\n \"endpoint\" in options ? options.endpoint : DEFAULT_API_KEY_ENDPOINT;\n\n const service =\n \"getKeys\" in options ? options : createDefaultHandler(endpoint);\n\n return {\n getProfileMenuItems: () => [\n {\n label: \"API Keys\",\n path: \"/settings/api-keys\",\n },\n ],\n getIdentities: async (context) => {\n try {\n const keys = await service.getKeys(context);\n\n return keys.map((key) => ({\n authorizeRequest: (request) => {\n request.headers.set(\"Authorization\", `Bearer ${key.key}`);\n return request;\n },\n id: key.id,\n label: key.description ?? key.id,\n }));\n } catch {\n return [];\n }\n },\n getRoutes: (): RouteObject[] => {\n // TODO: Make lazy\n return [\n {\n element: <ProtectedRoute />,\n errorElement: <RouterError />,\n children: [\n {\n path: \"/settings/api-keys\",\n element: <SettingsApiKeys service={service} />,\n },\n {\n path: \"/settings/api-keys/new\",\n element: <CreateApiKey service={service} />,\n },\n ],\n },\n ];\n },\n };\n};\n"],"names":["CreateApiKey","service","context","useZudoku","navigate","useNavigate","form","useForm","createKeyMutation","useMutation","description","expiresOn","expiresOnDate","addDaysToDate","jsxs","jsx","data","Input","Select","value","SelectTrigger","SelectValue","SelectContent","SelectGroup","option","SelectItem","Button","Link","days","date","ProtectedRoute","auth","useAuth","Outlet","DeveloperHint","SettingsApiKeys","queryClient","useQueryClient","useSuspenseQuery","deleteKeyMutation","id","rollKeyMutation","Slotlet","cn","key","RevealApiKey","RotateCwIcon","TrashIcon","apiKey","revealed","setRevealed","useState","copied","setCopied","prev","EyeOffIcon","EyeIcon","CheckIcon","CopyIcon","DEFAULT_API_KEY_ENDPOINT","createDefaultHandler","endpoint","request","response","invariant","keys","apiKeyPlugin","options","RouterError"],"mappings":"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"}
@@ -1,21 +1,22 @@
1
- import { j as o } from "./jsx-runtime-B6kdoens.js";
1
+ import { j as e } from "./jsx-runtime-B6kdoens.js";
2
2
  import a from "react";
3
- import { a as n, P as u } from "./Markdown-Y__eLG0x.js";
4
- import { u as c } from "./useExposedProps-BWwxa-Hg.js";
3
+ import { P as n } from "./Markdown-1BO9EA_X.js";
4
+ import { c } from "./cn-BmFQLtkS.js";
5
+ import { u } from "./useExposedProps-B9K-9GTc.js";
5
6
  const l = ({
6
- element: t,
7
- render: s,
8
- prose: e = !0
7
+ element: s,
8
+ render: t,
9
+ prose: o = !0
9
10
  }) => {
10
- const r = c(), m = s ? a.createElement(s, r) : t;
11
- return /* @__PURE__ */ o.jsx("div", { className: n(e && u, "max-w-full"), children: m });
12
- }, f = (t) => ({
13
- getRoutes: () => t.map(({ path: s, ...e }) => ({
14
- path: s,
15
- element: /* @__PURE__ */ o.jsx(l, { ...e })
11
+ const r = u(), m = t ? a.createElement(t, r) : s;
12
+ return /* @__PURE__ */ e.jsx("div", { className: c(o && n, "max-w-full"), children: m });
13
+ }, g = (s) => ({
14
+ getRoutes: () => s.map(({ path: t, ...o }) => ({
15
+ path: t,
16
+ element: /* @__PURE__ */ e.jsx(l, { ...o })
16
17
  }))
17
18
  });
18
19
  export {
19
- f as customPagesPlugin
20
+ g as customPagesPlugin
20
21
  };
21
22
  //# sourceMappingURL=zudoku.plugin-custom-pages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-custom-pages.js","sources":["../src/lib/plugins/custom-pages/CustomPage.tsx","../src/lib/plugins/custom-pages/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { ProseClasses } from \"../../components/Markdown.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { useExposedProps } from \"../../util/useExposedProps.js\";\nimport type { CustomPageConfig } from \"./index.js\";\n\nexport const CustomPage = ({\n element,\n render,\n prose = true,\n}: Omit<CustomPageConfig, \"path\">) => {\n const slotletProps = useExposedProps();\n const content = render ? React.createElement(render, slotletProps) : element;\n\n return (\n <div className={cn(prose && ProseClasses, \"max-w-full\")}>{content}</div>\n );\n};\n","import { type ComponentType, type ReactNode } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\nimport { type ExposedComponentProps } from \"../../components/SlotletProvider.js\";\nimport type { DevPortalPlugin, NavigationPlugin } from \"../../core/plugins.js\";\nimport { CustomPage } from \"./CustomPage.js\";\n\nexport type CustomPageConfig = {\n path: string;\n prose?: boolean;\n element?: ReactNode;\n render?: ComponentType<ExposedComponentProps>;\n};\n\nexport const customPagesPlugin = (\n config: CustomPageConfig[],\n): DevPortalPlugin & NavigationPlugin => {\n return {\n getRoutes: (): RouteObject[] =>\n config.map(({ path, ...props }) => ({\n path,\n element: <CustomPage {...props} />,\n })),\n };\n};\n"],"names":["CustomPage","element","render","prose","slotletProps","useExposedProps","content","React","jsx","cn","ProseClasses","customPagesPlugin","config","path","props"],"mappings":";;;;AAMO,MAAMA,IAAa,CAAC;AAAA,EACzB,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,MAAsC;AACpC,QAAMC,IAAeC,KACfC,IAAUJ,IAASK,EAAM,cAAcL,GAAQE,CAAY,IAAIH;AAGnE,SAAAO,gBAAAA,MAAC,SAAI,WAAWC,EAAGN,KAASO,GAAc,YAAY,GAAI,UAAQJ,EAAA,CAAA;AAEtE,GCJaK,IAAoB,CAC/BC,OAEO;AAAA,EACL,WAAW,MACTA,EAAO,IAAI,CAAC,EAAE,MAAAC,GAAM,GAAGC,SAAa;AAAA,IAClC,MAAAD;AAAA,IACA,SAASL,gBAAAA,EAAAA,IAACR,GAAY,EAAA,GAAGc,EAAO,CAAA;AAAA,EAAA,EAChC;AAAA;"}
1
+ {"version":3,"file":"zudoku.plugin-custom-pages.js","sources":["../src/lib/plugins/custom-pages/CustomPage.tsx","../src/lib/plugins/custom-pages/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { ProseClasses } from \"../../components/Markdown.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { useExposedProps } from \"../../util/useExposedProps.js\";\nimport type { CustomPageConfig } from \"./index.js\";\n\nexport const CustomPage = ({\n element,\n render,\n prose = true,\n}: Omit<CustomPageConfig, \"path\">) => {\n const slotletProps = useExposedProps();\n const content = render ? React.createElement(render, slotletProps) : element;\n\n return (\n <div className={cn(prose && ProseClasses, \"max-w-full\")}>{content}</div>\n );\n};\n","import { type ComponentType, type ReactNode } from \"react\";\nimport type { RouteObject } from \"react-router-dom\";\nimport { type ExposedComponentProps } from \"../../components/SlotletProvider.js\";\nimport type { DevPortalPlugin, NavigationPlugin } from \"../../core/plugins.js\";\nimport { CustomPage } from \"./CustomPage.js\";\n\nexport type CustomPageConfig = {\n path: string;\n prose?: boolean;\n element?: ReactNode;\n render?: ComponentType<ExposedComponentProps>;\n};\n\nexport const customPagesPlugin = (\n config: CustomPageConfig[],\n): DevPortalPlugin & NavigationPlugin => {\n return {\n getRoutes: (): RouteObject[] =>\n config.map(({ path, ...props }) => ({\n path,\n element: <CustomPage {...props} />,\n })),\n };\n};\n"],"names":["CustomPage","element","render","prose","slotletProps","useExposedProps","content","React","jsx","cn","ProseClasses","customPagesPlugin","config","path","props"],"mappings":";;;;;AAMO,MAAMA,IAAa,CAAC;AAAA,EACzB,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,MAAsC;AACpC,QAAMC,IAAeC,KACfC,IAAUJ,IAASK,EAAM,cAAcL,GAAQE,CAAY,IAAIH;AAGnE,SAAAO,gBAAAA,MAAC,SAAI,WAAWC,EAAGN,KAASO,GAAc,YAAY,GAAI,UAAQJ,EAAA,CAAA;AAEtE,GCJaK,IAAoB,CAC/BC,OAEO;AAAA,EACL,WAAW,MACTA,EAAO,IAAI,CAAC,EAAE,MAAAC,GAAM,GAAGC,SAAa;AAAA,IAClC,MAAAD;AAAA,IACA,SAASL,gBAAAA,EAAAA,IAACR,GAAY,EAAA,GAAGc,EAAO,CAAA;AAAA,EAAA,EAChC;AAAA;"}
@@ -6,7 +6,7 @@ const x = (t, e, n) => Object.entries(t).flatMap(([a, p]) => {
6
6
  return s ? {
7
7
  path: s,
8
8
  lazy: async () => {
9
- const { MdxPage: i } = await import("./MdxPage-B4FcPIi5.js"), { default: m, ...l } = await p();
9
+ const { MdxPage: i } = await import("./MdxPage-BEOcOICU.js"), { default: m, ...l } = await p();
10
10
  return {
11
11
  element: /* @__PURE__ */ u.jsx(
12
12
  i,
@@ -1,15 +1,15 @@
1
1
  import "./jsx-runtime-B6kdoens.js";
2
- import { o as u } from "./index-Dso_b0di.js";
3
- import "./ZudokuContext-MRoel6bS.js";
2
+ import { o as u } from "./index-Cj-F-4ME.js";
3
+ import "./ZudokuContext-D1D8Anlj.js";
4
4
  import "lucide-react";
5
5
  import "zudoku/openapi-worker";
6
- import "./index-Ch8VO_uX.js";
7
- import "./ErrorPage-DqqAV1dr.js";
8
- import "./Markdown-Y__eLG0x.js";
6
+ import "./hook-JSRuxV1P.js";
7
+ import "./Markdown-1BO9EA_X.js";
8
+ import "./ui/Button.js";
9
9
  import "./joinPath-B7kNnUX4.js";
10
10
  import "./urql-core-KJnLL26g.js";
11
11
  import "./router-BsfSoK2j.js";
12
- import "./index-DFN92YJN.js";
12
+ import "./index-CRo94sKK.js";
13
13
  export {
14
14
  u as openApiPlugin
15
15
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.13.5",
3
+ "version": "0.13.7",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -27,12 +27,17 @@
27
27
  "import": "./dist/index.js",
28
28
  "types": "./dist/index.d.ts"
29
29
  },
30
+ "./ui/*": {
31
+ "import": "./lib/ui/*.js",
32
+ "types": "./dist/lib/ui/*.d.ts"
33
+ },
34
+ "./ui/*.js": {
35
+ "import": "./lib/ui/*.js",
36
+ "types": "./dist/lib/ui/*.d.ts"
37
+ },
30
38
  "./client": {
31
39
  "types": "./client.d.ts"
32
40
  },
33
- "./internal": {
34
- "import": "./dist/internal.js"
35
- },
36
41
  "./auth/clerk": {
37
42
  "import": "./lib/zudoku.auth-clerk.js",
38
43
  "types": "./dist/lib/authentication/providers/clerk.d.ts"
@@ -101,16 +106,32 @@
101
106
  "@envelop/core": "5.0.2",
102
107
  "@graphql-typed-document-node/core": "3.2.0",
103
108
  "@hiogawa/vite-plugin-ssr-css": "0.0.1",
109
+ "@hookform/resolvers": "3.9.1",
104
110
  "@lekoarts/rehype-meta-as-attributes": "3.0.1",
105
111
  "@mdx-js/react": "3.0.1",
106
112
  "@mdx-js/rollup": "3.0.1",
107
113
  "@pothos/core": "3.41.0",
114
+ "@radix-ui/react-accordion": "1.2.1",
115
+ "@radix-ui/react-alert-dialog": "1.1.2",
116
+ "@radix-ui/react-aspect-ratio": "1.1.0",
117
+ "@radix-ui/react-checkbox": "1.1.2",
108
118
  "@radix-ui/react-collapsible": "1.1.1",
109
119
  "@radix-ui/react-dialog": "1.1.2",
110
120
  "@radix-ui/react-dropdown-menu": "2.1.2",
121
+ "@radix-ui/react-hover-card": "1.1.2",
122
+ "@radix-ui/react-label": "2.1.0",
123
+ "@radix-ui/react-popover": "1.1.2",
124
+ "@radix-ui/react-progress": "1.1.0",
125
+ "@radix-ui/react-radio-group": "1.2.1",
126
+ "@radix-ui/react-scroll-area": "1.2.0",
111
127
  "@radix-ui/react-select": "2.1.2",
128
+ "@radix-ui/react-slider": "1.2.1",
112
129
  "@radix-ui/react-slot": "1.1.0",
130
+ "@radix-ui/react-switch": "1.1.1",
113
131
  "@radix-ui/react-tabs": "1.1.1",
132
+ "@radix-ui/react-toggle": "1.1.0",
133
+ "@radix-ui/react-toggle-group": "1.1.0",
134
+ "@radix-ui/react-tooltip": "1.1.3",
114
135
  "@radix-ui/react-visually-hidden": "1",
115
136
  "@sentry/node": "8.34.0",
116
137
  "@sindresorhus/slugify": "2.2.1",
@@ -127,6 +148,7 @@
127
148
  "class-variance-authority": "0.7.0",
128
149
  "clsx": "2.1.1",
129
150
  "dotenv": "16.4.5",
151
+ "embla-carousel-react": "8.3.1",
130
152
  "express": "4.21.1",
131
153
  "glob": "11.0.0",
132
154
  "graphql": "16.9.0",
@@ -186,9 +208,9 @@
186
208
  "@types/react-is": "18.3.0",
187
209
  "@types/semver": "7.5.8",
188
210
  "@types/yargs": "17.0.33",
189
- "rollup-plugin-visualizer": "5.12.0",
190
211
  "react": "18.3.1",
191
212
  "react-dom": "18.3.1",
213
+ "rollup-plugin-visualizer": "5.12.0",
192
214
  "typescript": "5.6.3"
193
215
  },
194
216
  "peerDependencies": {
@@ -201,7 +223,7 @@
201
223
  },
202
224
  "scripts": {
203
225
  "build": "tsc --project tsconfig.json",
204
- "build:vite": "vite build && pnpm run hack:fix-worker-paths lib",
226
+ "build:vite": "vite build",
205
227
  "build:standalone:vite": "vite build --mode standalone --config vite.standalone.config.ts",
206
228
  "build:standalone:html": "cp ./src/app/standalone.html ./standalone/standalone.html && cp ./src/app/demo.html ./standalone/demo.html && cp ./src/app/demo-cdn.html ./standalone/index.html",
207
229
  "hack:fix-worker-paths": "node ./scripts/hack-worker.mjs",