zudoku 0.23.3 → 0.23.4

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 (57) hide show
  1. package/dist/config/validators/common.d.ts +45 -11
  2. package/dist/config/validators/common.js +2 -1
  3. package/dist/config/validators/common.js.map +1 -1
  4. package/dist/config/validators/validate.d.ts +19 -5
  5. package/dist/lib/authentication/providers/openid.d.ts +7 -0
  6. package/dist/lib/authentication/providers/openid.js +1 -0
  7. package/dist/lib/authentication/providers/openid.js.map +1 -1
  8. package/dist/lib/plugins/api-catalog/Catalog.d.ts +2 -6
  9. package/dist/lib/plugins/api-catalog/Catalog.js +22 -15
  10. package/dist/lib/plugins/api-catalog/Catalog.js.map +1 -1
  11. package/dist/lib/plugins/api-catalog/index.d.ts +8 -1
  12. package/dist/lib/plugins/api-catalog/index.js +2 -2
  13. package/dist/lib/plugins/api-catalog/index.js.map +1 -1
  14. package/dist/lib/plugins/search-inkeep/index.js +21 -7
  15. package/dist/lib/plugins/search-inkeep/index.js.map +1 -1
  16. package/dist/vite/plugin-api.js +12 -7
  17. package/dist/vite/plugin-api.js.map +1 -1
  18. package/lib/{AuthenticationPlugin-DQy635W9.js → AuthenticationPlugin-fB7viE7A.js} +2 -2
  19. package/lib/{AuthenticationPlugin-DQy635W9.js.map → AuthenticationPlugin-fB7viE7A.js.map} +1 -1
  20. package/lib/{MdxPage-CBa4X6L5.js → MdxPage-CPBw4_lf.js} +18 -18
  21. package/lib/{MdxPage-CBa4X6L5.js.map → MdxPage-CPBw4_lf.js.map} +1 -1
  22. package/lib/OperationList-C7ac3kR5.js +5014 -0
  23. package/lib/OperationList-C7ac3kR5.js.map +1 -0
  24. package/lib/{Select-Bb_Hqc70.js → Select-D3XuKKuH.js} +3 -3
  25. package/lib/{Select-Bb_Hqc70.js.map → Select-D3XuKKuH.js.map} +1 -1
  26. package/lib/assets/{worker-BmEAZjUP.js → worker-D2kRl-cG.js} +1487 -1436
  27. package/lib/assets/worker-D2kRl-cG.js.map +1 -0
  28. package/lib/cn-qaFjX9_3.js.map +1 -1
  29. package/lib/{createServer-BVFp6Bl3.js → createServer-69sLlmQA.js} +1968 -1917
  30. package/lib/createServer-69sLlmQA.js.map +1 -0
  31. package/lib/{hook-DMHiUaIV.js → hook-DgGeo5iL.js} +2 -2
  32. package/lib/{hook-DMHiUaIV.js.map → hook-DgGeo5iL.js.map} +1 -1
  33. package/lib/{index-B6rTMjdI.js → index-C8ubT49C.js} +6 -6
  34. package/lib/{index-B6rTMjdI.js.map → index-C8ubT49C.js.map} +1 -1
  35. package/lib/{utils-R0j3Raw1.js → utils-B4O1uet5.js} +8 -8
  36. package/lib/{utils-R0j3Raw1.js.map → utils-B4O1uet5.js.map} +1 -1
  37. package/lib/zudoku.auth-clerk.js +1 -1
  38. package/lib/zudoku.auth-openid.js +70 -69
  39. package/lib/zudoku.auth-openid.js.map +1 -1
  40. package/lib/zudoku.components.js +2 -2
  41. package/lib/zudoku.openapi-worker.js +1 -1
  42. package/lib/zudoku.plugin-api-catalog.js +80 -78
  43. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  44. package/lib/zudoku.plugin-api-keys.js +3 -3
  45. package/lib/zudoku.plugin-markdown.js +1 -1
  46. package/lib/zudoku.plugin-openapi.js +3 -3
  47. package/lib/zudoku.plugin-search-inkeep.js +34 -26
  48. package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
  49. package/package.json +5 -5
  50. package/src/lib/authentication/providers/openid.tsx +5 -3
  51. package/src/lib/plugins/api-catalog/Catalog.tsx +59 -60
  52. package/src/lib/plugins/api-catalog/index.tsx +14 -0
  53. package/src/lib/plugins/search-inkeep/index.tsx +27 -8
  54. package/lib/OperationList-Bj-6EKhp.js +0 -4889
  55. package/lib/OperationList-Bj-6EKhp.js.map +0 -1
  56. package/lib/assets/worker-BmEAZjUP.js.map +0 -1
  57. package/lib/createServer-BVFp6Bl3.js.map +0 -1
@@ -20,8 +20,8 @@ import { E as ze, S as D, a as xt, R as yt } from "./SlotletProvider-pfc9oejW.js
20
20
  import { j as n } from "./jsx-runtime-Dx-03ztt.js";
21
21
  import { Button as vt } from "./ui/Button.js";
22
22
  import { Callout as bt } from "./ui/Callout.js";
23
- import { S as He, l as Le, Q as jt, n as w, m as we, o as ke, p as O, q as wt, r as kt, t as Ct, v as Nt, w as Ce, x as Ne, y as Pt, h as Pe, z as Se, A as St, d as Dt, B as Ke, C as Ot, j as q, u as T, D as $e, E as Mt, g as At, Z as Et } from "./utils-R0j3Raw1.js";
24
- import { M as It, u as te } from "./hook-DMHiUaIV.js";
23
+ import { S as He, l as Le, Q as jt, n as w, m as we, o as ke, p as O, q as wt, r as kt, t as Ct, v as Nt, w as Ce, x as Ne, y as Pt, h as Pe, z as Se, A as St, e as Dt, B as Ke, C as Ot, j as q, a as T, D as $e, E as Mt, u as At, Z as Et } from "./utils-B4O1uet5.js";
24
+ import { M as It, u as te } from "./hook-DgGeo5iL.js";
25
25
  import * as $ from "react";
26
26
  import Qt, { StrictMode as Ze, useState as Q, useEffect as R, useRef as me, useCallback as Tt, Suspense as ge, memo as Ve, forwardRef as qt, createContext as Ue, Component as Rt, createElement as De, useMemo as se, useContext as Ft, Fragment as Bt } from "react";
27
27
  import * as zt from "react-dom";
@@ -2,7 +2,7 @@ const o = () => {
2
2
  const r = new SharedWorker(
3
3
  new URL(
4
4
  /* @vite-ignore */
5
- "./assets/worker-BmEAZjUP.js",
5
+ "./assets/worker-D2kRl-cG.js",
6
6
  import.meta.url
7
7
  ),
8
8
  { type: "module" }
@@ -1,114 +1,116 @@
1
1
  import { j as e } from "./jsx-runtime-Dx-03ztt.js";
2
- import { s as n } from "./index-LNp6rxyU.js";
3
- import { Fragment as x } from "react";
4
- import { Head as f, Link as h } from "./zudoku.components.js";
5
- import { M as u } from "./Markdown-CZDLNOFc.js";
6
- import { u as j } from "./useExposedProps-DE9lR6MF.js";
7
- const b = ({
8
- items: l,
9
- categories: i,
10
- label: o = "API Library"
2
+ import { s as j } from "./index-LNp6rxyU.js";
3
+ import { u as b } from "./utils-B4O1uet5.js";
4
+ import { b as y } from "./chunk-D52XG6IA-Dl7HLe6j.js";
5
+ import { Head as v, Link as N } from "./zudoku.components.js";
6
+ import { u as w } from "./state-CFQsUZUP.js";
7
+ import { M as C } from "./Markdown-CZDLNOFc.js";
8
+ import { c as h } from "./cn-qaFjX9_3.js";
9
+ const f = (r, n) => j(`${r}-${n}`), k = ({
10
+ items: r,
11
+ filterCatalogItems: n = (l) => l,
12
+ categories: o,
13
+ label: c = "API Library"
11
14
  }) => {
12
- const { searchParams: c, setSearchParams: m } = j(), t = c.get("category");
15
+ const [l, p] = y(), a = l.get("category"), x = w(), g = b({
16
+ queryFn: () => n(r, { auth: x }),
17
+ queryKey: ["catalogItems", x]
18
+ });
13
19
  return /* @__PURE__ */ e.jsxs("section", { className: "pt-[--padding-content-top] pb-[--padding-content-bottom]", children: [
14
- /* @__PURE__ */ e.jsx(f, { children: /* @__PURE__ */ e.jsx("title", { children: o }) }),
20
+ /* @__PURE__ */ e.jsx(v, { children: /* @__PURE__ */ e.jsx("title", { children: c }) }),
15
21
  /* @__PURE__ */ e.jsxs("div", { className: "grid grid-cols-12 gap-12", children: [
16
- /* @__PURE__ */ e.jsx("div", { className: "flex flex-col gap-4 col-span-3 px-4 not-prose sticky top-48", children: /* @__PURE__ */ e.jsx("div", { className: "justify-between", children: i.map((s, a) => /* @__PURE__ */ e.jsxs(x, { children: [
22
+ /* @__PURE__ */ e.jsx("div", { className: "flex flex-col gap-4 col-span-3 not-prose sticky top-48", children: /* @__PURE__ */ e.jsx("div", { className: "max-w-[--side-nav-width] flex flex-col gap-4 justify-between", children: o == null ? void 0 : o.map((s, d) => /* @__PURE__ */ e.jsxs("div", { children: [
17
23
  /* @__PURE__ */ e.jsxs("div", { className: "flex justify-between mb-2.5", children: [
18
24
  /* @__PURE__ */ e.jsx("span", { className: "font-medium text-sm", children: s.label }),
19
- a === 0 && t && /* @__PURE__ */ e.jsx(
25
+ d === 0 && a && /* @__PURE__ */ e.jsx(
20
26
  "button",
21
27
  {
22
28
  type: "button",
23
- className: "text-end text-sm mr-8 text-foreground/60 hover:text-foreground",
24
- onClick: () => m({}),
29
+ className: "text-end text-sm text-foreground/60 hover:text-foreground",
30
+ onClick: () => p({}),
25
31
  children: "Clear"
26
32
  }
27
33
  )
28
34
  ] }),
29
- /* @__PURE__ */ e.jsx("ul", { className: "space-y-1 [&>li]:py-2", children: Array.from(
30
- new Set(
31
- s.tags.map((r) => ({
32
- tag: r,
33
- count: l.filter(
34
- (d) => d.categories.find((p) => p.tags.includes(r))
35
- ).length
36
- })).map(({ tag: r, count: d }) => /* @__PURE__ */ e.jsxs(
37
- "li",
38
- {
39
- className: `flex px-4 rounded-lg -translate-x-4 justify-between text-sm cursor-pointer hover:text-primary transition ${n(r) === t ? "font-medium bg-border/30 rounded" : ""}`,
40
- onClick: () => m({
41
- category: n(s.label + " " + r)
42
- }),
43
- children: [
44
- /* @__PURE__ */ e.jsx("span", { children: r }),
45
- /* @__PURE__ */ e.jsx(
46
- "span",
47
- {
48
- className: `flex items-center justify-center border rounded-md w-8 text-xs font-semibold ${n(r) === t ? "bg-primary border-primary text-primary-foreground" : ""}`,
49
- children: d
50
- }
51
- )
52
- ]
53
- },
54
- n(s.label + " " + r)
55
- ))
56
- )
57
- ) })
35
+ /* @__PURE__ */ e.jsx("ul", { className: "space-y-1 [&>li]:py-2", children: s.tags.map((t) => ({
36
+ tag: t,
37
+ count: r.filter(
38
+ (m) => m.categories.find((i) => i.tags.includes(t))
39
+ ).length
40
+ })).map(({ tag: t, count: m }) => {
41
+ const i = f(s.label, t), u = i === a;
42
+ return /* @__PURE__ */ e.jsxs(
43
+ "li",
44
+ {
45
+ className: h(
46
+ "flex rounded-lg justify-between text-sm cursor-pointer hover:text-primary transition px-[--padding-nav-item] -mx-[--padding-nav-item]",
47
+ u && "bg-border/30 rounded"
48
+ ),
49
+ onClick: () => p({ category: i }),
50
+ children: [
51
+ /* @__PURE__ */ e.jsx("span", { children: t }),
52
+ /* @__PURE__ */ e.jsx(
53
+ "span",
54
+ {
55
+ className: h(
56
+ "flex items-center justify-center border rounded-md w-8 text-xs font-semibold",
57
+ u && "bg-primary border-primary text-primary-foreground"
58
+ ),
59
+ children: m
60
+ }
61
+ )
62
+ ]
63
+ },
64
+ i
65
+ );
66
+ }) })
58
67
  ] }, s.label)) }) }),
59
68
  /* @__PURE__ */ e.jsxs("div", { className: "col-span-9", children: [
60
- /* @__PURE__ */ e.jsx("h3", { className: "mt-0 text-2xl font-bold mb-4", children: o }),
61
- /* @__PURE__ */ e.jsx("div", { className: "grid grid-cols-2 gap-4", children: l.filter(
62
- (s) => !t || s.categories.find(
63
- (a) => a.tags.find(
64
- (r) => n(a.label + " " + r) === t
65
- )
69
+ /* @__PURE__ */ e.jsx("h3", { className: "mt-0 text-2xl font-bold mb-4", children: c }),
70
+ /* @__PURE__ */ e.jsx("div", { className: "grid grid-cols-2 gap-4", children: g.data.filter(
71
+ (s) => !a || s.categories.find(
72
+ (d) => d.tags.find((t) => f(d.label, t) === a)
66
73
  )
67
- ).map((s, a) => /* @__PURE__ */ e.jsx(
68
- h,
74
+ ).map((s) => /* @__PURE__ */ e.jsx(
75
+ N,
69
76
  {
70
77
  to: {
71
78
  pathname: `/${s.path}`,
72
- search: t ? `category=${t}` : ""
79
+ search: a ? `category=${a}` : ""
73
80
  },
74
81
  className: "no-underline hover:!text-foreground",
75
- children: /* @__PURE__ */ e.jsxs(
76
- "div",
77
- {
78
- className: "border h-full rounded p-4 flex flex-col gap-2 cursor-pointer hover:bg-border/20 font-normal",
79
- children: [
80
- /* @__PURE__ */ e.jsx("span", { className: "font-semibold", children: s.label }),
81
- /* @__PURE__ */ e.jsx(
82
- u,
83
- {
84
- className: "text-sm whitespace-pre-wrap mb-6 line-clamp-2",
85
- content: s.description
86
- }
87
- )
88
- ]
89
- },
90
- a
91
- )
82
+ children: /* @__PURE__ */ e.jsxs("div", { className: "border h-full rounded p-4 flex flex-col gap-2 cursor-pointer hover:bg-border/20 font-normal", children: [
83
+ /* @__PURE__ */ e.jsx("span", { className: "font-semibold", children: s.label }),
84
+ /* @__PURE__ */ e.jsx(
85
+ C,
86
+ {
87
+ className: "text-sm whitespace-pre-wrap mb-6 line-clamp-2",
88
+ content: s.description
89
+ }
90
+ )
91
+ ] })
92
92
  },
93
93
  s.path
94
94
  )) })
95
95
  ] })
96
96
  ] })
97
97
  ] });
98
- }, k = ({
99
- navigationId: l,
100
- items: i,
98
+ }, M = ({
99
+ navigationId: r,
100
+ items: n,
101
101
  label: o,
102
- categories: c
102
+ categories: c,
103
+ filterCatalogItems: l
103
104
  }) => ({
104
105
  getRoutes: () => [
105
106
  {
106
- path: l,
107
+ path: r,
107
108
  element: /* @__PURE__ */ e.jsx(
108
- b,
109
+ k,
109
110
  {
110
111
  label: o,
111
- items: i,
112
+ items: n,
113
+ filterCatalogItems: l,
112
114
  categories: c ?? []
113
115
  }
114
116
  )
@@ -116,6 +118,6 @@ const b = ({
116
118
  ]
117
119
  });
118
120
  export {
119
- k as apiCatalogPlugin
121
+ M as apiCatalogPlugin
120
122
  };
121
123
  //# sourceMappingURL=zudoku.plugin-api-catalog.js.map
@@ -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 slugify from \"@sindresorhus/slugify\";\nimport { Fragment } from \"react\";\nimport { Head, Link } from \"zudoku/components\";\nimport { Markdown } from \"../../components/Markdown.js\";\nimport { useExposedProps } from \"../../util/useExposedProps.js\";\nimport type { ApiCatalogItem, CatalogCategory } from \"./index.js\";\n\nexport const Catalog = ({\n items,\n categories,\n label = \"API Library\",\n}: {\n label: string;\n items: ApiCatalogItem[];\n categories: CatalogCategory[];\n}) => {\n const { searchParams, setSearchParams } = useExposedProps();\n const activeCategory = searchParams.get(\"category\");\n return (\n <section className=\"pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <Head>\n <title>{label}</title>\n </Head>\n <div className=\"grid grid-cols-12 gap-12\">\n <div className=\"flex flex-col gap-4 col-span-3 px-4 not-prose sticky top-48\">\n <div className=\"justify-between\">\n {categories.map((category, idx) => (\n <Fragment key={category.label}>\n <div className=\"flex justify-between mb-2.5\">\n <span className=\"font-medium text-sm\">{category.label}</span>\n {idx === 0 && activeCategory && (\n <button\n type=\"button\"\n className=\"text-end text-sm mr-8 text-foreground/60 hover:text-foreground\"\n onClick={() => setSearchParams({})}\n >\n Clear\n </button>\n )}\n </div>\n <ul className=\"space-y-1 [&>li]:py-2\">\n {Array.from(\n new Set(\n category.tags\n .map((tag) => ({\n tag,\n count: items.filter((api) =>\n api.categories.find((c) => c.tags.includes(tag)),\n ).length,\n }))\n .map(({ tag, count }) => (\n <li\n key={slugify(category.label + \" \" + tag)}\n className={`flex px-4 rounded-lg -translate-x-4 justify-between text-sm cursor-pointer hover:text-primary transition ${\n slugify(tag) === activeCategory\n ? \"font-medium bg-border/30 rounded\"\n : \"\"\n }`}\n onClick={() =>\n setSearchParams({\n category: slugify(category.label + \" \" + tag),\n })\n }\n >\n <span>{tag}</span>\n <span\n className={`flex items-center justify-center border rounded-md w-8 text-xs font-semibold ${\n slugify(tag) === activeCategory\n ? \"bg-primary border-primary text-primary-foreground\"\n : \"\"\n }`}\n >\n {count}\n </span>\n </li>\n )),\n ),\n )}\n </ul>\n </Fragment>\n ))}\n </div>\n </div>\n <div className=\"col-span-9\">\n <h3 className=\"mt-0 text-2xl font-bold mb-4\">{label}</h3>\n\n <div className=\"grid grid-cols-2 gap-4\">\n {items\n .filter(\n (api) =>\n !activeCategory ||\n api.categories.find((c) =>\n c.tags.find(\n (t) => slugify(c.label + \" \" + t) === activeCategory,\n ),\n ),\n )\n .map((api, i) => (\n <Link\n to={{\n pathname: `/${api.path}`,\n search: activeCategory ? `category=${activeCategory}` : \"\",\n }}\n className=\"no-underline hover:!text-foreground\"\n key={api.path}\n >\n <div\n className=\"border h-full rounded p-4 flex flex-col gap-2 cursor-pointer hover:bg-border/20 font-normal\"\n key={i}\n >\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 </div>\n </section>\n );\n};\n","import type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { Catalog } from \"./Catalog.js\";\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 navigationId: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n};\n\nexport const apiCatalogPlugin = ({\n navigationId,\n items,\n label,\n categories,\n}: {\n navigationId: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n}): ZudokuPlugin => {\n return {\n getRoutes: () => {\n return [\n {\n path: navigationId,\n element: (\n <Catalog\n label={label}\n items={items}\n categories={categories ?? []}\n />\n ),\n },\n ];\n },\n };\n};\n"],"names":["Catalog","items","categories","label","searchParams","setSearchParams","useExposedProps","activeCategory","jsxs","jsx","Head","category","idx","Fragment","tag","api","c","count","slugify","t","i","Link","Markdown","apiCatalogPlugin","navigationId"],"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 slugify from \"@sindresorhus/slugify\";\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useSearchParams } from \"react-router\";\nimport { Head, Link } from \"zudoku/components\";\nimport { useAuthState } from \"../../authentication/state.js\";\nimport { Markdown } from \"../../components/Markdown.js\";\nimport { cn } from \"../../util/cn.js\";\nimport type { ApiCatalogPluginOptions } from \"./index.js\";\n\nconst getKey = (category: string, tag: string) => slugify(`${category}-${tag}`);\n\nexport const Catalog = ({\n items,\n filterCatalogItems = (items) => items,\n categories,\n label = \"API Library\",\n}: Omit<ApiCatalogPluginOptions, \"navigationId\">) => {\n const [searchParams, setSearchParams] = useSearchParams();\n const activeCategory = searchParams.get(\"category\");\n const auth = useAuthState();\n\n const catalogItems = useSuspenseQuery({\n queryFn: () => filterCatalogItems(items, { auth }),\n queryKey: [\"catalogItems\", auth],\n });\n\n return (\n <section className=\"pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <Head>\n <title>{label}</title>\n </Head>\n <div className=\"grid grid-cols-12 gap-12\">\n <div className=\"flex flex-col gap-4 col-span-3 not-prose sticky top-48\">\n <div className=\"max-w-[--side-nav-width] flex flex-col gap-4 justify-between\">\n {categories?.map((category, idx) => (\n <div key={category.label}>\n <div className=\"flex justify-between mb-2.5\">\n <span className=\"font-medium text-sm\">{category.label}</span>\n {idx === 0 && activeCategory && (\n <button\n type=\"button\"\n className=\"text-end text-sm text-foreground/60 hover:text-foreground\"\n onClick={() => setSearchParams({})}\n >\n Clear\n </button>\n )}\n </div>\n <ul className=\"space-y-1 [&>li]:py-2\">\n {category.tags\n .map((tag) => ({\n tag,\n count: items.filter((api) =>\n api.categories.find((c) => c.tags.includes(tag)),\n ).length,\n }))\n .map(({ tag, count }) => {\n const slug = getKey(category.label, tag);\n const isActive = slug === activeCategory;\n\n return (\n <li\n key={slug}\n className={cn(\n \"flex rounded-lg justify-between text-sm cursor-pointer hover:text-primary transition px-[--padding-nav-item] -mx-[--padding-nav-item]\",\n isActive && \"bg-border/30 rounded\",\n )}\n onClick={() => setSearchParams({ category: slug })}\n >\n <span>{tag}</span>\n <span\n className={cn(\n \"flex items-center justify-center border rounded-md w-8 text-xs font-semibold\",\n isActive &&\n \"bg-primary border-primary text-primary-foreground\",\n )}\n >\n {count}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </div>\n </div>\n <div className=\"col-span-9\">\n <h3 className=\"mt-0 text-2xl font-bold mb-4\">{label}</h3>\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={{\n pathname: `/${api.path}`,\n search: activeCategory ? `category=${activeCategory}` : \"\",\n }}\n className=\"no-underline hover:!text-foreground\"\n key={api.path}\n >\n <div className=\"border h-full rounded 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 </div>\n </section>\n );\n};\n","import type { AuthState } from \"../../authentication/state.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { Catalog } from \"./Catalog.js\";\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 navigationId: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n filterCatalogItems?: filterCatalogItems;\n};\n\nexport type CatalogContext<ProviderData = unknown> = {\n auth: AuthState<ProviderData>;\n};\n\nexport type filterCatalogItems<ProviderData = unknown> = (\n items: ApiCatalogItem[],\n { auth }: CatalogContext<ProviderData>,\n) => ApiCatalogItem[];\n\nexport const apiCatalogPlugin = ({\n navigationId,\n items,\n label,\n categories,\n filterCatalogItems,\n}: {\n navigationId: string;\n label: string;\n categories?: CatalogCategory[];\n items: ApiCatalogItem[];\n filterCatalogItems?: filterCatalogItems;\n}): ZudokuPlugin => {\n return {\n getRoutes: () => {\n return [\n {\n path: navigationId,\n element: (\n <Catalog\n label={label}\n items={items}\n filterCatalogItems={filterCatalogItems}\n categories={categories ?? []}\n />\n ),\n },\n ];\n },\n };\n};\n"],"names":["getKey","category","tag","slugify","Catalog","items","filterCatalogItems","categories","label","searchParams","setSearchParams","useSearchParams","activeCategory","auth","useAuthState","catalogItems","useSuspenseQuery","jsxs","jsx","Head","idx","api","c","count","slug","isActive","cn","Link","Markdown","apiCatalogPlugin","navigationId"],"mappings":"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"}
@@ -2,13 +2,13 @@ import { j as e } from "./jsx-runtime-Dx-03ztt.js";
2
2
  import { RotateCwIcon as g, TrashIcon as f, EyeOffIcon as j, EyeIcon as v, CheckIcon as w, CopyIcon as b, FileKey2Icon as K } from "lucide-react";
3
3
  import { D as k, S as m, R as N } from "./SlotletProvider-pfc9oejW.js";
4
4
  import { i as c } from "./invariant-Caa8-XvF.js";
5
- import { u as d, S as I, a as S, b as A, c as C, d as E, e as x } from "./Select-Bb_Hqc70.js";
5
+ import { u as d, S as I, a as S, b as A, c as C, d as E, e as x } from "./Select-D3XuKKuH.js";
6
6
  import { a as P } from "./index.esm-BnnBRKJX.js";
7
7
  import { a as D, L as u, O as R } from "./chunk-D52XG6IA-Dl7HLe6j.js";
8
- import { u as y, d as q, g as O } from "./utils-R0j3Raw1.js";
8
+ import { a as y, e as q, u as O } from "./utils-B4O1uet5.js";
9
9
  import { Button as l } from "./ui/Button.js";
10
10
  import { Input as z } from "./ui/Input.js";
11
- import { u as F } from "./hook-DMHiUaIV.js";
11
+ import { u as F } from "./hook-DgGeo5iL.js";
12
12
  import { useState as p } from "react";
13
13
  import { c as T } from "./cn-qaFjX9_3.js";
14
14
  const L = ({ service: t }) => {
@@ -74,7 +74,7 @@ const C = (n) => ({
74
74
  const h = {
75
75
  path: r,
76
76
  lazy: async () => {
77
- const { MdxPage: l } = await import("./MdxPage-CBa4X6L5.js"), { default: p, ...g } = await a();
77
+ const { MdxPage: l } = await import("./MdxPage-CPBw4_lf.js"), { default: p, ...g } = await a();
78
78
  return {
79
79
  element: /* @__PURE__ */ P.jsx(
80
80
  l,
@@ -1,9 +1,9 @@
1
1
  import "./jsx-runtime-Dx-03ztt.js";
2
2
  import "./chunk-D52XG6IA-Dl7HLe6j.js";
3
- import { o as a } from "./index-B6rTMjdI.js";
4
- import "./utils-R0j3Raw1.js";
3
+ import { o as a } from "./index-C8ubT49C.js";
4
+ import "./utils-B4O1uet5.js";
5
5
  import "lucide-react";
6
- import "./hook-DMHiUaIV.js";
6
+ import "./hook-DgGeo5iL.js";
7
7
  import "./ui/Button.js";
8
8
  export {
9
9
  a as openApiPlugin
@@ -1,7 +1,7 @@
1
- import { j as n } from "./jsx-runtime-Dx-03ztt.js";
2
- import { useRef as a, useMemo as p, useEffect as c } from "react";
3
- import { C as u } from "./ClientOnly-E7hGysn1.js";
4
- const d = {
1
+ import { j as i } from "./jsx-runtime-Dx-03ztt.js";
2
+ import { useRef as l, useState as f, useMemo as m, useEffect as u } from "react";
3
+ import { C as g } from "./ClientOnly-E7hGysn1.js";
4
+ const h = {
5
5
  theme: {
6
6
  components: {
7
7
  AIChatPageWrapper: {
@@ -19,37 +19,45 @@ const d = {
19
19
  }
20
20
  }
21
21
  }
22
- }, m = {}, g = ({
23
- prefilledQuery: t,
22
+ }, k = {}, I = ({
23
+ prefilledQuery: r,
24
24
  isOpen: e,
25
- onClose: r,
26
- settings: i
25
+ onClose: n,
26
+ settings: p
27
27
  }) => {
28
- const s = a(null), o = p(
28
+ const o = l(null), c = l(null), [s, d] = f(
29
+ typeof Inkeep < "u"
30
+ ), a = m(
29
31
  () => ({
30
32
  componentType: "CustomTrigger",
31
- targetElement: s.current,
33
+ targetElement: o.current,
32
34
  properties: {
33
35
  isOpen: e,
34
- onClose: r,
36
+ onClose: n,
35
37
  onOpen: void 0,
36
- baseSettings: { ...d, ...i },
38
+ baseSettings: { ...h, ...p },
37
39
  searchSettings: {
38
- prefilledQuery: t || void 0
40
+ prefilledQuery: r || void 0
39
41
  },
40
- aiChatSettings: m
42
+ aiChatSettings: k
41
43
  }
42
44
  }),
43
- [e, r, t, i, s]
45
+ [e, n, r, p, o]
44
46
  );
45
- return c(() => {
46
- Inkeep().embed(o).render({
47
- ...o,
48
- isOpen: e
49
- });
50
- }), /* @__PURE__ */ n.jsx("div", { ref: s });
51
- }, j = (t) => ({
52
- getHead: () => /* @__PURE__ */ n.jsx(
47
+ return u(() => {
48
+ if (s) return;
49
+ const t = setInterval(() => {
50
+ typeof Inkeep < "u" && (d(!0), clearInterval(t));
51
+ }, 100);
52
+ return () => clearInterval(t);
53
+ }, [s]), u(() => {
54
+ !s || c.current || (c.current = Inkeep().embed(a));
55
+ }, [a, s]), u(() => {
56
+ var t;
57
+ (t = c.current) == null || t.render({ ...a, isOpen: e });
58
+ }, [a, e]), /* @__PURE__ */ i.jsx("div", { ref: o });
59
+ }, x = (r) => ({
60
+ getHead: () => /* @__PURE__ */ i.jsx(
53
61
  "script",
54
62
  {
55
63
  type: "module",
@@ -59,10 +67,10 @@ const d = {
59
67
  ),
60
68
  renderSearch: ({
61
69
  isOpen: e,
62
- onClose: r
63
- }) => /* @__PURE__ */ n.jsx(u, { children: /* @__PURE__ */ n.jsx(g, { isOpen: e, onClose: r, settings: t }) })
70
+ onClose: n
71
+ }) => /* @__PURE__ */ i.jsx(g, { children: /* @__PURE__ */ i.jsx(I, { isOpen: e, onClose: n, settings: r }) })
64
72
  });
65
73
  export {
66
- j as inkeepSearchPlugin
74
+ x as inkeepSearchPlugin
67
75
  };
68
76
  //# sourceMappingURL=zudoku.plugin-search-inkeep.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-search-inkeep.js","sources":["../src/lib/plugins/search-inkeep/inkeep.ts","../src/lib/plugins/search-inkeep/index.tsx"],"sourcesContent":["const baseSettings = {\n theme: {\n components: {\n AIChatPageWrapper: {\n defaultProps: {\n size: \"shrink-vertically\",\n variant: \"no-shadow\",\n },\n },\n SearchBarTrigger: {\n defaultProps: {\n size: \"expand\",\n variant: \"subtle\", // Choose from 'emphasized' or 'subtle'\n },\n },\n },\n },\n} as const;\n\nconst modalSettings = {};\n\nconst searchSettings = {};\n\nconst aiChatSettings = {};\n\nexport { aiChatSettings, baseSettings, modalSettings, searchSettings };\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { ClientOnly } from \"../../components/ClientOnly.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { aiChatSettings, baseSettings } from \"./inkeep.js\";\n\ninterface PluginInkeepBaseSettings {\n apiKey?: string;\n integrationId: string;\n organizationId: string;\n organizationDisplayName?: string;\n primaryBrandColor: string;\n}\n\ninterface InkeepEmbedConfig {\n componentType: string;\n targetElement: HTMLElement;\n properties: unknown;\n}\n\ninterface InkeepWidget {\n render: (config: InkeepEmbedConfig & { isOpen: boolean }) => void;\n}\n\ndeclare global {\n let Inkeep: () => {\n embed: (config: InkeepEmbedConfig) => InkeepWidget;\n };\n}\n\nconst InkeepSearch = ({\n prefilledQuery,\n isOpen,\n onClose,\n settings,\n}: {\n isOpen: boolean;\n onClose: () => void;\n prefilledQuery?: string | null;\n settings: PluginInkeepBaseSettings;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n const config: InkeepEmbedConfig = useMemo(\n () => ({\n componentType: \"CustomTrigger\",\n targetElement: ref.current!,\n properties: {\n isOpen,\n onClose,\n onOpen: undefined,\n baseSettings: { ...baseSettings, ...settings },\n searchSettings: {\n prefilledQuery: prefilledQuery || undefined,\n },\n aiChatSettings,\n },\n }),\n [isOpen, onClose, prefilledQuery, settings, ref],\n );\n\n useEffect(() => {\n const inkeepWidget = Inkeep().embed(config);\n inkeepWidget.render({\n ...config,\n isOpen,\n });\n });\n\n return <div ref={ref} />;\n};\n\nexport const inkeepSearchPlugin = (\n settings: PluginInkeepBaseSettings,\n): ZudokuPlugin => {\n return {\n getHead: () => {\n return (\n <script\n type=\"module\"\n src=\"https://unpkg.com/@inkeep/uikit-js@0.3.19/dist/embed.js\"\n defer\n ></script>\n );\n },\n renderSearch: ({\n isOpen,\n onClose,\n }: {\n isOpen: boolean;\n onClose: () => void;\n }) => {\n return (\n <ClientOnly>\n <InkeepSearch isOpen={isOpen} onClose={onClose} settings={settings} />\n </ClientOnly>\n );\n },\n };\n};\n"],"names":["baseSettings","aiChatSettings","InkeepSearch","prefilledQuery","isOpen","onClose","settings","ref","useRef","config","useMemo","useEffect","jsx","inkeepSearchPlugin","ClientOnly"],"mappings":";;;AAAA,MAAMA,IAAe;AAAA,EACnB,OAAO;AAAA,IACL,YAAY;AAAA,MACV,mBAAmB;AAAA,QACjB,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAAA,MAEb;AAAA,MACA,kBAAkB;AAAA,QAChB,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA;AAAA,QAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEJ,GAMMC,IAAiB,CAAC,GCMlBC,IAAe,CAAC;AAAA,EACpB,gBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AACF,MAKM;AACE,QAAAC,IAAMC,EAAuB,IAAI,GAEjCC,IAA4BC;AAAA,IAChC,OAAO;AAAA,MACL,eAAe;AAAA,MACf,eAAeH,EAAI;AAAA,MACnB,YAAY;AAAA,QACV,QAAAH;AAAA,QACA,SAAAC;AAAA,QACA,QAAQ;AAAA,QACR,cAAc,EAAE,GAAGL,GAAc,GAAGM,EAAS;AAAA,QAC7C,gBAAgB;AAAA,UACd,gBAAgBH,KAAkB;AAAA,QACpC;AAAA,QACA,gBAAAF;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,CAACG,GAAQC,GAASF,GAAgBG,GAAUC,CAAG;AAAA,EACjD;AAEA,SAAAI,EAAU,MAAM;AAEd,IADqB,SAAS,MAAMF,CAAM,EAC7B,OAAO;AAAA,MAClB,GAAGA;AAAA,MACH,QAAAL;AAAA,IAAA,CACD;AAAA,EAAA,CACF,GAEMQ,gBAAAA,MAAC,SAAI,KAAAL,GAAU;AACxB,GAEaM,IAAqB,CAChCP,OAEO;AAAA,EACL,SAAS,MAELM,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,KAAI;AAAA,MACJ,OAAK;AAAA,IAAA;AAAA,EACN;AAAA,EAGL,cAAc,CAAC;AAAA,IACb,QAAAR;AAAA,IACA,SAAAC;AAAA,EAAA,4BAMGS,GACC,EAAA,UAAAF,gBAAAA,EAAA,IAACV,KAAa,QAAAE,GAAgB,SAAAC,GAAkB,UAAAC,GAAoB,EACtE,CAAA;AAGN;"}
1
+ {"version":3,"file":"zudoku.plugin-search-inkeep.js","sources":["../src/lib/plugins/search-inkeep/inkeep.ts","../src/lib/plugins/search-inkeep/index.tsx"],"sourcesContent":["const baseSettings = {\n theme: {\n components: {\n AIChatPageWrapper: {\n defaultProps: {\n size: \"shrink-vertically\",\n variant: \"no-shadow\",\n },\n },\n SearchBarTrigger: {\n defaultProps: {\n size: \"expand\",\n variant: \"subtle\", // Choose from 'emphasized' or 'subtle'\n },\n },\n },\n },\n} as const;\n\nconst modalSettings = {};\n\nconst searchSettings = {};\n\nconst aiChatSettings = {};\n\nexport { aiChatSettings, baseSettings, modalSettings, searchSettings };\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { ClientOnly } from \"../../components/ClientOnly.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { aiChatSettings, baseSettings } from \"./inkeep.js\";\n\ninterface PluginInkeepBaseSettings {\n apiKey?: string;\n integrationId: string;\n organizationId: string;\n organizationDisplayName?: string;\n primaryBrandColor: string;\n}\n\ninterface InkeepEmbedConfig {\n componentType: string;\n targetElement: HTMLElement;\n properties: unknown;\n}\n\ninterface InkeepWidget {\n render: (config: InkeepEmbedConfig & { isOpen: boolean }) => void;\n}\n\ndeclare global {\n let Inkeep: () => {\n embed: (config: InkeepEmbedConfig) => InkeepWidget;\n };\n}\n\nconst InkeepSearch = ({\n prefilledQuery,\n isOpen,\n onClose,\n settings,\n}: {\n isOpen: boolean;\n onClose: () => void;\n prefilledQuery?: string | null;\n settings: PluginInkeepBaseSettings;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const widgetRef = useRef<InkeepWidget | null>(null);\n const [isInkeepAvailable, setIsInkeepAvailable] = useState(\n typeof Inkeep !== \"undefined\",\n );\n\n const config: InkeepEmbedConfig = useMemo(\n () => ({\n componentType: \"CustomTrigger\",\n targetElement: ref.current!,\n properties: {\n isOpen,\n onClose,\n onOpen: undefined,\n baseSettings: { ...baseSettings, ...settings },\n searchSettings: {\n prefilledQuery: prefilledQuery || undefined,\n },\n aiChatSettings,\n },\n }),\n [isOpen, onClose, prefilledQuery, settings, ref],\n );\n\n useEffect(() => {\n if (isInkeepAvailable) return;\n\n const checkInkeep = setInterval(() => {\n if (typeof Inkeep !== \"undefined\") {\n setIsInkeepAvailable(true);\n clearInterval(checkInkeep);\n }\n }, 100);\n\n return () => clearInterval(checkInkeep);\n }, [isInkeepAvailable]);\n\n useEffect(() => {\n if (!isInkeepAvailable || widgetRef.current) return;\n\n widgetRef.current = Inkeep().embed(config);\n }, [config, isInkeepAvailable]);\n\n useEffect(() => {\n widgetRef.current?.render({ ...config, isOpen });\n }, [config, isOpen]);\n\n return <div ref={ref} />;\n};\n\nexport const inkeepSearchPlugin = (\n settings: PluginInkeepBaseSettings,\n): ZudokuPlugin => {\n return {\n getHead: () => {\n return (\n <script\n type=\"module\"\n src=\"https://unpkg.com/@inkeep/uikit-js@0.3.19/dist/embed.js\"\n defer\n />\n );\n },\n renderSearch: ({\n isOpen,\n onClose,\n }: {\n isOpen: boolean;\n onClose: () => void;\n }) => {\n return (\n <ClientOnly>\n <InkeepSearch isOpen={isOpen} onClose={onClose} settings={settings} />\n </ClientOnly>\n );\n },\n };\n};\n"],"names":["baseSettings","aiChatSettings","InkeepSearch","prefilledQuery","isOpen","onClose","settings","ref","useRef","widgetRef","isInkeepAvailable","setIsInkeepAvailable","useState","config","useMemo","useEffect","checkInkeep","_a","jsx","inkeepSearchPlugin","ClientOnly"],"mappings":";;;AAAA,MAAMA,IAAe;AAAA,EACnB,OAAO;AAAA,IACL,YAAY;AAAA,MACV,mBAAmB;AAAA,QACjB,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAAA,MAEb;AAAA,MACA,kBAAkB;AAAA,QAChB,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA;AAAA,QAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEJ,GAMMC,IAAiB,CAAC,GCMlBC,IAAe,CAAC;AAAA,EACpB,gBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AACF,MAKM;AACE,QAAAC,IAAMC,EAAuB,IAAI,GACjCC,IAAYD,EAA4B,IAAI,GAC5C,CAACE,GAAmBC,CAAoB,IAAIC;AAAA,IAChD,OAAO,SAAW;AAAA,EACpB,GAEMC,IAA4BC;AAAA,IAChC,OAAO;AAAA,MACL,eAAe;AAAA,MACf,eAAeP,EAAI;AAAA,MACnB,YAAY;AAAA,QACV,QAAAH;AAAA,QACA,SAAAC;AAAA,QACA,QAAQ;AAAA,QACR,cAAc,EAAE,GAAGL,GAAc,GAAGM,EAAS;AAAA,QAC7C,gBAAgB;AAAA,UACd,gBAAgBH,KAAkB;AAAA,QACpC;AAAA,QACA,gBAAAF;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,CAACG,GAAQC,GAASF,GAAgBG,GAAUC,CAAG;AAAA,EACjD;AAEA,SAAAQ,EAAU,MAAM;AACd,QAAIL,EAAmB;AAEjB,UAAAM,IAAc,YAAY,MAAM;AAChC,MAAA,OAAO,SAAW,QACpBL,EAAqB,EAAI,GACzB,cAAcK,CAAW;AAAA,OAE1B,GAAG;AAEC,WAAA,MAAM,cAAcA,CAAW;AAAA,EAAA,GACrC,CAACN,CAAiB,CAAC,GAEtBK,EAAU,MAAM;AACV,IAAA,CAACL,KAAqBD,EAAU,YAEpCA,EAAU,UAAU,SAAS,MAAMI,CAAM;AAAA,EAAA,GACxC,CAACA,GAAQH,CAAiB,CAAC,GAE9BK,EAAU,MAAM;;AACd,KAAAE,IAAAR,EAAU,YAAV,QAAAQ,EAAmB,OAAO,EAAE,GAAGJ,GAAQ,QAAAT;EAAQ,GAC9C,CAACS,GAAQT,CAAM,CAAC,GAEZc,gBAAAA,MAAC,SAAI,KAAAX,GAAU;AACxB,GAEaY,IAAqB,CAChCb,OAEO;AAAA,EACL,SAAS,MAELY,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,KAAI;AAAA,MACJ,OAAK;AAAA,IAAA;AAAA,EACP;AAAA,EAGJ,cAAc,CAAC;AAAA,IACb,QAAAd;AAAA,IACA,SAAAC;AAAA,EAAA,4BAMGe,GACC,EAAA,UAAAF,gBAAAA,EAAA,IAAChB,KAAa,QAAAE,GAAgB,SAAAC,GAAkB,UAAAC,GAAoB,EACtE,CAAA;AAGN;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.23.3",
3
+ "version": "0.23.4",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -124,7 +124,7 @@
124
124
  "@pothos/core": "3.41.0",
125
125
  "@radix-ui/react-accordion": "1.2.1",
126
126
  "@radix-ui/react-alert-dialog": "1.1.4",
127
- "@radix-ui/react-aspect-ratio": "1.1.0",
127
+ "@radix-ui/react-aspect-ratio": "1.1.1",
128
128
  "@radix-ui/react-checkbox": "1.1.2",
129
129
  "@radix-ui/react-collapsible": "1.1.1",
130
130
  "@radix-ui/react-dialog": "1.1.2",
@@ -141,7 +141,7 @@
141
141
  "@radix-ui/react-switch": "1.1.1",
142
142
  "@radix-ui/react-tabs": "1.1.1",
143
143
  "@radix-ui/react-toggle": "1.1.0",
144
- "@radix-ui/react-toggle-group": "1.1.0",
144
+ "@radix-ui/react-toggle-group": "1.1.1",
145
145
  "@radix-ui/react-tooltip": "1.1.4",
146
146
  "@radix-ui/react-visually-hidden": "1",
147
147
  "@sentry/node": "8.42.0",
@@ -165,7 +165,7 @@
165
165
  "estree-util-value-to-estree": "3.2.1",
166
166
  "express": "4.21.2",
167
167
  "glob": "11.0.0",
168
- "graphql": "16.9.0",
168
+ "graphql": "16.10.0",
169
169
  "graphql-type-json": "0.3.2",
170
170
  "graphql-yoga": "5.10.4",
171
171
  "gray-matter": "4.0.3",
@@ -204,7 +204,7 @@
204
204
  "sitemap": "8.0.0",
205
205
  "spin-delay": "2.0.1",
206
206
  "strip-ansi": "7.1.0",
207
- "tailwind-merge": "2.5.5",
207
+ "tailwind-merge": "2.6.0",
208
208
  "tailwindcss": "3.4.16",
209
209
  "tsx": "^4.19.2",
210
210
  "ulidx": "2.4.1",
@@ -12,8 +12,9 @@ import { useAuthState, UserProfile } from "../state.js";
12
12
 
13
13
  const CODE_VERIFIER_KEY = "code-verifier";
14
14
 
15
- interface TokenState {
15
+ export interface OpenIdProviderData {
16
16
  accessToken: string;
17
+ idToken?: string;
17
18
  refreshToken?: string;
18
19
  expiresOn: Date;
19
20
  tokenType: string;
@@ -101,9 +102,10 @@ export class OpenIDAuthenticationProvider implements AuthenticationProvider {
101
102
  throw new AuthorizationError("No expires_in in response");
102
103
  }
103
104
 
104
- const tokens: TokenState = {
105
+ const tokens: OpenIdProviderData = {
105
106
  accessToken: response.access_token,
106
107
  refreshToken: response.refresh_token,
108
+ idToken: response.id_token,
107
109
  expiresOn: new Date(Date.now() + response.expires_in * 1000),
108
110
  tokenType: response.token_type,
109
111
  };
@@ -201,7 +203,7 @@ export class OpenIDAuthenticationProvider implements AuthenticationProvider {
201
203
  if (!providerData) {
202
204
  throw new AuthorizationError("User is not authenticated");
203
205
  }
204
- const tokenState = providerData as TokenState;
206
+ const tokenState = providerData as OpenIdProviderData;
205
207
 
206
208
  if (new Date(tokenState.expiresOn) < new Date()) {
207
209
  if (!tokenState.refreshToken) {