zudoku 0.23.2 → 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.
- package/dist/config/validators/common.d.ts +45 -11
- package/dist/config/validators/common.js +2 -1
- package/dist/config/validators/common.js.map +1 -1
- package/dist/config/validators/validate.d.ts +19 -5
- package/dist/lib/authentication/providers/openid.d.ts +7 -0
- package/dist/lib/authentication/providers/openid.js +1 -0
- package/dist/lib/authentication/providers/openid.js.map +1 -1
- package/dist/lib/plugins/api-catalog/Catalog.d.ts +2 -6
- package/dist/lib/plugins/api-catalog/Catalog.js +22 -15
- package/dist/lib/plugins/api-catalog/Catalog.js.map +1 -1
- package/dist/lib/plugins/api-catalog/index.d.ts +8 -1
- package/dist/lib/plugins/api-catalog/index.js +2 -2
- package/dist/lib/plugins/api-catalog/index.js.map +1 -1
- package/dist/lib/plugins/search-inkeep/index.js +21 -7
- package/dist/lib/plugins/search-inkeep/index.js.map +1 -1
- package/dist/vite/plugin-api.js +12 -7
- package/dist/vite/plugin-api.js.map +1 -1
- package/lib/{AuthenticationPlugin-DQy635W9.js → AuthenticationPlugin-fB7viE7A.js} +2 -2
- package/lib/{AuthenticationPlugin-DQy635W9.js.map → AuthenticationPlugin-fB7viE7A.js.map} +1 -1
- package/lib/{MdxPage-CBa4X6L5.js → MdxPage-CPBw4_lf.js} +18 -18
- package/lib/{MdxPage-CBa4X6L5.js.map → MdxPage-CPBw4_lf.js.map} +1 -1
- package/lib/OperationList-C7ac3kR5.js +5014 -0
- package/lib/OperationList-C7ac3kR5.js.map +1 -0
- package/lib/{Select-Bb_Hqc70.js → Select-D3XuKKuH.js} +3 -3
- package/lib/{Select-Bb_Hqc70.js.map → Select-D3XuKKuH.js.map} +1 -1
- package/lib/assets/{worker-BmEAZjUP.js → worker-D2kRl-cG.js} +1487 -1436
- package/lib/assets/worker-D2kRl-cG.js.map +1 -0
- package/lib/cn-qaFjX9_3.js.map +1 -1
- package/lib/{createServer-BVFp6Bl3.js → createServer-69sLlmQA.js} +1968 -1917
- package/lib/createServer-69sLlmQA.js.map +1 -0
- package/lib/{hook-DMHiUaIV.js → hook-DgGeo5iL.js} +2 -2
- package/lib/{hook-DMHiUaIV.js.map → hook-DgGeo5iL.js.map} +1 -1
- package/lib/{index-B6rTMjdI.js → index-C8ubT49C.js} +6 -6
- package/lib/{index-B6rTMjdI.js.map → index-C8ubT49C.js.map} +1 -1
- package/lib/{utils-R0j3Raw1.js → utils-B4O1uet5.js} +8 -8
- package/lib/{utils-R0j3Raw1.js.map → utils-B4O1uet5.js.map} +1 -1
- package/lib/zudoku.auth-clerk.js +1 -1
- package/lib/zudoku.auth-openid.js +70 -69
- package/lib/zudoku.auth-openid.js.map +1 -1
- package/lib/zudoku.components.js +2 -2
- package/lib/zudoku.openapi-worker.js +1 -1
- package/lib/zudoku.plugin-api-catalog.js +80 -78
- package/lib/zudoku.plugin-api-catalog.js.map +1 -1
- package/lib/zudoku.plugin-api-keys.js +3 -3
- package/lib/zudoku.plugin-markdown.js +1 -1
- package/lib/zudoku.plugin-openapi.js +3 -3
- package/lib/zudoku.plugin-search-inkeep.js +34 -26
- package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
- package/package.json +8 -8
- package/src/lib/authentication/providers/openid.tsx +5 -3
- package/src/lib/plugins/api-catalog/Catalog.tsx +59 -60
- package/src/lib/plugins/api-catalog/index.tsx +14 -0
- package/src/lib/plugins/search-inkeep/index.tsx +27 -8
- package/lib/OperationList-Bj-6EKhp.js +0 -4889
- package/lib/OperationList-Bj-6EKhp.js.map +0 -1
- package/lib/assets/worker-BmEAZjUP.js.map +0 -1
- package/lib/createServer-BVFp6Bl3.js.map +0 -1
package/lib/zudoku.components.js
CHANGED
|
@@ -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,
|
|
24
|
-
import { M as It, u as te } from "./hook-
|
|
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";
|
|
@@ -1,114 +1,116 @@
|
|
|
1
1
|
import { j as e } from "./jsx-runtime-Dx-03ztt.js";
|
|
2
|
-
import { s as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { u as
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
25
|
+
d === 0 && a && /* @__PURE__ */ e.jsx(
|
|
20
26
|
"button",
|
|
21
27
|
{
|
|
22
28
|
type: "button",
|
|
23
|
-
className: "text-end text-sm
|
|
24
|
-
onClick: () =>
|
|
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:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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:
|
|
61
|
-
/* @__PURE__ */ e.jsx("div", { className: "grid grid-cols-2 gap-4", children:
|
|
62
|
-
(s) => !
|
|
63
|
-
(
|
|
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
|
|
68
|
-
|
|
74
|
+
).map((s) => /* @__PURE__ */ e.jsx(
|
|
75
|
+
N,
|
|
69
76
|
{
|
|
70
77
|
to: {
|
|
71
78
|
pathname: `/${s.path}`,
|
|
72
|
-
search:
|
|
79
|
+
search: a ? `category=${a}` : ""
|
|
73
80
|
},
|
|
74
81
|
className: "no-underline hover:!text-foreground",
|
|
75
|
-
children: /* @__PURE__ */ e.jsxs(
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
},
|
|
99
|
-
navigationId:
|
|
100
|
-
items:
|
|
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:
|
|
107
|
+
path: r,
|
|
107
108
|
element: /* @__PURE__ */ e.jsx(
|
|
108
|
-
|
|
109
|
+
k,
|
|
109
110
|
{
|
|
110
111
|
label: o,
|
|
111
|
-
items:
|
|
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
|
-
|
|
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-
|
|
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 {
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
-
import "./utils-
|
|
3
|
+
import { o as a } from "./index-C8ubT49C.js";
|
|
4
|
+
import "./utils-B4O1uet5.js";
|
|
5
5
|
import "lucide-react";
|
|
6
|
-
import "./hook-
|
|
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
|
|
2
|
-
import { useRef as
|
|
3
|
-
import { C as
|
|
4
|
-
const
|
|
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
|
-
},
|
|
23
|
-
prefilledQuery:
|
|
22
|
+
}, k = {}, I = ({
|
|
23
|
+
prefilledQuery: r,
|
|
24
24
|
isOpen: e,
|
|
25
|
-
onClose:
|
|
26
|
-
settings:
|
|
25
|
+
onClose: n,
|
|
26
|
+
settings: p
|
|
27
27
|
}) => {
|
|
28
|
-
const
|
|
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:
|
|
33
|
+
targetElement: o.current,
|
|
32
34
|
properties: {
|
|
33
35
|
isOpen: e,
|
|
34
|
-
onClose:
|
|
36
|
+
onClose: n,
|
|
35
37
|
onOpen: void 0,
|
|
36
|
-
baseSettings: { ...
|
|
38
|
+
baseSettings: { ...h, ...p },
|
|
37
39
|
searchSettings: {
|
|
38
|
-
prefilledQuery:
|
|
40
|
+
prefilledQuery: r || void 0
|
|
39
41
|
},
|
|
40
|
-
aiChatSettings:
|
|
42
|
+
aiChatSettings: k
|
|
41
43
|
}
|
|
42
44
|
}),
|
|
43
|
-
[e,
|
|
45
|
+
[e, n, r, p, o]
|
|
44
46
|
);
|
|
45
|
-
return
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
},
|
|
52
|
-
|
|
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:
|
|
63
|
-
}) => /* @__PURE__ */
|
|
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
|
-
|
|
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
|
|
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
|
+
"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.
|
|
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.
|
|
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.
|
|
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.
|
|
207
|
+
"tailwind-merge": "2.6.0",
|
|
208
208
|
"tailwindcss": "3.4.16",
|
|
209
209
|
"tsx": "^4.19.2",
|
|
210
210
|
"ulidx": "2.4.1",
|
|
@@ -245,11 +245,11 @@
|
|
|
245
245
|
"vitest": "2.1.8"
|
|
246
246
|
},
|
|
247
247
|
"peerDependencies": {
|
|
248
|
-
"react": ">=
|
|
249
|
-
"react-dom": ">=
|
|
248
|
+
"react": ">=19",
|
|
249
|
+
"react-dom": ">=19"
|
|
250
250
|
},
|
|
251
251
|
"optionalDependencies": {
|
|
252
|
-
"@clerk/clerk-js": "5.
|
|
252
|
+
"@clerk/clerk-js": "^5.43.4",
|
|
253
253
|
"@sentry/react": "^8.45.1"
|
|
254
254
|
},
|
|
255
255
|
"scripts": {
|
|
@@ -12,8 +12,9 @@ import { useAuthState, UserProfile } from "../state.js";
|
|
|
12
12
|
|
|
13
13
|
const CODE_VERIFIER_KEY = "code-verifier";
|
|
14
14
|
|
|
15
|
-
interface
|
|
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:
|
|
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
|
|
206
|
+
const tokenState = providerData as OpenIdProviderData;
|
|
205
207
|
|
|
206
208
|
if (new Date(tokenState.expiresOn) < new Date()) {
|
|
207
209
|
if (!tokenState.refreshToken) {
|