zudoku 0.3.0-dev.34 → 0.3.0-dev.36
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/app/entry.client.js +2 -1
- package/dist/app/entry.client.js.map +1 -1
- package/dist/app/entry.server.js +10 -2
- package/dist/app/entry.server.js.map +1 -1
- package/dist/app/main.js +1 -3
- package/dist/app/main.js.map +1 -1
- package/dist/lib/components/DevPortal.js +9 -3
- package/dist/lib/components/DevPortal.js.map +1 -1
- package/dist/lib/components/Layout.js +4 -1
- package/dist/lib/components/Layout.js.map +1 -1
- package/dist/lib/components/index.d.ts +5 -0
- package/dist/lib/components/index.js +4 -0
- package/dist/lib/components/index.js.map +1 -1
- package/dist/lib/plugins/markdown/MdxPage.js +3 -1
- package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
- package/dist/vite/config.js +1 -1
- package/dist/vite/config.js.map +1 -1
- package/dist/vite/plugin-component.js +1 -1
- package/dist/vite/plugin-component.js.map +1 -1
- package/lib/AnchorLink-Sx89bfCW.js +704 -0
- package/lib/AnchorLink-Sx89bfCW.js.map +1 -0
- package/lib/{DevPortalProvider-BlxLX6GG.js → DevPortalProvider-Demv4Ngx.js} +250 -230
- package/lib/DevPortalProvider-Demv4Ngx.js.map +1 -0
- package/lib/Markdown-DMEnjeMH.js +14499 -0
- package/lib/Markdown-DMEnjeMH.js.map +1 -0
- package/lib/{MdxPage-BRKQDcVW.js → MdxPage-s9RlKFtt.js} +102 -108
- package/lib/MdxPage-s9RlKFtt.js.map +1 -0
- package/lib/{OperationList-DfkWNe8Y.js → OperationList-9NIdTqS0.js} +1692 -1862
- package/lib/OperationList-9NIdTqS0.js.map +1 -0
- package/lib/{Route-Bf1_D_vC.js → Route-BqfQoDR2.js} +2 -2
- package/lib/{Route-Bf1_D_vC.js.map → Route-BqfQoDR2.js.map} +1 -1
- package/lib/Select-CJamK_wp.js +4571 -0
- package/lib/Select-CJamK_wp.js.map +1 -0
- package/lib/Spinner-3YT-WUu5.js +182 -0
- package/lib/Spinner-3YT-WUu5.js.map +1 -0
- package/lib/hook-Cq3Jb1lX.js +77 -0
- package/lib/hook-Cq3Jb1lX.js.map +1 -0
- package/lib/index-BB2EBBgh.js +412 -0
- package/lib/index-BB2EBBgh.js.map +1 -0
- package/lib/{index-BjSy8IQO.js → index-DhKGMJM2.js} +19 -20
- package/lib/{index-BjSy8IQO.js.map → index-DhKGMJM2.js.map} +1 -1
- package/lib/{jsx-runtime-CM0TzjGp.js → jsx-runtime-Bt86M5tA.js} +5 -5
- package/lib/{jsx-runtime-CM0TzjGp.js.map → jsx-runtime-Bt86M5tA.js.map} +1 -1
- package/lib/util-CYBrkBUo.js +41 -0
- package/lib/util-CYBrkBUo.js.map +1 -0
- package/lib/zudoku.auth-openid.js +1 -1
- package/lib/zudoku.components.js +564 -286
- package/lib/zudoku.components.js.map +1 -1
- package/lib/zudoku.plugin-api-keys.js +99 -153
- package/lib/zudoku.plugin-api-keys.js.map +1 -1
- package/lib/zudoku.plugin-markdown.js +46 -2
- package/lib/zudoku.plugin-markdown.js.map +1 -1
- package/lib/zudoku.plugin-openapi.js +3 -3
- package/package.json +2 -1
- package/src/app/entry.client.tsx +4 -1
- package/src/app/entry.server.tsx +17 -2
- package/src/app/main.tsx +1 -3
- package/src/lib/components/DevPortal.tsx +15 -1
- package/src/lib/components/Layout.tsx +9 -0
- package/src/lib/components/index.ts +4 -0
- package/src/lib/plugins/markdown/MdxPage.tsx +6 -0
- package/lib/DevPortalProvider-BlxLX6GG.js.map +0 -1
- package/lib/Markdown-CL8KPvJN.js +0 -8620
- package/lib/Markdown-CL8KPvJN.js.map +0 -1
- package/lib/MdxComponents-Ev_hBHb2.js +0 -5885
- package/lib/MdxComponents-Ev_hBHb2.js.map +0 -1
- package/lib/MdxPage-BRKQDcVW.js.map +0 -1
- package/lib/OperationList-DfkWNe8Y.js.map +0 -1
- package/lib/Select-DSa3bN4t.js +0 -4770
- package/lib/Select-DSa3bN4t.js.map +0 -1
- package/lib/hook-CTmJ6CWq.js +0 -35
- package/lib/hook-CTmJ6CWq.js.map +0 -1
- package/lib/index-Brq2ztwd.js +0 -74
- package/lib/index-Brq2ztwd.js.map +0 -1
- package/lib/index-QzXzw_ra.js +0 -24
- package/lib/index-QzXzw_ra.js.map +0 -1
- package/lib/mutation-91kw0lHb.js +0 -208
- package/lib/mutation-91kw0lHb.js.map +0 -1
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import * as L from "react";
|
|
9
|
-
import { useState as V } from "react";
|
|
1
|
+
import { j as e, a as g, O as j } from "./jsx-runtime-Bt86M5tA.js";
|
|
2
|
+
import { R as v, u as b } from "./hook-Cq3Jb1lX.js";
|
|
3
|
+
import { u as w, a as h, S as N, b as k, c as K, d as E, e as S, f as p, B as o } from "./Select-CJamK_wp.js";
|
|
4
|
+
import { c as l, d as A, L as x } from "./Markdown-DMEnjeMH.js";
|
|
5
|
+
import { u as m, q as C, t as P } from "./DevPortalProvider-Demv4Ngx.js";
|
|
6
|
+
import * as R from "react";
|
|
7
|
+
import { useState as D } from "react";
|
|
10
8
|
/**
|
|
11
9
|
* @license lucide-react v0.378.0 - ISC
|
|
12
10
|
*
|
|
13
11
|
* This source code is licensed under the ISC license.
|
|
14
12
|
* See the LICENSE file in the root directory of this source tree.
|
|
15
13
|
*/
|
|
16
|
-
const
|
|
14
|
+
const I = l("EyeOff", [
|
|
17
15
|
["path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24", key: "1jxqfv" }],
|
|
18
16
|
[
|
|
19
17
|
"path",
|
|
@@ -34,7 +32,7 @@ const _ = c("EyeOff", [
|
|
|
34
32
|
* This source code is licensed under the ISC license.
|
|
35
33
|
* See the LICENSE file in the root directory of this source tree.
|
|
36
34
|
*/
|
|
37
|
-
const
|
|
35
|
+
const O = l("Eye", [
|
|
38
36
|
["path", { d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z", key: "rwhkz3" }],
|
|
39
37
|
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
40
38
|
]);
|
|
@@ -44,7 +42,7 @@ const Q = c("Eye", [
|
|
|
44
42
|
* This source code is licensed under the ISC license.
|
|
45
43
|
* See the LICENSE file in the root directory of this source tree.
|
|
46
44
|
*/
|
|
47
|
-
const
|
|
45
|
+
const q = l("RotateCw", [
|
|
48
46
|
["path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8", key: "1p45f6" }],
|
|
49
47
|
["path", { d: "M21 3v5h-5", key: "1q7to0" }]
|
|
50
48
|
]);
|
|
@@ -54,100 +52,48 @@ const H = c("RotateCw", [
|
|
|
54
52
|
* This source code is licensed under the ISC license.
|
|
55
53
|
* See the LICENSE file in the root directory of this source tree.
|
|
56
54
|
*/
|
|
57
|
-
const
|
|
55
|
+
const z = l("Trash", [
|
|
58
56
|
["path", { d: "M3 6h18", key: "d0wm0j" }],
|
|
59
57
|
["path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6", key: "4alrt4" }],
|
|
60
58
|
["path", { d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2", key: "v07s0e" }]
|
|
61
59
|
]);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
*
|
|
65
|
-
* This source code is licensed under the ISC license.
|
|
66
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
67
|
-
*/
|
|
68
|
-
const G = c("Unlink", [
|
|
69
|
-
[
|
|
70
|
-
"path",
|
|
71
|
-
{
|
|
72
|
-
d: "m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71",
|
|
73
|
-
key: "yqzxt4"
|
|
74
|
-
}
|
|
75
|
-
],
|
|
76
|
-
[
|
|
77
|
-
"path",
|
|
78
|
-
{
|
|
79
|
-
d: "m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71",
|
|
80
|
-
key: "4qinb0"
|
|
81
|
-
}
|
|
82
|
-
],
|
|
83
|
-
["line", { x1: "8", x2: "8", y1: "2", y2: "5", key: "1041cp" }],
|
|
84
|
-
["line", { x1: "2", x2: "5", y1: "8", y2: "8", key: "14m1p5" }],
|
|
85
|
-
["line", { x1: "16", x2: "16", y1: "19", y2: "22", key: "rzdirn" }],
|
|
86
|
-
["line", { x1: "19", x2: "22", y1: "16", y2: "16", key: "ox905f" }]
|
|
87
|
-
]);
|
|
88
|
-
function U(t, s) {
|
|
89
|
-
return process.env.NODE_ENV !== "production" && t.queryFn === I && console.error("skipToken is not allowed for useSuspenseQuery"), z(
|
|
90
|
-
{
|
|
91
|
-
...t,
|
|
92
|
-
enabled: !0,
|
|
93
|
-
suspense: !0,
|
|
94
|
-
throwOnError: M,
|
|
95
|
-
placeholderData: void 0
|
|
96
|
-
},
|
|
97
|
-
T
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
var $ = process.env.NODE_ENV === "production", u = "Invariant failed";
|
|
101
|
-
function p(t, s) {
|
|
60
|
+
var M = process.env.NODE_ENV === "production", d = "Invariant failed";
|
|
61
|
+
function u(t, n) {
|
|
102
62
|
if (!t) {
|
|
103
|
-
if (
|
|
104
|
-
throw new Error(
|
|
105
|
-
var a = typeof
|
|
106
|
-
throw new Error(
|
|
63
|
+
if (M)
|
|
64
|
+
throw new Error(d);
|
|
65
|
+
var a = typeof n == "function" ? n() : n, r = a ? "".concat(d, ": ").concat(a) : d;
|
|
66
|
+
throw new Error(r);
|
|
107
67
|
}
|
|
108
68
|
}
|
|
109
|
-
const
|
|
110
|
-
/* @__PURE__ */ e.jsx(
|
|
111
|
-
/* @__PURE__ */ e.jsxs(N, { level: 1, className: "flex gap-3.5 items-center", children: [
|
|
112
|
-
"Page not found",
|
|
113
|
-
/* @__PURE__ */ e.jsx(G, { size: 24 })
|
|
114
|
-
] }),
|
|
115
|
-
!1,
|
|
116
|
-
/* @__PURE__ */ e.jsx("p", { children: "It seems that the page you are looking for does not exist or may have been moved. Please check the URL for any typos or use the navigation menu to find the correct page." }),
|
|
117
|
-
/* @__PURE__ */ e.jsx(d, { to: "/", children: "Go back home" })
|
|
118
|
-
] }));
|
|
119
|
-
function Y() {
|
|
120
|
-
const t = j();
|
|
121
|
-
return C(t) && t.status === 404 ? /* @__PURE__ */ e.jsx(J, {}) : /* @__PURE__ */ e.jsx(k, { error: t });
|
|
122
|
-
}
|
|
123
|
-
const m = L.forwardRef(
|
|
124
|
-
({ className: t, type: s, ...a }, n) => /* @__PURE__ */ e.jsx(
|
|
69
|
+
const y = R.forwardRef(
|
|
70
|
+
({ className: t, type: n, ...a }, r) => /* @__PURE__ */ e.jsx(
|
|
125
71
|
"input",
|
|
126
72
|
{
|
|
127
|
-
type:
|
|
128
|
-
className:
|
|
73
|
+
type: n,
|
|
74
|
+
className: A(
|
|
129
75
|
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
130
76
|
t
|
|
131
77
|
),
|
|
132
|
-
ref:
|
|
78
|
+
ref: r,
|
|
133
79
|
...a
|
|
134
80
|
}
|
|
135
81
|
)
|
|
136
82
|
);
|
|
137
|
-
|
|
138
|
-
const
|
|
139
|
-
const
|
|
83
|
+
y.displayName = "Input";
|
|
84
|
+
const L = ({ service: t }) => {
|
|
85
|
+
const n = m(), a = g(), r = w({
|
|
140
86
|
defaultValues: {
|
|
141
87
|
expiresOn: "30"
|
|
142
88
|
}
|
|
143
89
|
}), i = h({
|
|
144
|
-
mutationFn: ({ description:
|
|
90
|
+
mutationFn: ({ description: s, expiresOn: c }) => {
|
|
145
91
|
if (!t.createKey)
|
|
146
92
|
throw new Error("deleteKey not implemented");
|
|
147
|
-
const f =
|
|
93
|
+
const f = c !== "never" ? T(Number(c)) : void 0;
|
|
148
94
|
return t.createKey(
|
|
149
|
-
{ description:
|
|
150
|
-
|
|
95
|
+
{ description: s, expiresOn: f },
|
|
96
|
+
n
|
|
151
97
|
);
|
|
152
98
|
},
|
|
153
99
|
onSuccess: () => a("/settings/api-keys/")
|
|
@@ -157,49 +103,49 @@ const Z = ({ service: t }) => {
|
|
|
157
103
|
/* @__PURE__ */ e.jsx(
|
|
158
104
|
"form",
|
|
159
105
|
{
|
|
160
|
-
onSubmit:
|
|
106
|
+
onSubmit: r.handleSubmit((s) => i.mutate(s)),
|
|
161
107
|
children: /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2 flex-col", children: [
|
|
162
108
|
"Note",
|
|
163
|
-
/* @__PURE__ */ e.jsx(
|
|
109
|
+
/* @__PURE__ */ e.jsx(y, { ...r.register("description") }),
|
|
164
110
|
"Expiration",
|
|
165
111
|
/* @__PURE__ */ e.jsxs(
|
|
166
|
-
|
|
112
|
+
N,
|
|
167
113
|
{
|
|
168
|
-
onValueChange: (
|
|
169
|
-
defaultValue:
|
|
114
|
+
onValueChange: (s) => r.setValue("expiresOn", s),
|
|
115
|
+
defaultValue: r.getValues("expiresOn"),
|
|
170
116
|
children: [
|
|
171
|
-
/* @__PURE__ */ e.jsx(
|
|
172
|
-
/* @__PURE__ */ e.jsx(
|
|
173
|
-
[7, 30, 60, 90].map((
|
|
174
|
-
|
|
117
|
+
/* @__PURE__ */ e.jsx(k, { children: /* @__PURE__ */ e.jsx(K, {}) }),
|
|
118
|
+
/* @__PURE__ */ e.jsx(E, { children: /* @__PURE__ */ e.jsxs(S, { children: [
|
|
119
|
+
[7, 30, 60, 90].map((s) => /* @__PURE__ */ e.jsxs(p, { value: String(s), children: [
|
|
120
|
+
s,
|
|
175
121
|
" days"
|
|
176
|
-
] },
|
|
177
|
-
/* @__PURE__ */ e.jsx(
|
|
122
|
+
] }, s)),
|
|
123
|
+
/* @__PURE__ */ e.jsx(p, { value: "never", children: "Never" })
|
|
178
124
|
] }) })
|
|
179
125
|
]
|
|
180
126
|
}
|
|
181
127
|
),
|
|
182
128
|
/* @__PURE__ */ e.jsxs("div", { className: "flex gap-2", children: [
|
|
183
129
|
/* @__PURE__ */ e.jsx(o, { children: "Generate Key" }),
|
|
184
|
-
/* @__PURE__ */ e.jsx(o, { variant: "outline", asChild: !0, children: /* @__PURE__ */ e.jsx(
|
|
130
|
+
/* @__PURE__ */ e.jsx(o, { variant: "outline", asChild: !0, children: /* @__PURE__ */ e.jsx(x, { to: "/settings/api-keys/", children: "Cancel" }) })
|
|
185
131
|
] })
|
|
186
132
|
] })
|
|
187
133
|
}
|
|
188
134
|
)
|
|
189
135
|
] }) : null;
|
|
190
|
-
},
|
|
191
|
-
const
|
|
192
|
-
return
|
|
193
|
-
},
|
|
194
|
-
const
|
|
195
|
-
queryFn: () => t.getKeys(
|
|
136
|
+
}, T = (t) => {
|
|
137
|
+
const n = /* @__PURE__ */ new Date();
|
|
138
|
+
return n.setDate(n.getDate() + t), n.toISOString();
|
|
139
|
+
}, V = ({ service: t }) => {
|
|
140
|
+
const n = m(), a = C(), { data: r } = P({
|
|
141
|
+
queryFn: () => t.getKeys(n),
|
|
196
142
|
queryKey: ["api-keys"],
|
|
197
143
|
retry: !1
|
|
198
144
|
}), i = h({
|
|
199
|
-
mutationFn: (
|
|
145
|
+
mutationFn: (s) => {
|
|
200
146
|
if (!t.deleteKey)
|
|
201
147
|
throw new Error("deleteKey not implemented");
|
|
202
|
-
return t.deleteKey(
|
|
148
|
+
return t.deleteKey(s, n);
|
|
203
149
|
},
|
|
204
150
|
onSuccess: () => {
|
|
205
151
|
a.invalidateQueries({ queryKey: ["api-keys"] });
|
|
@@ -208,110 +154,110 @@ const Z = ({ service: t }) => {
|
|
|
208
154
|
return /* @__PURE__ */ e.jsxs("div", { className: "max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]", children: [
|
|
209
155
|
/* @__PURE__ */ e.jsxs("div", { className: "flex justify-between mb-4 border-b border-border pb-3", children: [
|
|
210
156
|
/* @__PURE__ */ e.jsx("h1", { className: "font-medium text-2xl", children: "API Keys" }),
|
|
211
|
-
t.createKey && /* @__PURE__ */ e.jsx(o, { asChild: !0, children: /* @__PURE__ */ e.jsx(
|
|
157
|
+
t.createKey && /* @__PURE__ */ e.jsx(o, { asChild: !0, children: /* @__PURE__ */ e.jsx(x, { to: "/settings/api-keys/new", children: "Create API Key" }) })
|
|
212
158
|
] }),
|
|
213
|
-
|
|
159
|
+
r.length === 0 ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-4 items-center h-1/2 my-8", children: [
|
|
214
160
|
/* @__PURE__ */ e.jsxs("div", { className: "text-center", children: [
|
|
215
161
|
"No API keys created yet.",
|
|
216
162
|
/* @__PURE__ */ e.jsx("br", {}),
|
|
217
163
|
"Get started and create the first one now"
|
|
218
164
|
] }),
|
|
219
|
-
t.createKey && /* @__PURE__ */ e.jsx(o, { asChild: !0, children: /* @__PURE__ */ e.jsx(
|
|
220
|
-
] }) : /* @__PURE__ */ e.jsx("ul", { className: "grid grid-cols-[minmax(250px,min-content)_1fr_min-content] ", children:
|
|
165
|
+
t.createKey && /* @__PURE__ */ e.jsx(o, { asChild: !0, children: /* @__PURE__ */ e.jsx(x, { to: "/settings/api-keys/new", children: "Create API Key" }) })
|
|
166
|
+
] }) : /* @__PURE__ */ e.jsx("ul", { className: "grid grid-cols-[minmax(250px,min-content)_1fr_min-content] ", children: r.map((s) => /* @__PURE__ */ e.jsxs(
|
|
221
167
|
"li",
|
|
222
168
|
{
|
|
223
169
|
className: "border-b border-border p-5 grid grid-cols-subgrid col-span-full gap-2 items-center",
|
|
224
170
|
children: [
|
|
225
171
|
/* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-1 text-sm", children: [
|
|
226
|
-
|
|
172
|
+
s.description ?? s.id,
|
|
227
173
|
/* @__PURE__ */ e.jsxs("div", { className: "text-muted-foreground text-xs", children: [
|
|
228
|
-
|
|
174
|
+
s.createdOn && /* @__PURE__ */ e.jsxs("div", { children: [
|
|
229
175
|
"Created on ",
|
|
230
|
-
new Date(
|
|
176
|
+
new Date(s.createdOn).toLocaleDateString()
|
|
231
177
|
] }),
|
|
232
|
-
|
|
178
|
+
s.expiresOn && /* @__PURE__ */ e.jsxs("div", { children: [
|
|
233
179
|
"Expires on ",
|
|
234
|
-
new Date(
|
|
180
|
+
new Date(s.expiresOn).toLocaleDateString()
|
|
235
181
|
] })
|
|
236
182
|
] })
|
|
237
183
|
] }),
|
|
238
|
-
/* @__PURE__ */ e.jsx("div", { className: "items-center flex justify-center", children: /* @__PURE__ */ e.jsx(
|
|
184
|
+
/* @__PURE__ */ e.jsx("div", { className: "items-center flex justify-center", children: /* @__PURE__ */ e.jsx(F, { apiKey: s.key }) }),
|
|
239
185
|
/* @__PURE__ */ e.jsxs("div", { className: "flex gap-2", children: [
|
|
240
|
-
t.rollKey && /* @__PURE__ */ e.jsx(o, { size: "icon", children: /* @__PURE__ */ e.jsx(
|
|
186
|
+
t.rollKey && /* @__PURE__ */ e.jsx(o, { size: "icon", children: /* @__PURE__ */ e.jsx(q, { size: 16 }) }),
|
|
241
187
|
t.deleteKey && /* @__PURE__ */ e.jsx(
|
|
242
188
|
o,
|
|
243
189
|
{
|
|
244
190
|
variant: "ghost",
|
|
245
191
|
size: "icon",
|
|
246
192
|
onClick: () => {
|
|
247
|
-
confirm("Do you want to delete this key?") && i.mutate(
|
|
193
|
+
confirm("Do you want to delete this key?") && i.mutate(s.id);
|
|
248
194
|
},
|
|
249
195
|
disabled: i.isPending,
|
|
250
|
-
children: /* @__PURE__ */ e.jsx(
|
|
196
|
+
children: /* @__PURE__ */ e.jsx(z, { size: 16 })
|
|
251
197
|
}
|
|
252
198
|
)
|
|
253
199
|
] })
|
|
254
200
|
]
|
|
255
201
|
},
|
|
256
|
-
|
|
202
|
+
s.id
|
|
257
203
|
)) })
|
|
258
204
|
] });
|
|
259
|
-
},
|
|
260
|
-
const [
|
|
205
|
+
}, F = ({ apiKey: t }) => {
|
|
206
|
+
const [n, a] = D(!1);
|
|
261
207
|
return /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2 items-center text-sm", children: [
|
|
262
|
-
/* @__PURE__ */ e.jsx("code", { className: "border border-border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono", children:
|
|
208
|
+
/* @__PURE__ */ e.jsx("code", { className: "border border-border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono", children: n ? t : "•".repeat(t.length) }),
|
|
263
209
|
/* @__PURE__ */ e.jsx(
|
|
264
210
|
o,
|
|
265
211
|
{
|
|
266
212
|
variant: "outline",
|
|
267
|
-
onClick: () => a((
|
|
213
|
+
onClick: () => a((r) => !r),
|
|
268
214
|
size: "icon",
|
|
269
|
-
children:
|
|
215
|
+
children: n ? /* @__PURE__ */ e.jsx(I, { size: 16 }) : /* @__PURE__ */ e.jsx(O, { size: 16 })
|
|
270
216
|
}
|
|
271
217
|
)
|
|
272
218
|
] });
|
|
273
|
-
},
|
|
274
|
-
deleteKey: async (
|
|
275
|
-
const
|
|
219
|
+
}, _ = "https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev", B = (t) => ({
|
|
220
|
+
deleteKey: async (n, a) => {
|
|
221
|
+
const r = new Request(t + `/v1/developer/api-keys/${n}`, {
|
|
276
222
|
method: "DELETE"
|
|
277
223
|
});
|
|
278
|
-
await a.signRequest(
|
|
279
|
-
const i = await fetch(
|
|
280
|
-
|
|
224
|
+
await a.signRequest(r);
|
|
225
|
+
const i = await fetch(r);
|
|
226
|
+
u(i.ok, "Failed to delete API key");
|
|
281
227
|
},
|
|
282
|
-
createKey: async (
|
|
283
|
-
const
|
|
228
|
+
createKey: async (n, a) => {
|
|
229
|
+
const r = new Request(t + "/v1/developer/api-keys", {
|
|
284
230
|
method: "POST",
|
|
285
231
|
headers: {
|
|
286
232
|
"Content-Type": "application/json"
|
|
287
233
|
},
|
|
288
|
-
body: JSON.stringify(
|
|
234
|
+
body: JSON.stringify(n)
|
|
289
235
|
});
|
|
290
|
-
await a.signRequest(
|
|
291
|
-
const i = await fetch(
|
|
292
|
-
|
|
236
|
+
await a.signRequest(r);
|
|
237
|
+
const i = await fetch(r);
|
|
238
|
+
u(i.ok, "Failed to create API key");
|
|
293
239
|
},
|
|
294
|
-
getKeys: async (
|
|
240
|
+
getKeys: async (n) => {
|
|
295
241
|
const a = new Request(t + "/v1/developer/api-keys");
|
|
296
|
-
await
|
|
297
|
-
const
|
|
298
|
-
return
|
|
242
|
+
await n.signRequest(a);
|
|
243
|
+
const r = await fetch(a);
|
|
244
|
+
return u(r.ok, "Failed to fetch API keys"), await r.json();
|
|
299
245
|
}
|
|
300
|
-
}),
|
|
301
|
-
const t =
|
|
302
|
-
return t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(
|
|
246
|
+
}), G = () => {
|
|
247
|
+
const t = b();
|
|
248
|
+
return t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(j, {}) : /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2 my-12", children: [
|
|
303
249
|
"Please login first to view this page",
|
|
304
250
|
/* @__PURE__ */ e.jsx(o, { onClick: () => t.login(), children: "Login" })
|
|
305
251
|
] });
|
|
306
|
-
},
|
|
307
|
-
const
|
|
252
|
+
}, Z = (t) => {
|
|
253
|
+
const n = "endpoint" in t ? t.endpoint : _, a = "getKeys" in t ? t : B(n);
|
|
308
254
|
return {
|
|
309
|
-
getIdentities: async (
|
|
255
|
+
getIdentities: async (r) => {
|
|
310
256
|
try {
|
|
311
|
-
return (await a.getKeys(
|
|
312
|
-
authorizeRequest: (
|
|
313
|
-
id:
|
|
314
|
-
label:
|
|
257
|
+
return (await a.getKeys(r)).map((s) => ({
|
|
258
|
+
authorizeRequest: (c) => (c.headers.set("Authorization", `Bearer ${s.key}`), c),
|
|
259
|
+
id: s.id,
|
|
260
|
+
label: s.description ?? s.id
|
|
315
261
|
}));
|
|
316
262
|
} catch {
|
|
317
263
|
return [];
|
|
@@ -319,16 +265,16 @@ const Z = ({ service: t }) => {
|
|
|
319
265
|
},
|
|
320
266
|
getRoutes: () => [
|
|
321
267
|
{
|
|
322
|
-
element: /* @__PURE__ */ e.jsx(
|
|
323
|
-
errorElement: /* @__PURE__ */ e.jsx(
|
|
268
|
+
element: /* @__PURE__ */ e.jsx(G, {}),
|
|
269
|
+
errorElement: /* @__PURE__ */ e.jsx(v, {}),
|
|
324
270
|
children: [
|
|
325
271
|
{
|
|
326
272
|
path: "/settings/api-keys",
|
|
327
|
-
element: /* @__PURE__ */ e.jsx(
|
|
273
|
+
element: /* @__PURE__ */ e.jsx(V, { service: a })
|
|
328
274
|
},
|
|
329
275
|
{
|
|
330
276
|
path: "/settings/api-keys/new",
|
|
331
|
-
element: /* @__PURE__ */ e.jsx(
|
|
277
|
+
element: /* @__PURE__ */ e.jsx(L, { service: a })
|
|
332
278
|
}
|
|
333
279
|
]
|
|
334
280
|
}
|
|
@@ -336,6 +282,6 @@ const Z = ({ service: t }) => {
|
|
|
336
282
|
};
|
|
337
283
|
};
|
|
338
284
|
export {
|
|
339
|
-
|
|
285
|
+
Z as apiKeyPlugin
|
|
340
286
|
};
|
|
341
287
|
//# sourceMappingURL=zudoku.plugin-api-keys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zudoku.plugin-api-keys.js","sources":["../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/eye-off.js","../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/eye.js","../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash.js","../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/unlink.js","../../../node_modules/.pnpm/@tanstack+react-query@5.50.1_react@18.3.1/node_modules/@tanstack/react-query/build/modern/useSuspenseQuery.js","../../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../src/lib/components/NotFoundPage.tsx","../src/lib/errors/RouterError.tsx","../src/lib/components/Input.tsx","../src/lib/plugins/api-keys/CreateApiKey.tsx","../src/lib/plugins/api-keys/SettingsApiKeys.tsx","../src/lib/plugins/api-keys/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\"path\", { d: \"M9.88 9.88a3 3 0 1 0 4.24 4.24\", key: \"1jxqfv\" }],\n [\n \"path\",\n {\n d: \"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\",\n key: \"9wicm4\"\n }\n ],\n [\n \"path\",\n { d: \"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\", key: \"1jreej\" }\n ],\n [\"line\", { x1: \"2\", x2: \"22\", y1: \"2\", y2: \"22\", key: \"a6p6uj\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\"path\", { d: \"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\", key: \"rwhkz3\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCw = createLucideIcon(\"RotateCw\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n]);\n\nexport { RotateCw as default };\n//# sourceMappingURL=rotate-cw.js.map\n","/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Trash = createLucideIcon(\"Trash\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }]\n]);\n\nexport { Trash as default };\n//# sourceMappingURL=trash.js.map\n","/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Unlink = createLucideIcon(\"Unlink\", [\n [\n \"path\",\n {\n d: \"m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71\",\n key: \"yqzxt4\"\n }\n ],\n [\n \"path\",\n {\n d: \"m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71\",\n key: \"4qinb0\"\n }\n ],\n [\"line\", { x1: \"8\", x2: \"8\", y1: \"2\", y2: \"5\", key: \"1041cp\" }],\n [\"line\", { x1: \"2\", x2: \"5\", y1: \"8\", y2: \"8\", key: \"14m1p5\" }],\n [\"line\", { x1: \"16\", x2: \"16\", y1: \"19\", y2: \"22\", key: \"rzdirn\" }],\n [\"line\", { x1: \"19\", x2: \"22\", y1: \"16\", y2: \"16\", key: \"ox905f\" }]\n]);\n\nexport { Unlink as default };\n//# sourceMappingURL=unlink.js.map\n","\"use client\";\n\n// src/useSuspenseQuery.ts\nimport { QueryObserver, skipToken } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nimport { defaultThrowOnError } from \"./suspense.js\";\nfunction useSuspenseQuery(options, queryClient) {\n if (process.env.NODE_ENV !== \"production\") {\n if (options.queryFn === skipToken) {\n console.error(\"skipToken is not allowed for useSuspenseQuery\");\n }\n }\n return useBaseQuery(\n {\n ...options,\n enabled: true,\n suspense: true,\n throwOnError: defaultThrowOnError,\n placeholderData: void 0\n },\n QueryObserver,\n queryClient\n );\n}\nexport {\n useSuspenseQuery\n};\n//# sourceMappingURL=useSuspenseQuery.js.map","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import { UnlinkIcon } from \"lucide-react\";\nimport { Link, useParams } from \"react-router-dom\";\nimport { Callout } from \"../ui/Callout.js\";\nimport { CategoryHeading } from \"./CategoryHeading.js\";\nimport { Heading } from \"./Heading.js\";\nimport { ProseClasses } from \"./Markdown.js\";\n\nexport const NotFoundPage = () => {\n const params = useParams();\n\n return (\n <div className={ProseClasses + \" h-full pt-[--padding-content-top]\"}>\n <CategoryHeading>404</CategoryHeading>\n <Heading level={1} className=\"flex gap-3.5 items-center\">\n Page not found\n <UnlinkIcon size={24} />\n </Heading>\n {import.meta.env.DEV && (\n <Callout type=\"caution\" title=\"Developer hint\">\n Start by adding a file at{\" \"}\n <code>\n {\"{PROJECT_ROOT}\"}/{params[\"*\"]}.mdx\n </code>{\" \"}\n and add some content to make this error go away.\n <br />\n <small className=\"italic\">\n Note: This hint is only shown in development mode.\n </small>\n </Callout>\n )}\n <p>\n It seems that the page you are looking for does not exist or may have\n been moved. Please check the URL for any typos or use the navigation\n menu to find the correct page.\n </p>\n <Link to=\"/\">Go back home</Link>\n </div>\n );\n};\n","import { isRouteErrorResponse, useRouteError } from \"react-router-dom\";\nimport { NotFoundPage } from \"../components/NotFoundPage.js\";\nimport { ErrorAlert } from \"./ErrorAlert.js\";\n\nexport function RouterError() {\n const error = useRouteError();\n\n if (isRouteErrorResponse(error) && error.status === 404) {\n return <NotFoundPage />;\n }\n\n return <ErrorAlert error={error} />;\n}\n","import * as React from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import { useMutation } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useDevPortal } from \"../../components/context/DevPortalProvider.js\";\nimport { Input } from \"../../components/Input.js\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/Select.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { ApiKeyService } from \"./index.js\";\n\ntype CreateApiKey = { description: string; expiresOn?: string };\n\nexport const CreateApiKey = ({ service }: { service: ApiKeyService }) => {\n const context = useDevPortal();\n const navigate = useNavigate();\n const form = useForm<CreateApiKey>({\n defaultValues: {\n expiresOn: \"30\",\n },\n });\n const createKeyMutation = useMutation({\n mutationFn: ({ description, expiresOn }: CreateApiKey) => {\n if (!service.createKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n const expiresOnDate =\n expiresOn !== \"never\" ? addDaysToDate(Number(expiresOn)) : undefined;\n\n return service.createKey(\n { description: description, expiresOn: expiresOnDate },\n context,\n );\n },\n onSuccess: () => navigate(\"/settings/api-keys/\"),\n });\n\n if (!service.createKey) {\n return null;\n }\n\n return (\n <div className=\"max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b border-border pb-1\">\n <h1 className=\"font-medium text-2xl\">New API Key</h1>\n </div>\n <form\n onSubmit={form.handleSubmit((data) => createKeyMutation.mutate(data))}\n >\n <div className=\"flex gap-2 flex-col\">\n Note\n <Input {...form.register(\"description\")} />\n Expiration\n <Select\n onValueChange={(value) => form.setValue(\"expiresOn\", value)}\n defaultValue={form.getValues(\"expiresOn\")}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {[7, 30, 60, 90].map((option) => (\n <SelectItem value={String(option)} key={option}>\n {option} days\n </SelectItem>\n ))}\n <SelectItem value=\"never\">Never</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button>Generate Key</Button>\n <Button variant=\"outline\" asChild>\n <Link to=\"/settings/api-keys/\">Cancel</Link>\n </Button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nconst addDaysToDate = (days: number): string => {\n const date = new Date();\n date.setDate(date.getDate() + days);\n return date.toISOString();\n};\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport { EyeIcon, EyeOffIcon, RotateCwIcon, TrashIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useDevPortal } from \"../../components/context/DevPortalProvider.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { ApiKeyService } from \"./index.js\";\n\nexport const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {\n const context = useDevPortal();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery({\n queryFn: () => service.getKeys(context),\n queryKey: [\"api-keys\"],\n retry: false,\n });\n\n const deleteKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.deleteKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n return service.deleteKey(id, context);\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [\"api-keys\"] });\n },\n });\n\n return (\n <div className=\"max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b border-border pb-3\">\n <h1 className=\"font-medium text-2xl\">API Keys</h1>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n\n {data.length === 0 ? (\n <div className=\"flex flex-col justify-center gap-4 items-center h-1/2 my-8\">\n <div className=\"text-center\">\n No API keys created yet.\n <br />\n Get started and create the first one now\n </div>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n ) : (\n <ul className=\"grid grid-cols-[minmax(250px,min-content)_1fr_min-content] \">\n {data.map((key: any) => (\n <li\n className=\"border-b border-border p-5 grid grid-cols-subgrid col-span-full gap-2 items-center\"\n key={key.id}\n >\n <div className=\"flex flex-col gap-1 text-sm\">\n {key.description ?? key.id}\n <div className=\"text-muted-foreground text-xs\">\n {key.createdOn && (\n <div>\n Created on {new Date(key.createdOn).toLocaleDateString()}\n </div>\n )}\n {key.expiresOn && (\n <div>\n Expires on {new Date(key.expiresOn).toLocaleDateString()}\n </div>\n )}\n </div>\n </div>\n <div className=\"items-center flex justify-center\">\n <RevealApiKey apiKey={key.key} />\n </div>\n <div className=\"flex gap-2\">\n {service.rollKey && (\n <Button size=\"icon\">\n <RotateCwIcon size={16} />\n </Button>\n )}\n {service.deleteKey && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (!confirm(\"Do you want to delete this key?\")) {\n return;\n }\n\n deleteKeyMutation.mutate(key.id);\n }}\n disabled={deleteKeyMutation.isPending}\n >\n <TrashIcon size={16} />\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nconst RevealApiKey = ({ apiKey }: { apiKey: string }) => {\n const [revealed, setRevealed] = useState(false);\n\n return (\n <div className=\"flex gap-2 items-center text-sm\">\n <code className=\"border border-border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono\">\n {revealed ? apiKey : \"•\".repeat(apiKey.length)}\n </code>\n <Button\n variant=\"outline\"\n onClick={() => setRevealed((prev) => !prev)}\n size=\"icon\"\n >\n {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}\n </Button>\n </div>\n );\n};\n","import { Outlet, type RouteObject } from \"react-router-dom\";\nimport invariant from \"tiny-invariant\";\nimport { useAuth } from \"../../authentication/hook.js\";\nimport { DevPortalContext } from \"../../core/DevPortalContext.js\";\nimport {\n type ApiIdentityPlugin,\n type DevPortalPlugin,\n} from \"../../core/plugins.js\";\nimport { RouterError } from \"../../errors/RouterError.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { CreateApiKey } from \"./CreateApiKey.js\";\nimport { SettingsApiKeys } from \"./SettingsApiKeys.js\";\n\nexport type ApiKeyResults = Promise<ApiKey[]>;\nconst DEFAULT_API_KEY_ENDPOINT =\n \"https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev\";\n\nexport type ApiKeyService = {\n getKeys: (context: DevPortalContext) => ApiKeyResults;\n rollKey?: (id: string, context: DevPortalContext) => Promise<void>;\n deleteKey?: (id: string, context: DevPortalContext) => Promise<void>;\n updateKeyDescription?: (\n apiKey: { jd: string; description: string },\n context: DevPortalContext,\n ) => Promise<void>;\n getUsage?: (apiKeys: string[], context: DevPortalContext) => Promise<void>;\n createKey?: (\n apiKey: { description: string; expiresOn?: string },\n context: DevPortalContext,\n ) => Promise<void>;\n};\n\nexport type GetApiKeysOptions = ApiKeyService | { endpoint: string } | object;\n\nexport type ApiKeyPluginOptions = object & GetApiKeysOptions;\n\nexport interface ApiKey {\n id: string;\n description?: string;\n createdOn?: string;\n updatedOn?: string;\n expiresOn?: string;\n key: string;\n}\n\nconst createDefaultHandler = (endpoint: string): ApiKeyService => {\n return {\n deleteKey: async (id, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys/${id}`, {\n method: \"DELETE\",\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to delete API key\");\n },\n createKey: async (apiKey, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(apiKey),\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to create API key\");\n },\n getKeys: async (context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`);\n\n await context.signRequest(request);\n\n const keys = await fetch(request);\n invariant(keys.ok, \"Failed to fetch API keys\");\n\n return await keys.json();\n },\n };\n};\n\nconst ProtectedRoute = () => {\n const auth = useAuth();\n\n // TODO: should we suspend here somehow?\n if (auth.isPending) {\n return null;\n }\n\n return auth.isAuthenticated ? (\n <Outlet />\n ) : (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2 my-12\">\n Please login first to view this page\n <Button onClick={() => auth.login()}>Login</Button>\n </div>\n );\n};\n\nexport const apiKeyPlugin = (\n options: ApiKeyPluginOptions,\n): DevPortalPlugin & ApiIdentityPlugin => {\n const endpoint =\n \"endpoint\" in options ? options.endpoint : DEFAULT_API_KEY_ENDPOINT;\n\n const service =\n \"getKeys\" in options ? options : createDefaultHandler(endpoint);\n\n return {\n getIdentities: async (context) => {\n try {\n const keys = await service.getKeys(context);\n\n return keys.map((key) => ({\n authorizeRequest: (request) => {\n request.headers.set(\"Authorization\", `Bearer ${key.key}`);\n return request;\n },\n id: key.id,\n label: key.description ?? key.id,\n }));\n } catch {\n return [];\n }\n },\n getRoutes: (): RouteObject[] => {\n // TODO: Make lazy\n return [\n {\n element: <ProtectedRoute />,\n errorElement: <RouterError />,\n children: [\n {\n path: \"/settings/api-keys\",\n element: <SettingsApiKeys service={service} />,\n },\n {\n path: \"/settings/api-keys/new\",\n element: <CreateApiKey service={service} />,\n },\n ],\n },\n ];\n },\n };\n};\n"],"names":["EyeOff","createLucideIcon","Eye","RotateCw","Trash","Unlink","useSuspenseQuery","options","queryClient","skipToken","useBaseQuery","defaultThrowOnError","QueryObserver","isProduction","prefix","invariant","condition","message","provided","value","NotFoundPage","useParams","ProseClasses","jsx","CategoryHeading","Heading","UnlinkIcon","Link","RouterError","error","useRouteError","isRouteErrorResponse","ErrorAlert","Input","React","className","type","props","ref","cn","CreateApiKey","service","context","useDevPortal","navigate","useNavigate","form","useForm","createKeyMutation","useMutation","description","expiresOn","expiresOnDate","addDaysToDate","jsxs","data","Select","SelectTrigger","SelectValue","SelectContent","SelectGroup","option","SelectItem","Button","days","date","SettingsApiKeys","useQueryClient","deleteKeyMutation","id","key","RevealApiKey","RotateCwIcon","TrashIcon","apiKey","revealed","setRevealed","useState","prev","EyeOffIcon","EyeIcon","DEFAULT_API_KEY_ENDPOINT","createDefaultHandler","endpoint","request","response","keys","ProtectedRoute","auth","useAuth","Outlet","apiKeyPlugin"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
|
|
1
|
+
{"version":3,"file":"zudoku.plugin-api-keys.js","sources":["../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/eye-off.js","../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/eye.js","../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../../../node_modules/.pnpm/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash.js","../../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../src/lib/components/Input.tsx","../src/lib/plugins/api-keys/CreateApiKey.tsx","../src/lib/plugins/api-keys/SettingsApiKeys.tsx","../src/lib/plugins/api-keys/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\"path\", { d: \"M9.88 9.88a3 3 0 1 0 4.24 4.24\", key: \"1jxqfv\" }],\n [\n \"path\",\n {\n d: \"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\",\n key: \"9wicm4\"\n }\n ],\n [\n \"path\",\n { d: \"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\", key: \"1jreej\" }\n ],\n [\"line\", { x1: \"2\", x2: \"22\", y1: \"2\", y2: \"22\", key: \"a6p6uj\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\"path\", { d: \"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\", key: \"rwhkz3\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCw = createLucideIcon(\"RotateCw\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n]);\n\nexport { RotateCw as default };\n//# sourceMappingURL=rotate-cw.js.map\n","/**\n * @license lucide-react v0.378.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Trash = createLucideIcon(\"Trash\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }]\n]);\n\nexport { Trash as default };\n//# sourceMappingURL=trash.js.map\n","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import * as React from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import { useMutation } from \"@tanstack/react-query\";\nimport { useForm } from \"react-hook-form\";\nimport { Link, useNavigate } from \"react-router-dom\";\nimport { useDevPortal } from \"../../components/context/DevPortalProvider.js\";\nimport { Input } from \"../../components/Input.js\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/Select.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { ApiKeyService } from \"./index.js\";\n\ntype CreateApiKey = { description: string; expiresOn?: string };\n\nexport const CreateApiKey = ({ service }: { service: ApiKeyService }) => {\n const context = useDevPortal();\n const navigate = useNavigate();\n const form = useForm<CreateApiKey>({\n defaultValues: {\n expiresOn: \"30\",\n },\n });\n const createKeyMutation = useMutation({\n mutationFn: ({ description, expiresOn }: CreateApiKey) => {\n if (!service.createKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n const expiresOnDate =\n expiresOn !== \"never\" ? addDaysToDate(Number(expiresOn)) : undefined;\n\n return service.createKey(\n { description: description, expiresOn: expiresOnDate },\n context,\n );\n },\n onSuccess: () => navigate(\"/settings/api-keys/\"),\n });\n\n if (!service.createKey) {\n return null;\n }\n\n return (\n <div className=\"max-w-screen-lg pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b border-border pb-1\">\n <h1 className=\"font-medium text-2xl\">New API Key</h1>\n </div>\n <form\n onSubmit={form.handleSubmit((data) => createKeyMutation.mutate(data))}\n >\n <div className=\"flex gap-2 flex-col\">\n Note\n <Input {...form.register(\"description\")} />\n Expiration\n <Select\n onValueChange={(value) => form.setValue(\"expiresOn\", value)}\n defaultValue={form.getValues(\"expiresOn\")}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {[7, 30, 60, 90].map((option) => (\n <SelectItem value={String(option)} key={option}>\n {option} days\n </SelectItem>\n ))}\n <SelectItem value=\"never\">Never</SelectItem>\n </SelectGroup>\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button>Generate Key</Button>\n <Button variant=\"outline\" asChild>\n <Link to=\"/settings/api-keys/\">Cancel</Link>\n </Button>\n </div>\n </div>\n </form>\n </div>\n );\n};\n\nconst addDaysToDate = (days: number): string => {\n const date = new Date();\n date.setDate(date.getDate() + days);\n return date.toISOString();\n};\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport { EyeIcon, EyeOffIcon, RotateCwIcon, TrashIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useDevPortal } from \"../../components/context/DevPortalProvider.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { ApiKeyService } from \"./index.js\";\n\nexport const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {\n const context = useDevPortal();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery({\n queryFn: () => service.getKeys(context),\n queryKey: [\"api-keys\"],\n retry: false,\n });\n\n const deleteKeyMutation = useMutation({\n mutationFn: (id: string) => {\n if (!service.deleteKey) {\n throw new Error(\"deleteKey not implemented\");\n }\n\n return service.deleteKey(id, context);\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: [\"api-keys\"] });\n },\n });\n\n return (\n <div className=\"max-w-screen-lg h-full pt-[--padding-content-top] pb-[--padding-content-bottom]\">\n <div className=\"flex justify-between mb-4 border-b border-border pb-3\">\n <h1 className=\"font-medium text-2xl\">API Keys</h1>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n\n {data.length === 0 ? (\n <div className=\"flex flex-col justify-center gap-4 items-center h-1/2 my-8\">\n <div className=\"text-center\">\n No API keys created yet.\n <br />\n Get started and create the first one now\n </div>\n {service.createKey && (\n <Button asChild>\n <Link to=\"/settings/api-keys/new\">Create API Key</Link>\n </Button>\n )}\n </div>\n ) : (\n <ul className=\"grid grid-cols-[minmax(250px,min-content)_1fr_min-content] \">\n {data.map((key: any) => (\n <li\n className=\"border-b border-border p-5 grid grid-cols-subgrid col-span-full gap-2 items-center\"\n key={key.id}\n >\n <div className=\"flex flex-col gap-1 text-sm\">\n {key.description ?? key.id}\n <div className=\"text-muted-foreground text-xs\">\n {key.createdOn && (\n <div>\n Created on {new Date(key.createdOn).toLocaleDateString()}\n </div>\n )}\n {key.expiresOn && (\n <div>\n Expires on {new Date(key.expiresOn).toLocaleDateString()}\n </div>\n )}\n </div>\n </div>\n <div className=\"items-center flex justify-center\">\n <RevealApiKey apiKey={key.key} />\n </div>\n <div className=\"flex gap-2\">\n {service.rollKey && (\n <Button size=\"icon\">\n <RotateCwIcon size={16} />\n </Button>\n )}\n {service.deleteKey && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (!confirm(\"Do you want to delete this key?\")) {\n return;\n }\n\n deleteKeyMutation.mutate(key.id);\n }}\n disabled={deleteKeyMutation.isPending}\n >\n <TrashIcon size={16} />\n </Button>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nconst RevealApiKey = ({ apiKey }: { apiKey: string }) => {\n const [revealed, setRevealed] = useState(false);\n\n return (\n <div className=\"flex gap-2 items-center text-sm\">\n <code className=\"border border-border rounded bg-gray-100 dark:bg-gray-950 p-1 font-mono\">\n {revealed ? apiKey : \"•\".repeat(apiKey.length)}\n </code>\n <Button\n variant=\"outline\"\n onClick={() => setRevealed((prev) => !prev)}\n size=\"icon\"\n >\n {revealed ? <EyeOffIcon size={16} /> : <EyeIcon size={16} />}\n </Button>\n </div>\n );\n};\n","import { Outlet, type RouteObject } from \"react-router-dom\";\nimport invariant from \"tiny-invariant\";\nimport { useAuth } from \"../../authentication/hook.js\";\nimport { DevPortalContext } from \"../../core/DevPortalContext.js\";\nimport {\n type ApiIdentityPlugin,\n type DevPortalPlugin,\n} from \"../../core/plugins.js\";\nimport { RouterError } from \"../../errors/RouterError.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { CreateApiKey } from \"./CreateApiKey.js\";\nimport { SettingsApiKeys } from \"./SettingsApiKeys.js\";\n\nexport type ApiKeyResults = Promise<ApiKey[]>;\nconst DEFAULT_API_KEY_ENDPOINT =\n \"https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev\";\n\nexport type ApiKeyService = {\n getKeys: (context: DevPortalContext) => ApiKeyResults;\n rollKey?: (id: string, context: DevPortalContext) => Promise<void>;\n deleteKey?: (id: string, context: DevPortalContext) => Promise<void>;\n updateKeyDescription?: (\n apiKey: { jd: string; description: string },\n context: DevPortalContext,\n ) => Promise<void>;\n getUsage?: (apiKeys: string[], context: DevPortalContext) => Promise<void>;\n createKey?: (\n apiKey: { description: string; expiresOn?: string },\n context: DevPortalContext,\n ) => Promise<void>;\n};\n\nexport type GetApiKeysOptions = ApiKeyService | { endpoint: string } | object;\n\nexport type ApiKeyPluginOptions = object & GetApiKeysOptions;\n\nexport interface ApiKey {\n id: string;\n description?: string;\n createdOn?: string;\n updatedOn?: string;\n expiresOn?: string;\n key: string;\n}\n\nconst createDefaultHandler = (endpoint: string): ApiKeyService => {\n return {\n deleteKey: async (id, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys/${id}`, {\n method: \"DELETE\",\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to delete API key\");\n },\n createKey: async (apiKey, context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(apiKey),\n });\n\n await context.signRequest(request);\n\n const response = await fetch(request);\n invariant(response.ok, \"Failed to create API key\");\n },\n getKeys: async (context) => {\n const request = new Request(endpoint + `/v1/developer/api-keys`);\n\n await context.signRequest(request);\n\n const keys = await fetch(request);\n invariant(keys.ok, \"Failed to fetch API keys\");\n\n return await keys.json();\n },\n };\n};\n\nconst ProtectedRoute = () => {\n const auth = useAuth();\n\n // TODO: should we suspend here somehow?\n if (auth.isPending) {\n return null;\n }\n\n return auth.isAuthenticated ? (\n <Outlet />\n ) : (\n <div className=\"flex flex-col justify-center gap-2 items-center h-1/2 my-12\">\n Please login first to view this page\n <Button onClick={() => auth.login()}>Login</Button>\n </div>\n );\n};\n\nexport const apiKeyPlugin = (\n options: ApiKeyPluginOptions,\n): DevPortalPlugin & ApiIdentityPlugin => {\n const endpoint =\n \"endpoint\" in options ? options.endpoint : DEFAULT_API_KEY_ENDPOINT;\n\n const service =\n \"getKeys\" in options ? options : createDefaultHandler(endpoint);\n\n return {\n getIdentities: async (context) => {\n try {\n const keys = await service.getKeys(context);\n\n return keys.map((key) => ({\n authorizeRequest: (request) => {\n request.headers.set(\"Authorization\", `Bearer ${key.key}`);\n return request;\n },\n id: key.id,\n label: key.description ?? key.id,\n }));\n } catch {\n return [];\n }\n },\n getRoutes: (): RouteObject[] => {\n // TODO: Make lazy\n return [\n {\n element: <ProtectedRoute />,\n errorElement: <RouterError />,\n children: [\n {\n path: \"/settings/api-keys\",\n element: <SettingsApiKeys service={service} />,\n },\n {\n path: \"/settings/api-keys/new\",\n element: <CreateApiKey service={service} />,\n },\n ],\n },\n ];\n },\n };\n};\n"],"names":["EyeOff","createLucideIcon","Eye","RotateCw","Trash","isProduction","prefix","invariant","condition","message","provided","value","Input","React","className","type","props","ref","jsx","cn","CreateApiKey","service","context","useDevPortal","navigate","useNavigate","form","useForm","createKeyMutation","useMutation","description","expiresOn","expiresOnDate","addDaysToDate","jsxs","data","Select","SelectTrigger","SelectValue","SelectContent","SelectGroup","option","SelectItem","Button","Link","days","date","SettingsApiKeys","queryClient","useQueryClient","useSuspenseQuery","deleteKeyMutation","id","key","RevealApiKey","RotateCwIcon","TrashIcon","apiKey","revealed","setRevealed","useState","prev","EyeOffIcon","EyeIcon","DEFAULT_API_KEY_ENDPOINT","createDefaultHandler","endpoint","request","response","keys","ProtectedRoute","auth","useAuth","Outlet","apiKeyPlugin","options","RouterError"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
|
|
@@ -1,5 +1,49 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { j as s, N as x } from "./jsx-runtime-Bt86M5tA.js";
|
|
2
|
+
import { k as d } from "./DevPortalProvider-Demv4Ngx.js";
|
|
3
|
+
import { t as f, i as g } from "./util-CYBrkBUo.js";
|
|
4
|
+
const h = (t, e) => {
|
|
5
|
+
const r = Object.entries(t).flatMap(
|
|
6
|
+
([n, m]) => {
|
|
7
|
+
const a = n.match(/pages\/(.*).mdx?$/), o = a == null ? void 0 : a.at(1);
|
|
8
|
+
if (!o) return [];
|
|
9
|
+
const i = o.split("/");
|
|
10
|
+
return {
|
|
11
|
+
path: i.at(-1) === "index" ? i.slice(0, -1).join("/") : o,
|
|
12
|
+
lazy: async () => {
|
|
13
|
+
const { MdxPage: u } = await import("./MdxPage-s9RlKFtt.js"), { default: c, ...l } = await m();
|
|
14
|
+
return {
|
|
15
|
+
element: /* @__PURE__ */ s.jsx(
|
|
16
|
+
u,
|
|
17
|
+
{
|
|
18
|
+
mdxComponent: c,
|
|
19
|
+
...l,
|
|
20
|
+
defaultOptions: e
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
), p = Array.from(
|
|
28
|
+
new Set(r.map((n) => n.path.split("/").at(0)))
|
|
29
|
+
).map((n) => ({
|
|
30
|
+
path: `/${n}`,
|
|
31
|
+
element: /* @__PURE__ */ s.jsx(j, {})
|
|
32
|
+
}));
|
|
33
|
+
return [...r, ...p];
|
|
34
|
+
}, j = () => {
|
|
35
|
+
const t = d();
|
|
36
|
+
return t ? f(t, (e, r) => {
|
|
37
|
+
if (!("children" in e || !g(e)))
|
|
38
|
+
return /* @__PURE__ */ s.jsx(x, { to: r, replace: !0 });
|
|
39
|
+
}) : null;
|
|
40
|
+
}, N = ({
|
|
41
|
+
markdownFiles: t,
|
|
42
|
+
defaultOptions: e
|
|
43
|
+
}) => ({
|
|
44
|
+
getRoutes: () => h(t, e)
|
|
45
|
+
});
|
|
2
46
|
export {
|
|
3
|
-
|
|
47
|
+
N as markdownPlugin
|
|
4
48
|
};
|
|
5
49
|
//# sourceMappingURL=zudoku.plugin-markdown.js.map
|