zudoku 0.53.4 → 0.53.5

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 (230) hide show
  1. package/dist/config/validators/InputNavigationSchema.d.ts +0 -5
  2. package/dist/config/validators/InputNavigationSchema.js +0 -3
  3. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  4. package/dist/config/validators/InputNavigationSchema.test-d.js +0 -1
  5. package/dist/config/validators/InputNavigationSchema.test-d.js.map +1 -1
  6. package/dist/config/validators/NavigationSchema.js +3 -2
  7. package/dist/config/validators/NavigationSchema.js.map +1 -1
  8. package/dist/config/validators/validate.d.ts +3 -0
  9. package/dist/config/validators/validate.js +1 -0
  10. package/dist/config/validators/validate.js.map +1 -1
  11. package/dist/lib/components/Header.js +1 -1
  12. package/dist/lib/components/Header.js.map +1 -1
  13. package/dist/lib/components/Markdown.js +2 -2
  14. package/dist/lib/components/Markdown.js.map +1 -1
  15. package/dist/lib/components/NotFoundPage.js +1 -1
  16. package/dist/lib/components/NotFoundPage.js.map +1 -1
  17. package/dist/lib/components/Typography.d.ts +1 -1
  18. package/dist/lib/components/Typography.js +1 -1
  19. package/dist/lib/components/Typography.js.map +1 -1
  20. package/dist/lib/core/ZudokuContext.d.ts +1 -0
  21. package/dist/lib/core/ZudokuContext.js.map +1 -1
  22. package/dist/lib/errors/ErrorAlert.js +1 -1
  23. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  24. package/dist/lib/plugins/openapi/Sidecar.js +1 -1
  25. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  26. package/dist/lib/plugins/openapi/SidecarExamples.js +1 -1
  27. package/dist/lib/plugins/openapi/SidecarExamples.js.map +1 -1
  28. package/dist/lib/plugins/openapi/playground/PathParams.js +1 -1
  29. package/dist/lib/plugins/openapi/playground/PathParams.js.map +1 -1
  30. package/dist/lib/plugins/openapi/playground/Playground.js +4 -2
  31. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  32. package/dist/lib/ui/CodeBlock.js +1 -1
  33. package/dist/lib/ui/CodeBlock.js.map +1 -1
  34. package/dist/lib/ui/EmbeddedCodeBlock.js +1 -1
  35. package/dist/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  36. package/dist/vite/dev-server.js +9 -1
  37. package/dist/vite/dev-server.js.map +1 -1
  38. package/dist/vite/plugin-docs.js +11 -9
  39. package/dist/vite/plugin-docs.js.map +1 -1
  40. package/dist/vite/plugin-theme.js +88 -49
  41. package/dist/vite/plugin-theme.js.map +1 -1
  42. package/dist/vite/plugin-theme.test.js +25 -4
  43. package/dist/vite/plugin-theme.test.js.map +1 -1
  44. package/lib/{Alert-SijAp9LN.js → Alert-CWApD0CL.js} +3 -3
  45. package/lib/{Alert-SijAp9LN.js.map → Alert-CWApD0CL.js.map} +1 -1
  46. package/lib/{Button-BE9IVkWV.js → Button-B3o-2Xdf.js} +2 -2
  47. package/lib/{Button-BE9IVkWV.js.map → Button-B3o-2Xdf.js.map} +1 -1
  48. package/lib/CallbackHandler-Dr5Lva9x.js +38 -0
  49. package/lib/CallbackHandler-Dr5Lva9x.js.map +1 -0
  50. package/lib/{Card-DPhGbYUM.js → Card-CMDQUPM4.js} +2 -2
  51. package/lib/{Card-DPhGbYUM.js.map → Card-CMDQUPM4.js.map} +1 -1
  52. package/lib/ClientOnly-E7hGysn1.js.map +1 -1
  53. package/lib/{CodeBlock-DAKxs_Tu.js → CodeBlock-B-G0eKtw.js} +3 -3
  54. package/lib/{CodeBlock-DAKxs_Tu.js.map → CodeBlock-B-G0eKtw.js.map} +1 -1
  55. package/lib/{Command-xsbs2uhf.js → Command-C9AC5cf-.js} +3 -3
  56. package/lib/{Command-xsbs2uhf.js.map → Command-C9AC5cf-.js.map} +1 -1
  57. package/lib/{Dialog-CiIdyz6a.js → Dialog-DMWw1doX.js} +2 -2
  58. package/lib/{Dialog-CiIdyz6a.js.map → Dialog-DMWw1doX.js.map} +1 -1
  59. package/lib/{Drawer-BzkOKwgC.js → Drawer-DJ05s2pH.js} +86 -86
  60. package/lib/{Drawer-BzkOKwgC.js.map → Drawer-DJ05s2pH.js.map} +1 -1
  61. package/lib/{MdxPage-BFKqQsmK.js → MdxPage-DVI4iYgW.js} +7 -7
  62. package/lib/{MdxPage-BFKqQsmK.js.map → MdxPage-DVI4iYgW.js.map} +1 -1
  63. package/lib/{OasProvider-Bdyvd6Ic.js → OasProvider-CbwsKPNc.js} +2 -2
  64. package/lib/{OasProvider-Bdyvd6Ic.js.map → OasProvider-CbwsKPNc.js.map} +1 -1
  65. package/lib/{OperationList-YZ7k-Rkt.js → OperationList-Bn9ggxw8.js} +12 -12
  66. package/lib/OperationList-Bn9ggxw8.js.map +1 -0
  67. package/lib/{Pagination-EViy7EHt.js → Pagination-bavPec-z.js} +3 -3
  68. package/lib/{Pagination-EViy7EHt.js.map → Pagination-bavPec-z.js.map} +1 -1
  69. package/lib/{RouteGuard-CX6A77iy.js → RouteGuard-Vnlz_t51.js} +2 -2
  70. package/lib/{RouteGuard-CX6A77iy.js.map → RouteGuard-Vnlz_t51.js.map} +1 -1
  71. package/lib/{SchemaList--_f8Azv0.js → SchemaList-DETyCVqu.js} +8 -8
  72. package/lib/{SchemaList--_f8Azv0.js.map → SchemaList-DETyCVqu.js.map} +1 -1
  73. package/lib/{SchemaView-7XWvSrbX.js → SchemaView-Dvxo2RNe.js} +6 -6
  74. package/lib/{SchemaView-7XWvSrbX.js.map → SchemaView-Dvxo2RNe.js.map} +1 -1
  75. package/lib/{SignUp-CXCezG-m.js → SignUp-ClYhZq9H.js} +3 -3
  76. package/lib/{SignUp-CXCezG-m.js.map → SignUp-ClYhZq9H.js.map} +1 -1
  77. package/lib/{Slot-tFjhrd8V.js → Slot-B31yZlfB.js} +316 -336
  78. package/lib/{Slot-tFjhrd8V.js.map → Slot-B31yZlfB.js.map} +1 -1
  79. package/lib/Spinner-mNLZ6awP.js.map +1 -1
  80. package/lib/{SyntaxHighlight-Bp_UsIXG.js → SyntaxHighlight-bm761HDo.js} +3 -3
  81. package/lib/{SyntaxHighlight-Bp_UsIXG.js.map → SyntaxHighlight-bm761HDo.js.map} +1 -1
  82. package/lib/{Toc-Ck0YQtmd.js → Toc-D4oBWE8D.js} +3 -3
  83. package/lib/{Toc-Ck0YQtmd.js.map → Toc-D4oBWE8D.js.map} +1 -1
  84. package/lib/chunk-DQRVZFIR-DHK7_Ilc.js.map +1 -1
  85. package/lib/{circular-BtKlhs07.js → circular-CRbFI6Zl.js} +2 -2
  86. package/lib/{circular-BtKlhs07.js.map → circular-CRbFI6Zl.js.map} +1 -1
  87. package/lib/{cn-wvCW-ho6.js → cn-dYga0KKN.js} +2 -2
  88. package/lib/cn-dYga0KKN.js.map +1 -0
  89. package/lib/{createServer-Di2U1Dg0.js → createServer-DNyGJJNX.js} +3398 -3552
  90. package/lib/createServer-DNyGJJNX.js.map +1 -0
  91. package/lib/errors-C1GlNcV3.js +44 -0
  92. package/lib/errors-C1GlNcV3.js.map +1 -0
  93. package/lib/hook-CZjW2buS.js.map +1 -1
  94. package/lib/index-Bm35Tkgf.js.map +1 -1
  95. package/lib/{index-CeQqiMIG.js → index-CZTEgYDd.js} +2 -2
  96. package/lib/{index-CeQqiMIG.js.map → index-CZTEgYDd.js.map} +1 -1
  97. package/lib/{index-BTqwnlI5.js → index-C_PXQ8Bx.js} +612 -610
  98. package/lib/{index-BTqwnlI5.js.map → index-C_PXQ8Bx.js.map} +1 -1
  99. package/lib/index-CrcNWbel.js.map +1 -1
  100. package/lib/{index-DKCEJ4Kd.js → index-D09PbNex.js} +911 -911
  101. package/lib/index-D09PbNex.js.map +1 -0
  102. package/lib/index-DI5SPFK9.js.map +1 -1
  103. package/lib/index-DmNq2fbN.js.map +1 -1
  104. package/lib/index.esm-Cp4wkyud.js.map +1 -1
  105. package/lib/invariant-DAFpPywt.js.map +1 -1
  106. package/lib/jsx-runtime-C5mzlN2N.js.map +1 -1
  107. package/lib/processors/removeExtensions.js.map +1 -1
  108. package/lib/processors/removeParameters.js.map +1 -1
  109. package/lib/processors/removePaths.js.map +1 -1
  110. package/lib/processors/traverse.js.map +1 -1
  111. package/lib/ui/Accordion.js +1 -1
  112. package/lib/ui/Accordion.js.map +1 -1
  113. package/lib/ui/ActionButton.js +2 -2
  114. package/lib/ui/ActionButton.js.map +1 -1
  115. package/lib/ui/Alert.js +1 -1
  116. package/lib/ui/Alert.js.map +1 -1
  117. package/lib/ui/AlertDialog.js +1 -1
  118. package/lib/ui/AlertDialog.js.map +1 -1
  119. package/lib/ui/Badge.js +1 -1
  120. package/lib/ui/Badge.js.map +1 -1
  121. package/lib/ui/Breadcrumb.js +1 -1
  122. package/lib/ui/Breadcrumb.js.map +1 -1
  123. package/lib/ui/Button.js +1 -1
  124. package/lib/ui/Button.js.map +1 -1
  125. package/lib/ui/Callout.js +1 -1
  126. package/lib/ui/Callout.js.map +1 -1
  127. package/lib/ui/Card.js +1 -1
  128. package/lib/ui/Card.js.map +1 -1
  129. package/lib/ui/Carousel.js +1 -1
  130. package/lib/ui/Carousel.js.map +1 -1
  131. package/lib/ui/Checkbox.js +1 -1
  132. package/lib/ui/Checkbox.js.map +1 -1
  133. package/lib/ui/CodeBlock.js +2 -2
  134. package/lib/ui/Command.js +2 -2
  135. package/lib/ui/Command.js.map +1 -1
  136. package/lib/ui/Dialog.js +1 -1
  137. package/lib/ui/Dialog.js.map +1 -1
  138. package/lib/ui/Drawer.js +2 -2
  139. package/lib/ui/DropdownMenu.js +1 -1
  140. package/lib/ui/DropdownMenu.js.map +1 -1
  141. package/lib/ui/EmbeddedCodeBlock.js +2 -2
  142. package/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  143. package/lib/ui/Form.js +1 -1
  144. package/lib/ui/Form.js.map +1 -1
  145. package/lib/ui/HoverCard.js +1 -1
  146. package/lib/ui/HoverCard.js.map +1 -1
  147. package/lib/ui/Input.js +1 -1
  148. package/lib/ui/Input.js.map +1 -1
  149. package/lib/ui/Label.js +1 -1
  150. package/lib/ui/Label.js.map +1 -1
  151. package/lib/ui/Pagination.js +1 -1
  152. package/lib/ui/Pagination.js.map +1 -1
  153. package/lib/ui/Popover.js +1 -1
  154. package/lib/ui/Popover.js.map +1 -1
  155. package/lib/ui/Progress.js +1 -1
  156. package/lib/ui/Progress.js.map +1 -1
  157. package/lib/ui/RadioGroup.js +1 -1
  158. package/lib/ui/RadioGroup.js.map +1 -1
  159. package/lib/ui/ScrollArea.js +1 -1
  160. package/lib/ui/ScrollArea.js.map +1 -1
  161. package/lib/ui/Select.js +1 -1
  162. package/lib/ui/Select.js.map +1 -1
  163. package/lib/ui/Skeleton.js +1 -1
  164. package/lib/ui/Skeleton.js.map +1 -1
  165. package/lib/ui/Slider.js +1 -1
  166. package/lib/ui/Slider.js.map +1 -1
  167. package/lib/ui/Stepper.js.map +1 -1
  168. package/lib/ui/Switch.js +1 -1
  169. package/lib/ui/Switch.js.map +1 -1
  170. package/lib/ui/SyntaxHighlight.js +2 -2
  171. package/lib/ui/Tabs.js +1 -1
  172. package/lib/ui/Tabs.js.map +1 -1
  173. package/lib/ui/Textarea.js +1 -1
  174. package/lib/ui/Textarea.js.map +1 -1
  175. package/lib/ui/Toggle.js +1 -1
  176. package/lib/ui/Toggle.js.map +1 -1
  177. package/lib/ui/ToggleGroup.js +1 -1
  178. package/lib/ui/ToggleGroup.js.map +1 -1
  179. package/lib/ui/Tooltip.js +1 -1
  180. package/lib/ui/Tooltip.js.map +1 -1
  181. package/lib/ui/util.js +1 -1
  182. package/lib/useExposedProps-BIYjecPD.js.map +1 -1
  183. package/lib/zudoku.auth-auth0.js.map +1 -1
  184. package/lib/zudoku.auth-azureb2c.js +40 -9882
  185. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  186. package/lib/zudoku.auth-clerk.js +2 -2
  187. package/lib/zudoku.auth-clerk.js.map +1 -1
  188. package/lib/zudoku.auth-openid.js +20 -19
  189. package/lib/zudoku.auth-openid.js.map +1 -1
  190. package/lib/zudoku.auth-supabase.js +97 -0
  191. package/lib/zudoku.auth-supabase.js.map +1 -0
  192. package/lib/zudoku.components.js +3 -3
  193. package/lib/zudoku.hooks.js.map +1 -1
  194. package/lib/zudoku.icons.js.map +1 -1
  195. package/lib/zudoku.plugin-api-catalog.js +4 -4
  196. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  197. package/lib/zudoku.plugin-api-keys.js +6 -6
  198. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  199. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  200. package/lib/zudoku.plugin-markdown.js +1 -1
  201. package/lib/zudoku.plugin-markdown.js.map +1 -1
  202. package/lib/zudoku.plugin-openapi.js +1 -1
  203. package/lib/zudoku.plugin-redirect.js.map +1 -1
  204. package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
  205. package/lib/zudoku.plugin-search-pagefind.js +5 -5
  206. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  207. package/lib/zudoku.plugins.js.map +1 -1
  208. package/package.json +15 -15
  209. package/src/app/main.css +26 -5
  210. package/src/lib/components/Header.tsx +1 -1
  211. package/src/lib/components/Markdown.tsx +3 -3
  212. package/src/lib/components/NotFoundPage.tsx +3 -2
  213. package/src/lib/components/Typography.tsx +1 -1
  214. package/src/lib/core/ZudokuContext.ts +1 -0
  215. package/src/lib/errors/ErrorAlert.tsx +5 -7
  216. package/src/lib/plugins/openapi/Sidecar.tsx +1 -1
  217. package/src/lib/plugins/openapi/SidecarExamples.tsx +1 -1
  218. package/src/lib/plugins/openapi/playground/PathParams.tsx +1 -1
  219. package/src/lib/plugins/openapi/playground/Playground.tsx +8 -2
  220. package/src/lib/ui/CodeBlock.tsx +1 -1
  221. package/src/lib/ui/EmbeddedCodeBlock.tsx +1 -1
  222. package/dist/flat-config.d.ts +0 -325
  223. package/lib/OperationList-YZ7k-Rkt.js.map +0 -1
  224. package/lib/clerk-BDZ31hjU.js +0 -25190
  225. package/lib/clerk-BDZ31hjU.js.map +0 -1
  226. package/lib/cn-wvCW-ho6.js.map +0 -1
  227. package/lib/createServer-Di2U1Dg0.js.map +0 -1
  228. package/lib/errors-Dv_yAK6M.js +0 -78
  229. package/lib/errors-Dv_yAK6M.js.map +0 -1
  230. package/lib/index-DKCEJ4Kd.js.map +0 -1
@@ -0,0 +1,97 @@
1
+ import { createClient as l } from "@supabase/supabase-js";
2
+ import { C as g, A as p } from "./errors-C1GlNcV3.js";
3
+ import { u as r } from "./hook-CZjW2buS.js";
4
+ class f extends g {
5
+ client;
6
+ provider;
7
+ redirectToAfterSignUp;
8
+ redirectToAfterSignIn;
9
+ redirectToAfterSignOut;
10
+ constructor({
11
+ supabaseUrl: e,
12
+ supabaseKey: t,
13
+ provider: i,
14
+ redirectToAfterSignUp: c,
15
+ redirectToAfterSignIn: u,
16
+ redirectToAfterSignOut: d,
17
+ basePath: h
18
+ }) {
19
+ super(), this.provider = i, this.client = l(e, t, {
20
+ auth: {
21
+ autoRefreshToken: !0,
22
+ persistSession: !0
23
+ }
24
+ });
25
+ const s = h ?? "/";
26
+ this.redirectToAfterSignUp = c ?? s, this.redirectToAfterSignIn = u ?? s, this.redirectToAfterSignOut = d ?? s, this.client.auth.onAuthStateChange(async (a, o) => {
27
+ o && (a === "SIGNED_IN" || a === "TOKEN_REFRESHED") ? await this.updateUserState(o) : a === "SIGNED_OUT" && r.getState().setLoggedOut();
28
+ });
29
+ }
30
+ async updateUserState(e) {
31
+ const { user: t } = e, i = {
32
+ sub: t.id,
33
+ email: t.email,
34
+ name: t.user_metadata.full_name || t.user_metadata.name,
35
+ emailVerified: t.email_confirmed_at != null,
36
+ pictureUrl: t.user_metadata.avatar_url
37
+ };
38
+ r.getState().setLoggedIn({
39
+ profile: i,
40
+ providerData: { session: e }
41
+ });
42
+ }
43
+ async getAccessToken() {
44
+ const { data: e, error: t } = await this.client.auth.getSession();
45
+ if (t || !e.session)
46
+ throw new p("User is not authenticated");
47
+ return e.session.access_token;
48
+ }
49
+ async signRequest(e) {
50
+ const t = await this.getAccessToken();
51
+ return e.headers.set("Authorization", `Bearer ${t}`), e;
52
+ }
53
+ signUp = async ({ redirectTo: e }) => {
54
+ const t = e ?? this.redirectToAfterSignUp;
55
+ await this.client.auth.signInWithOAuth({
56
+ provider: this.provider,
57
+ options: {
58
+ redirectTo: window.location.origin + t
59
+ }
60
+ });
61
+ };
62
+ signIn = async ({ redirectTo: e }) => {
63
+ const t = e ?? this.redirectToAfterSignIn;
64
+ await this.client.auth.signInWithOAuth({
65
+ provider: this.provider,
66
+ options: {
67
+ redirectTo: window.location.origin + t,
68
+ queryParams: {
69
+ access_type: "offline",
70
+ prompt: "consent"
71
+ }
72
+ }
73
+ });
74
+ };
75
+ signOut = async () => {
76
+ await new Promise((e) => {
77
+ const { data: t } = this.client.auth.onAuthStateChange(async (i) => {
78
+ i === "SIGNED_OUT" && (t.subscription.unsubscribe(), e());
79
+ });
80
+ this.client.auth.signOut();
81
+ }), r.setState({
82
+ isAuthenticated: !1,
83
+ isPending: !1,
84
+ profile: void 0,
85
+ providerData: void 0
86
+ });
87
+ };
88
+ onPageLoad = async () => {
89
+ const { data: e, error: t } = await this.client.auth.getSession();
90
+ !t && e.session && await this.updateUserState(e.session);
91
+ };
92
+ }
93
+ const T = (n) => new f(n);
94
+ export {
95
+ T as default
96
+ };
97
+ //# sourceMappingURL=zudoku.auth-supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zudoku.auth-supabase.js","sources":["../src/lib/authentication/providers/supabase.tsx"],"sourcesContent":["import {\n createClient,\n type Provider,\n type Session,\n type SupabaseClient,\n} from \"@supabase/supabase-js\";\nimport { type SupabaseAuthenticationConfig } from \"../../../config/config.js\";\nimport {\n type AuthenticationPlugin,\n type AuthenticationProviderInitializer,\n} from \"../authentication.js\";\nimport { CoreAuthenticationPlugin } from \"../AuthenticationPlugin.js\";\nimport { AuthorizationError } from \"../errors.js\";\nimport { useAuthState, type UserProfile } from \"../state.js\";\n\nclass SupabaseAuthenticationProvider\n extends CoreAuthenticationPlugin\n implements AuthenticationPlugin\n{\n private readonly client: SupabaseClient;\n private readonly provider: Provider;\n private readonly redirectToAfterSignUp: string;\n private readonly redirectToAfterSignIn: string;\n private readonly redirectToAfterSignOut: string;\n\n constructor({\n supabaseUrl,\n supabaseKey,\n provider,\n redirectToAfterSignUp,\n redirectToAfterSignIn,\n redirectToAfterSignOut,\n basePath,\n }: SupabaseAuthenticationConfig) {\n super();\n this.provider = provider;\n this.client = createClient(supabaseUrl, supabaseKey, {\n auth: {\n autoRefreshToken: true,\n persistSession: true,\n },\n });\n\n const root = basePath ?? \"/\";\n\n this.redirectToAfterSignUp = redirectToAfterSignUp ?? root;\n this.redirectToAfterSignIn = redirectToAfterSignIn ?? root;\n this.redirectToAfterSignOut = redirectToAfterSignOut ?? root;\n\n this.client.auth.onAuthStateChange(async (event, session) => {\n if (session && (event === \"SIGNED_IN\" || event === \"TOKEN_REFRESHED\")) {\n await this.updateUserState(session);\n } else if (event === \"SIGNED_OUT\") {\n useAuthState.getState().setLoggedOut();\n }\n });\n }\n\n private async updateUserState(session: Session) {\n const { user } = session;\n\n const profile: UserProfile = {\n sub: user.id,\n email: user.email,\n name: user.user_metadata.full_name || user.user_metadata.name,\n emailVerified: user.email_confirmed_at != null,\n pictureUrl: user.user_metadata.avatar_url,\n };\n\n useAuthState.getState().setLoggedIn({\n profile,\n providerData: { session },\n });\n }\n\n async getAccessToken(): Promise<string> {\n const { data, error } = await this.client.auth.getSession();\n\n if (error || !data.session) {\n throw new AuthorizationError(\"User is not authenticated\");\n }\n\n return data.session.access_token;\n }\n\n async signRequest(request: Request): Promise<Request> {\n const accessToken = await this.getAccessToken();\n request.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n return request;\n }\n\n signUp = async ({ redirectTo }: { redirectTo?: string }) => {\n const finalRedirectTo = redirectTo ?? this.redirectToAfterSignUp;\n\n // Open Supabase Auth UI in a new window\n await this.client.auth.signInWithOAuth({\n provider: this.provider,\n options: {\n redirectTo: window.location.origin + finalRedirectTo,\n },\n });\n };\n\n signIn = async ({ redirectTo }: { redirectTo?: string }) => {\n const finalRedirectTo = redirectTo ?? this.redirectToAfterSignIn;\n\n await this.client.auth.signInWithOAuth({\n provider: this.provider,\n options: {\n redirectTo: window.location.origin + finalRedirectTo,\n queryParams: {\n access_type: \"offline\",\n prompt: \"consent\",\n },\n },\n });\n };\n\n signOut = async () => {\n await new Promise<void>((resolve) => {\n const { data } = this.client.auth.onAuthStateChange(async (event) => {\n if (event !== \"SIGNED_OUT\") return;\n data.subscription.unsubscribe();\n resolve();\n });\n void this.client.auth.signOut();\n });\n\n useAuthState.setState({\n isAuthenticated: false,\n isPending: false,\n profile: undefined,\n providerData: undefined,\n });\n };\n\n onPageLoad = async () => {\n const { data, error } = await this.client.auth.getSession();\n\n if (!error && data.session) {\n await this.updateUserState(data.session);\n }\n };\n}\n\nconst supabaseAuth: AuthenticationProviderInitializer<\n SupabaseAuthenticationConfig\n> = (options) => new SupabaseAuthenticationProvider(options);\n\nexport default supabaseAuth;\n"],"names":["SupabaseAuthenticationProvider","CoreAuthenticationPlugin","supabaseUrl","supabaseKey","provider","redirectToAfterSignUp","redirectToAfterSignIn","redirectToAfterSignOut","basePath","createClient","root","event","session","useAuthState","user","profile","data","error","AuthorizationError","request","accessToken","redirectTo","finalRedirectTo","resolve","supabaseAuth","options"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import "./RouteGuard-CX6A77iy.js";
1
+ import "./RouteGuard-Vnlz_t51.js";
2
2
  import "./index-Bm35Tkgf.js";
3
3
  import "./chunk-DQRVZFIR-DHK7_Ilc.js";
4
4
  import "./hook-CZjW2buS.js";
5
- import "./Slot-tFjhrd8V.js";
6
- import { e as C, f as d, j as h, B as k, m as l, C as S, i as B, H as c, c as y, L as E, M as g, g as H, R as L, d as M, S as R, h as T, T as Z, Z as f, b as A, l as b, k as j, n as v, u as w } from "./index-DKCEJ4Kd.js";
5
+ import "./Slot-B31yZlfB.js";
6
+ import { e as C, f as d, j as h, B as k, m as l, C as S, i as B, H as c, c as y, L as E, M as g, g as H, R as L, d as M, S as R, h as T, T as Z, Z as f, b as A, l as b, k as j, n as v, u as w } from "./index-D09PbNex.js";
7
7
  import "./ui/Button.js";
8
8
  import "./ui/Callout.js";
9
9
  import "./ClientOnly-E7hGysn1.js";
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.hooks.js","sources":["../src/lib/hooks/useEvent.ts","../src/lib/hooks/index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useZudoku } from \"../components/context/ZudokuContext.js\";\nimport type { ZudokuEvents } from \"../core/ZudokuContext.js\";\n\ntype EventParameters<Event extends keyof ZudokuEvents> = Parameters<\n ZudokuEvents[Event]\n>;\n\n/**\n * Hook to subscribe to Zudoku events with automatic cleanup\n * @param event The event to subscribe to\n * @param callback Optional callback to be called when the event is emitted\n * @returns The latest event data if no callback is provided, or the callback's return value if it returns something\n */\nexport function useEvent<E extends keyof ZudokuEvents>(\n event: E,\n): EventParameters<E>;\nexport function useEvent<E extends keyof ZudokuEvents, R>(\n event: E,\n callback: (...args: EventParameters<E>) => R,\n): R;\nexport function useEvent<E extends keyof ZudokuEvents, R>(\n event: E,\n callback?: (...args: EventParameters<E>) => R,\n) {\n const zudoku = useZudoku();\n const [latestData, setLatestData] = useState<R | EventParameters<E>>();\n\n useEffect(() => {\n return zudoku.addEventListener(event, ((...args: EventParameters<E>) => {\n if (callback) {\n const result = callback(...args);\n setLatestData(result);\n } else {\n setLatestData(args);\n }\n }) as ZudokuEvents[E]);\n }, [zudoku, event, callback]);\n\n return latestData;\n}\n","import { useMDXComponents as useMDXComponentsImport } from \"@mdx-js/react\";\nimport { useTheme as useThemeImport } from \"next-themes\";\nimport { useAuth as useAuthImport } from \"../authentication/hook.js\";\nimport { CACHE_KEYS, useCache as useCacheImport } from \"../components/cache.js\";\nimport { useZudoku as useZudokuImport } from \"../components/context/ZudokuContext.js\";\nimport { useExposedProps as useExposedPropsImport } from \"../util/useExposedProps.js\";\nimport { useEvent as useEventImport } from \"./useEvent.js\";\n\nexport const useEvent = /*@__PURE__*/ useEventImport;\nexport const useTheme = /*@__PURE__*/ useThemeImport;\nexport const useExposedProps = /*@__PURE__*/ useExposedPropsImport;\nexport const useMDXComponents = /*@__PURE__*/ useMDXComponentsImport;\nexport const useAuth = /*@__PURE__*/ useAuthImport;\nexport const useZudoku = /*@__PURE__*/ useZudokuImport;\nexport const useCache = /*@__PURE__*/ useCacheImport;\nexport { CACHE_KEYS };\n"],"names":["useEvent","event","callback","zudoku","useZudoku","latestData","setLatestData","useState","useEffect","args","result","useEventImport","useTheme","useThemeImport","useExposedProps","useExposedPropsImport","useMDXComponents","useMDXComponentsImport","useAuth","useAuthImport","useZudokuImport","useCache","useCacheImport"],"mappings":";;;;;AAqBgB,SAAAA,EACdC,GACAC,GACA;AACA,QAAMC,IAASC,EAAU,GACnB,CAACC,GAAYC,CAAa,IAAIC,EAAiC;AAErE,SAAAC,EAAU,MACDL,EAAO,iBAAiBF,GAAQ,IAAIQ,MAA6B;AACtE,QAAIP,GAAU;AACN,YAAAQ,IAASR,EAAS,GAAGO,CAAI;AAC/B,MAAAH,EAAcI,CAAM;AAAA,IAAA;AAEpB,MAAAJ,EAAcG,CAAI;AAAA,EACpB,CACmB,GACpB,CAACN,GAAQF,GAAOC,CAAQ,CAAC,GAErBG;AACT;AChCO,MAAML,IAAyBW,GACzBC,IAAyBC,GACzBC,IAAgCC,GAChCC,IAAiCC,GACjCC,IAAwBC,GACxBf,IAA0BgB,GAC1BC,IAAyBC;"}
1
+ {"version":3,"file":"zudoku.hooks.js","sources":["../src/lib/hooks/useEvent.ts","../src/lib/hooks/index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useZudoku } from \"../components/context/ZudokuContext.js\";\nimport type { ZudokuEvents } from \"../core/ZudokuContext.js\";\n\ntype EventParameters<Event extends keyof ZudokuEvents> = Parameters<\n ZudokuEvents[Event]\n>;\n\n/**\n * Hook to subscribe to Zudoku events with automatic cleanup\n * @param event The event to subscribe to\n * @param callback Optional callback to be called when the event is emitted\n * @returns The latest event data if no callback is provided, or the callback's return value if it returns something\n */\nexport function useEvent<E extends keyof ZudokuEvents>(\n event: E,\n): EventParameters<E>;\nexport function useEvent<E extends keyof ZudokuEvents, R>(\n event: E,\n callback: (...args: EventParameters<E>) => R,\n): R;\nexport function useEvent<E extends keyof ZudokuEvents, R>(\n event: E,\n callback?: (...args: EventParameters<E>) => R,\n) {\n const zudoku = useZudoku();\n const [latestData, setLatestData] = useState<R | EventParameters<E>>();\n\n useEffect(() => {\n return zudoku.addEventListener(event, ((...args: EventParameters<E>) => {\n if (callback) {\n const result = callback(...args);\n setLatestData(result);\n } else {\n setLatestData(args);\n }\n }) as ZudokuEvents[E]);\n }, [zudoku, event, callback]);\n\n return latestData;\n}\n","import { useMDXComponents as useMDXComponentsImport } from \"@mdx-js/react\";\nimport { useTheme as useThemeImport } from \"next-themes\";\nimport { useAuth as useAuthImport } from \"../authentication/hook.js\";\nimport { CACHE_KEYS, useCache as useCacheImport } from \"../components/cache.js\";\nimport { useZudoku as useZudokuImport } from \"../components/context/ZudokuContext.js\";\nimport { useExposedProps as useExposedPropsImport } from \"../util/useExposedProps.js\";\nimport { useEvent as useEventImport } from \"./useEvent.js\";\n\nexport const useEvent = /*@__PURE__*/ useEventImport;\nexport const useTheme = /*@__PURE__*/ useThemeImport;\nexport const useExposedProps = /*@__PURE__*/ useExposedPropsImport;\nexport const useMDXComponents = /*@__PURE__*/ useMDXComponentsImport;\nexport const useAuth = /*@__PURE__*/ useAuthImport;\nexport const useZudoku = /*@__PURE__*/ useZudokuImport;\nexport const useCache = /*@__PURE__*/ useCacheImport;\nexport { CACHE_KEYS };\n"],"names":["useEvent","event","callback","zudoku","useZudoku","latestData","setLatestData","useState","useEffect","args","result","useEventImport","useTheme","useThemeImport","useExposedProps","useExposedPropsImport","useMDXComponents","useMDXComponentsImport","useAuth","useAuthImport","useZudokuImport","useCache","useCacheImport"],"mappings":";;;;;AAqBO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAASC,EAAA,GACT,CAACC,GAAYC,CAAa,IAAIC,EAAA;AAEpC,SAAAC,EAAU,MACDL,EAAO,iBAAiBF,GAAQ,IAAIQ,MAA6B;AACtE,QAAIP,GAAU;AACZ,YAAMQ,IAASR,EAAS,GAAGO,CAAI;AAC/B,MAAAH,EAAcI,CAAM;AAAA,IACtB;AACE,MAAAJ,EAAcG,CAAI;AAAA,EAEtB,CAAqB,GACpB,CAACN,GAAQF,GAAOC,CAAQ,CAAC,GAErBG;AACT;AChCO,MAAML,IAAyBW,GACzBC,IAAyBC,GACzBC,IAAgCC,GAChCC,IAAiCC,GACjCC,IAAwBC,GACxBf,IAA0BgB,GAC1BC,IAAyBC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.icons.js","sources":["../src/lib/MissingIcon.tsx"],"sourcesContent":["import { CircleDashed, LucideProps } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./ui/Tooltip.js\";\n\nexport const MissingIcon = (props: LucideProps) => {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger className=\"text-red-500\">\n <CircleDashed {...props} />\n </TooltipTrigger>\n <TooltipContent>\n Icon not found, see: https://lucide.dev/icons/\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n"],"names":["MissingIcon","props","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","CircleDashed","TooltipContent"],"mappings":";;;;AAQa,MAAAA,IAAc,CAACC,MAExBC,gBAAAA,EAAAA,IAACC,GACC,EAAA,UAAAC,gBAAAA,EAAAA,KAACC,GACC,EAAA,UAAA;AAAA,EAAAH,gBAAAA,EAAAA,IAACI,KAAe,WAAU,gBACxB,gCAACC,GAAc,EAAA,GAAGN,GAAO,EAC3B,CAAA;AAAA,EACAC,gBAAAA,EAAAA,IAACM,KAAe,UAEhB,iDAAA,CAAA;AAAA,EAAA,CACF,EACF,CAAA;"}
1
+ {"version":3,"file":"zudoku.icons.js","sources":["../src/lib/MissingIcon.tsx"],"sourcesContent":["import { CircleDashed, LucideProps } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./ui/Tooltip.js\";\n\nexport const MissingIcon = (props: LucideProps) => {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger className=\"text-red-500\">\n <CircleDashed {...props} />\n </TooltipTrigger>\n <TooltipContent>\n Icon not found, see: https://lucide.dev/icons/\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n"],"names":["MissingIcon","props","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","CircleDashed","TooltipContent"],"mappings":";;;;AAQO,MAAMA,IAAc,CAACC,MAExBC,gBAAAA,EAAAA,IAACC,GAAA,EACC,UAAAC,gBAAAA,EAAAA,KAACC,GAAA,EACC,UAAA;AAAA,EAAAH,gBAAAA,EAAAA,IAACI,KAAe,WAAU,gBACxB,gCAACC,GAAA,EAAc,GAAGN,GAAO,EAAA,CAC3B;AAAA,EACAC,gBAAAA,EAAAA,IAACM,KAAe,UAAA,iDAAA,CAEhB;AAAA,EAAA,CACF,EAAA,CACF;"}
@@ -1,10 +1,10 @@
1
1
  import { j as t } from "./jsx-runtime-C5mzlN2N.js";
2
- import { s as f } from "./index-CeQqiMIG.js";
2
+ import { s as f } from "./index-CZTEgYDd.js";
3
3
  import { d as b, m as j } from "./chunk-DQRVZFIR-DHK7_Ilc.js";
4
4
  import { u as x, c as v, j as d } from "./hook-CZjW2buS.js";
5
- import { H as y } from "./RouteGuard-CX6A77iy.js";
6
- import { L as N } from "./index-DKCEJ4Kd.js";
7
- import { H as k, M as S } from "./Slot-tFjhrd8V.js";
5
+ import { H as y } from "./RouteGuard-Vnlz_t51.js";
6
+ import { L as N } from "./index-D09PbNex.js";
7
+ import { H as k, M as S } from "./Slot-B31yZlfB.js";
8
8
  const w = ({
9
9
  items: n,
10
10
  filterCatalogItems: o = (r) => r,
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-api-catalog.js","sources":["../src/lib/plugins/api-catalog/Catalog.tsx","../src/lib/plugins/api-catalog/index.tsx"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Helmet } from \"@zudoku/react-helmet-async\";\nimport { useMatch } from \"react-router\";\nimport { Link } from \"zudoku/components\";\nimport { useAuthState } from \"../../authentication/state.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Markdown } from \"../../components/Markdown.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { type ApiCatalogPluginOptions, getKey } from \"./index.js\";\n\nexport const Catalog = ({\n items,\n filterCatalogItems = (items) => items,\n label = \"API Library\",\n categoryLabel,\n}: Omit<ApiCatalogPluginOptions, \"path\"> & {\n categoryLabel?: string;\n}) => {\n const auth = useAuthState();\n const match = useMatch({ path: \"/catalog/:category\" });\n const activeCategory = match?.params.category;\n\n const catalogItems = useSuspenseQuery({\n queryFn: () => filterCatalogItems(items, { auth }),\n queryKey: [\"catalogItems\", auth],\n });\n\n // Only index the overview page, ignore the rest\n const dataSet = activeCategory ? { \"data-pagefind-ignore\": \"all\" } : {};\n\n return (\n <section className=\"pt-(--padding-content-top)\" {...dataSet}>\n <Helmet>\n <title>\n {categoryLabel ? `${categoryLabel} - ` : \"\"}\n {label}\n </title>\n </Helmet>\n <div className=\"grid gap-4\">\n <Heading level={2}>\n {label}\n {categoryLabel && ` - ${categoryLabel}`}\n </Heading>\n\n <div className=\"grid grid-cols-2 gap-4\">\n {catalogItems.data\n .filter(\n (api) =>\n !activeCategory ||\n api.categories.find((c) =>\n c.tags.find((t) => getKey(c.label, t) === activeCategory),\n ),\n )\n .map((api) => (\n <Link\n to={joinUrl(api.path)}\n className=\"no-underline hover:!text-foreground\"\n key={api.path}\n >\n <div className=\"border h-full rounded-lg p-4 flex flex-col gap-2 cursor-pointer hover:bg-border/20 font-normal\">\n <span className=\"font-semibold\">{api.label}</span>\n <Markdown\n className=\"text-sm whitespace-pre-wrap mb-6 line-clamp-2\"\n content={api.description}\n />\n </div>\n </Link>\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import slugify from \"@sindresorhus/slugify\";\nimport { matchPath } from \"react-router\";\nimport type { NavigationItem } from \"../../../config/validators/NavigationSchema.js\";\nimport type { AuthState } from \"../../authentication/state.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { Catalog } from \"./Catalog.js\";\n\nexport const getKey = (category: string, tag: string) =>\n slugify(`${category}-${tag}`);\n\nexport type ApiCatalogItem = {\n path: string;\n label: string;\n description: string;\n categories: CatalogCategory[];\n};\n\nexport type CatalogCategory = {\n label: string;\n tags: string[];\n};\n\nexport type ApiCatalogPluginOptions = {\n path: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n filterCatalogItems?: FilterCatalogItemsFn;\n};\n\nexport type CatalogContext<ProviderData = unknown> = {\n auth: AuthState<ProviderData>;\n};\n\nexport type FilterCatalogItemsFn<ProviderData = unknown> = (\n items: ApiCatalogItem[],\n { auth }: CatalogContext<ProviderData>,\n) => ApiCatalogItem[];\n\nexport const apiCatalogPlugin = ({\n path,\n items,\n label,\n categories = [],\n filterCatalogItems,\n}: {\n path: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n filterCatalogItems?: FilterCatalogItemsFn;\n}): ZudokuPlugin => {\n const paths = Object.fromEntries(\n categories.flatMap((category) =>\n [undefined, ...category.tags].map((tag) => [\n joinUrl(path, tag ? getKey(category.label, tag) : undefined),\n tag,\n ]),\n ),\n );\n\n return {\n getNavigation: async (currentPath) => {\n const matches = Object.keys(paths).some((path) =>\n matchPath(path, currentPath),\n );\n\n if (!matches) {\n return [];\n }\n\n const navigation: NavigationItem[] = categories.map((category) => ({\n type: \"category\",\n label: category.label,\n collapsible: false,\n items: category.tags.map((tag) => ({\n type: \"link\",\n to: joinUrl(path, getKey(category.label, tag)),\n label: tag,\n badge: {\n label: String(\n items.filter((api) =>\n api.categories.find((c) => c.tags.includes(tag)),\n ).length,\n ),\n color: \"outline\",\n },\n })),\n }));\n\n navigation.unshift({\n type: \"link\",\n to: joinUrl(path),\n label: \"Overview\",\n badge: { label: String(items.length), color: \"outline\" },\n });\n\n return navigation;\n },\n getRoutes: () =>\n Object.entries(paths).map(([path, tag]) => ({\n path,\n element: (\n <Catalog\n label={label}\n categoryLabel={tag}\n items={items}\n filterCatalogItems={filterCatalogItems}\n categories={categories}\n />\n ),\n })),\n };\n};\n"],"names":["Catalog","items","filterCatalogItems","label","categoryLabel","auth","useAuthState","activeCategory","useMatch","catalogItems","useSuspenseQuery","dataSet","jsxs","jsx","Helmet","Heading","api","c","t","getKey","Link","joinUrl","Markdown","category","tag","slugify","apiCatalogPlugin","path","categories","paths","currentPath","matchPath","navigation"],"mappings":"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"}
1
+ {"version":3,"file":"zudoku.plugin-api-catalog.js","sources":["../src/lib/plugins/api-catalog/Catalog.tsx","../src/lib/plugins/api-catalog/index.tsx"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Helmet } from \"@zudoku/react-helmet-async\";\nimport { useMatch } from \"react-router\";\nimport { Link } from \"zudoku/components\";\nimport { useAuthState } from \"../../authentication/state.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Markdown } from \"../../components/Markdown.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { type ApiCatalogPluginOptions, getKey } from \"./index.js\";\n\nexport const Catalog = ({\n items,\n filterCatalogItems = (items) => items,\n label = \"API Library\",\n categoryLabel,\n}: Omit<ApiCatalogPluginOptions, \"path\"> & {\n categoryLabel?: string;\n}) => {\n const auth = useAuthState();\n const match = useMatch({ path: \"/catalog/:category\" });\n const activeCategory = match?.params.category;\n\n const catalogItems = useSuspenseQuery({\n queryFn: () => filterCatalogItems(items, { auth }),\n queryKey: [\"catalogItems\", auth],\n });\n\n // Only index the overview page, ignore the rest\n const dataSet = activeCategory ? { \"data-pagefind-ignore\": \"all\" } : {};\n\n return (\n <section className=\"pt-(--padding-content-top)\" {...dataSet}>\n <Helmet>\n <title>\n {categoryLabel ? `${categoryLabel} - ` : \"\"}\n {label}\n </title>\n </Helmet>\n <div className=\"grid gap-4\">\n <Heading level={2}>\n {label}\n {categoryLabel && ` - ${categoryLabel}`}\n </Heading>\n\n <div className=\"grid grid-cols-2 gap-4\">\n {catalogItems.data\n .filter(\n (api) =>\n !activeCategory ||\n api.categories.find((c) =>\n c.tags.find((t) => getKey(c.label, t) === activeCategory),\n ),\n )\n .map((api) => (\n <Link\n to={joinUrl(api.path)}\n className=\"no-underline hover:!text-foreground\"\n key={api.path}\n >\n <div className=\"border h-full rounded-lg p-4 flex flex-col gap-2 cursor-pointer hover:bg-border/20 font-normal\">\n <span className=\"font-semibold\">{api.label}</span>\n <Markdown\n className=\"text-sm whitespace-pre-wrap mb-6 line-clamp-2\"\n content={api.description}\n />\n </div>\n </Link>\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import slugify from \"@sindresorhus/slugify\";\nimport { matchPath } from \"react-router\";\nimport type { NavigationItem } from \"../../../config/validators/NavigationSchema.js\";\nimport type { AuthState } from \"../../authentication/state.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { Catalog } from \"./Catalog.js\";\n\nexport const getKey = (category: string, tag: string) =>\n slugify(`${category}-${tag}`);\n\nexport type ApiCatalogItem = {\n path: string;\n label: string;\n description: string;\n categories: CatalogCategory[];\n};\n\nexport type CatalogCategory = {\n label: string;\n tags: string[];\n};\n\nexport type ApiCatalogPluginOptions = {\n path: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n filterCatalogItems?: FilterCatalogItemsFn;\n};\n\nexport type CatalogContext<ProviderData = unknown> = {\n auth: AuthState<ProviderData>;\n};\n\nexport type FilterCatalogItemsFn<ProviderData = unknown> = (\n items: ApiCatalogItem[],\n { auth }: CatalogContext<ProviderData>,\n) => ApiCatalogItem[];\n\nexport const apiCatalogPlugin = ({\n path,\n items,\n label,\n categories = [],\n filterCatalogItems,\n}: {\n path: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n filterCatalogItems?: FilterCatalogItemsFn;\n}): ZudokuPlugin => {\n const paths = Object.fromEntries(\n categories.flatMap((category) =>\n [undefined, ...category.tags].map((tag) => [\n joinUrl(path, tag ? getKey(category.label, tag) : undefined),\n tag,\n ]),\n ),\n );\n\n return {\n getNavigation: async (currentPath) => {\n const matches = Object.keys(paths).some((path) =>\n matchPath(path, currentPath),\n );\n\n if (!matches) {\n return [];\n }\n\n const navigation: NavigationItem[] = categories.map((category) => ({\n type: \"category\",\n label: category.label,\n collapsible: false,\n items: category.tags.map((tag) => ({\n type: \"link\",\n to: joinUrl(path, getKey(category.label, tag)),\n label: tag,\n badge: {\n label: String(\n items.filter((api) =>\n api.categories.find((c) => c.tags.includes(tag)),\n ).length,\n ),\n color: \"outline\",\n },\n })),\n }));\n\n navigation.unshift({\n type: \"link\",\n to: joinUrl(path),\n label: \"Overview\",\n badge: { label: String(items.length), color: \"outline\" },\n });\n\n return navigation;\n },\n getRoutes: () =>\n Object.entries(paths).map(([path, tag]) => ({\n path,\n element: (\n <Catalog\n label={label}\n categoryLabel={tag}\n items={items}\n filterCatalogItems={filterCatalogItems}\n categories={categories}\n />\n ),\n })),\n };\n};\n"],"names":["Catalog","items","filterCatalogItems","label","categoryLabel","auth","useAuthState","activeCategory","useMatch","catalogItems","useSuspenseQuery","dataSet","jsxs","jsx","Helmet","Heading","api","c","t","getKey","Link","joinUrl","Markdown","category","tag","slugify","apiCatalogPlugin","path","categories","paths","currentPath","matchPath","navigation"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
1
  import { j as e } from "./jsx-runtime-C5mzlN2N.js";
2
2
  import { CircleSlashIcon as M, CheckIcon as W, XIcon as ae, PencilLineIcon as oe, RefreshCwIcon as le, EyeOffIcon as ce, EyeIcon as de, CopyIcon as ue, TrashIcon as he, KeyRoundIcon as fe } from "lucide-react";
3
- import { D as pe, a as B, R as me } from "./Slot-tFjhrd8V.js";
3
+ import { D as pe, a as B, R as me } from "./Slot-B31yZlfB.js";
4
4
  import { i as D } from "./invariant-DAFpPywt.js";
5
5
  import { O as xe, L as J } from "./chunk-DQRVZFIR-DHK7_Ilc.js";
6
6
  import { e as ye, d as ge, g as je, c as Ce } from "./hook-CZjW2buS.js";
7
7
  import { Button as j } from "./ui/Button.js";
8
- import { u as S, A as q, a as L } from "./Alert-SijAp9LN.js";
8
+ import { u as S, A as q, a as L } from "./Alert-CWApD0CL.js";
9
9
  import * as F from "react";
10
10
  import we, { createContext as O, useRef as N, useLayoutEffect as ve, useEffect as X, useId as Q, useContext as H, useInsertionEffect as ke, useMemo as $, useCallback as be, Children as Ee, isValidElement as Ne, useState as P } from "react";
11
- import { C as Pe, a as De } from "./Card-DPhGbYUM.js";
12
- import { D as Y, e as G, a as V, c as Z, b as ee, d as te, f as se, g as R } from "./Dialog-CiIdyz6a.js";
11
+ import { C as Pe, a as De } from "./Card-CMDQUPM4.js";
12
+ import { D as Y, e as G, a as V, c as Z, b as ee, d as te, f as se, g as R } from "./Dialog-DMWw1doX.js";
13
13
  import { Input as Ie } from "./ui/Input.js";
14
- import { c as E } from "./cn-wvCW-ho6.js";
15
- import { u as Ke } from "./CodeBlock-DAKxs_Tu.js";
14
+ import { c as E } from "./cn-dYga0KKN.js";
15
+ import { u as Ke } from "./CodeBlock-B-G0eKtw.js";
16
16
  const Ae = () => {
17
17
  const t = ye();
18
18
  return t.isAuthEnabled && t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(xe, {}) : t.isAuthEnabled ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2", children: [