zudoku 0.3.0-dev.34 → 0.3.0-dev.35
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 -2
- 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 +3 -0
- package/dist/lib/components/index.js +2 -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-DCzimaMt.js +704 -0
- package/lib/AnchorLink-DCzimaMt.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-CL8KPvJN.js → Markdown-kde-UTpz.js} +3 -3
- package/lib/{Markdown-CL8KPvJN.js.map → Markdown-kde-UTpz.js.map} +1 -1
- package/lib/{MdxComponents-Ev_hBHb2.js → MdxComponents-BZ-Y_6jI.js} +8 -8
- package/lib/{MdxComponents-Ev_hBHb2.js.map → MdxComponents-BZ-Y_6jI.js.map} +1 -1
- package/lib/{MdxPage-BRKQDcVW.js → MdxPage-CGTgSCJL.js} +108 -113
- package/lib/MdxPage-CGTgSCJL.js.map +1 -0
- package/lib/{OperationList-DfkWNe8Y.js → OperationList-BDAtLdf9.js} +1693 -1862
- package/lib/OperationList-BDAtLdf9.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-DIOQWPp3.js +4571 -0
- package/lib/Select-DIOQWPp3.js.map +1 -0
- package/lib/Spinner-B9MAj2Pw.js +182 -0
- package/lib/Spinner-B9MAj2Pw.js.map +1 -0
- package/lib/{hook-CTmJ6CWq.js → hook-D1DiFbcT.js} +3 -3
- package/lib/{hook-CTmJ6CWq.js.map → hook-D1DiFbcT.js.map} +1 -1
- package/lib/index-BB2EBBgh.js +412 -0
- package/lib/index-BB2EBBgh.js.map +1 -0
- package/lib/{index-BjSy8IQO.js → index-CdZQPXUQ.js} +6 -6
- package/lib/{index-BjSy8IQO.js.map → index-CdZQPXUQ.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 +563 -286
- package/lib/zudoku.components.js.map +1 -1
- package/lib/zudoku.plugin-api-keys.js +99 -111
- 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 -2
- package/src/lib/components/DevPortal.tsx +15 -1
- package/src/lib/components/Layout.tsx +9 -0
- package/src/lib/components/index.ts +2 -0
- package/src/lib/plugins/markdown/MdxPage.tsx +6 -0
- package/lib/DevPortalProvider-BlxLX6GG.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/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,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { E as
|
|
3
|
-
import { c, H as N, L as d,
|
|
4
|
-
import { P as E, C as P } from "./Markdown-
|
|
1
|
+
import { b as g, j as e, c as j, a as v, O as b } from "./jsx-runtime-Bt86M5tA.js";
|
|
2
|
+
import { E as w, u as k } from "./hook-D1DiFbcT.js";
|
|
3
|
+
import { c as l, H as N, L as d, d as K } from "./MdxComponents-BZ-Y_6jI.js";
|
|
4
|
+
import { P as E, C as P } from "./Markdown-kde-UTpz.js";
|
|
5
5
|
import { i as C } from "./router-CcYTwKjf.js";
|
|
6
|
-
import { u as
|
|
7
|
-
import {
|
|
8
|
-
import * as
|
|
9
|
-
import { useState as
|
|
6
|
+
import { u as R, a as h, S, b as A, c as q, d as I, e as D, f as p, B as o } from "./Select-DIOQWPp3.js";
|
|
7
|
+
import { u as m, q as O, t as z } from "./DevPortalProvider-Demv4Ngx.js";
|
|
8
|
+
import * as M from "react";
|
|
9
|
+
import { useState as L } from "react";
|
|
10
10
|
/**
|
|
11
11
|
* @license lucide-react v0.378.0 - ISC
|
|
12
12
|
*
|
|
13
13
|
* This source code is licensed under the ISC license.
|
|
14
14
|
* See the LICENSE file in the root directory of this source tree.
|
|
15
15
|
*/
|
|
16
|
-
const
|
|
16
|
+
const F = l("EyeOff", [
|
|
17
17
|
["path", { d: "M9.88 9.88a3 3 0 1 0 4.24 4.24", key: "1jxqfv" }],
|
|
18
18
|
[
|
|
19
19
|
"path",
|
|
@@ -34,7 +34,7 @@ const _ = c("EyeOff", [
|
|
|
34
34
|
* This source code is licensed under the ISC license.
|
|
35
35
|
* See the LICENSE file in the root directory of this source tree.
|
|
36
36
|
*/
|
|
37
|
-
const
|
|
37
|
+
const T = l("Eye", [
|
|
38
38
|
["path", { d: "M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z", key: "rwhkz3" }],
|
|
39
39
|
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
40
40
|
]);
|
|
@@ -44,7 +44,7 @@ const Q = c("Eye", [
|
|
|
44
44
|
* This source code is licensed under the ISC license.
|
|
45
45
|
* See the LICENSE file in the root directory of this source tree.
|
|
46
46
|
*/
|
|
47
|
-
const
|
|
47
|
+
const V = l("RotateCw", [
|
|
48
48
|
["path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8", key: "1p45f6" }],
|
|
49
49
|
["path", { d: "M21 3v5h-5", key: "1q7to0" }]
|
|
50
50
|
]);
|
|
@@ -54,7 +54,7 @@ const H = c("RotateCw", [
|
|
|
54
54
|
* This source code is licensed under the ISC license.
|
|
55
55
|
* See the LICENSE file in the root directory of this source tree.
|
|
56
56
|
*/
|
|
57
|
-
const
|
|
57
|
+
const _ = l("Trash", [
|
|
58
58
|
["path", { d: "M3 6h18", key: "d0wm0j" }],
|
|
59
59
|
["path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6", key: "4alrt4" }],
|
|
60
60
|
["path", { d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2", key: "v07s0e" }]
|
|
@@ -65,7 +65,7 @@ const B = c("Trash", [
|
|
|
65
65
|
* This source code is licensed under the ISC license.
|
|
66
66
|
* See the LICENSE file in the root directory of this source tree.
|
|
67
67
|
*/
|
|
68
|
-
const
|
|
68
|
+
const H = l("Unlink", [
|
|
69
69
|
[
|
|
70
70
|
"path",
|
|
71
71
|
{
|
|
@@ -85,69 +85,57 @@ const G = c("Unlink", [
|
|
|
85
85
|
["line", { x1: "16", x2: "16", y1: "19", y2: "22", key: "rzdirn" }],
|
|
86
86
|
["line", { x1: "19", x2: "22", y1: "16", y2: "16", key: "ox905f" }]
|
|
87
87
|
]);
|
|
88
|
-
|
|
89
|
-
|
|
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) {
|
|
88
|
+
var G = process.env.NODE_ENV === "production", u = "Invariant failed";
|
|
89
|
+
function x(t, n) {
|
|
102
90
|
if (!t) {
|
|
103
|
-
if (
|
|
91
|
+
if (G)
|
|
104
92
|
throw new Error(u);
|
|
105
|
-
var a = typeof
|
|
106
|
-
throw new Error(
|
|
93
|
+
var a = typeof n == "function" ? n() : n, r = a ? "".concat(u, ": ").concat(a) : u;
|
|
94
|
+
throw new Error(r);
|
|
107
95
|
}
|
|
108
96
|
}
|
|
109
|
-
const
|
|
97
|
+
const U = () => (g(), /* @__PURE__ */ e.jsxs("div", { className: E + " h-full pt-[--padding-content-top]", children: [
|
|
110
98
|
/* @__PURE__ */ e.jsx(P, { children: "404" }),
|
|
111
99
|
/* @__PURE__ */ e.jsxs(N, { level: 1, className: "flex gap-3.5 items-center", children: [
|
|
112
100
|
"Page not found",
|
|
113
|
-
/* @__PURE__ */ e.jsx(
|
|
101
|
+
/* @__PURE__ */ e.jsx(H, { size: 24 })
|
|
114
102
|
] }),
|
|
115
103
|
!1,
|
|
116
104
|
/* @__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
105
|
/* @__PURE__ */ e.jsx(d, { to: "/", children: "Go back home" })
|
|
118
106
|
] }));
|
|
119
|
-
function
|
|
107
|
+
function B() {
|
|
120
108
|
const t = j();
|
|
121
|
-
return C(t) && t.status === 404 ? /* @__PURE__ */ e.jsx(
|
|
109
|
+
return C(t) && t.status === 404 ? /* @__PURE__ */ e.jsx(U, {}) : /* @__PURE__ */ e.jsx(w, { error: t });
|
|
122
110
|
}
|
|
123
|
-
const
|
|
124
|
-
({ className: t, type:
|
|
111
|
+
const y = M.forwardRef(
|
|
112
|
+
({ className: t, type: n, ...a }, r) => /* @__PURE__ */ e.jsx(
|
|
125
113
|
"input",
|
|
126
114
|
{
|
|
127
|
-
type:
|
|
115
|
+
type: n,
|
|
128
116
|
className: K(
|
|
129
117
|
"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
118
|
t
|
|
131
119
|
),
|
|
132
|
-
ref:
|
|
120
|
+
ref: r,
|
|
133
121
|
...a
|
|
134
122
|
}
|
|
135
123
|
)
|
|
136
124
|
);
|
|
137
|
-
|
|
138
|
-
const
|
|
139
|
-
const
|
|
125
|
+
y.displayName = "Input";
|
|
126
|
+
const Q = ({ service: t }) => {
|
|
127
|
+
const n = m(), a = v(), r = R({
|
|
140
128
|
defaultValues: {
|
|
141
129
|
expiresOn: "30"
|
|
142
130
|
}
|
|
143
131
|
}), i = h({
|
|
144
|
-
mutationFn: ({ description:
|
|
132
|
+
mutationFn: ({ description: s, expiresOn: c }) => {
|
|
145
133
|
if (!t.createKey)
|
|
146
134
|
throw new Error("deleteKey not implemented");
|
|
147
|
-
const f =
|
|
135
|
+
const f = c !== "never" ? $(Number(c)) : void 0;
|
|
148
136
|
return t.createKey(
|
|
149
|
-
{ description:
|
|
150
|
-
|
|
137
|
+
{ description: s, expiresOn: f },
|
|
138
|
+
n
|
|
151
139
|
);
|
|
152
140
|
},
|
|
153
141
|
onSuccess: () => a("/settings/api-keys/")
|
|
@@ -157,24 +145,24 @@ const Z = ({ service: t }) => {
|
|
|
157
145
|
/* @__PURE__ */ e.jsx(
|
|
158
146
|
"form",
|
|
159
147
|
{
|
|
160
|
-
onSubmit:
|
|
148
|
+
onSubmit: r.handleSubmit((s) => i.mutate(s)),
|
|
161
149
|
children: /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2 flex-col", children: [
|
|
162
150
|
"Note",
|
|
163
|
-
/* @__PURE__ */ e.jsx(
|
|
151
|
+
/* @__PURE__ */ e.jsx(y, { ...r.register("description") }),
|
|
164
152
|
"Expiration",
|
|
165
153
|
/* @__PURE__ */ e.jsxs(
|
|
166
|
-
|
|
154
|
+
S,
|
|
167
155
|
{
|
|
168
|
-
onValueChange: (
|
|
169
|
-
defaultValue:
|
|
156
|
+
onValueChange: (s) => r.setValue("expiresOn", s),
|
|
157
|
+
defaultValue: r.getValues("expiresOn"),
|
|
170
158
|
children: [
|
|
171
|
-
/* @__PURE__ */ e.jsx(
|
|
172
|
-
/* @__PURE__ */ e.jsx(
|
|
173
|
-
[7, 30, 60, 90].map((
|
|
174
|
-
|
|
159
|
+
/* @__PURE__ */ e.jsx(A, { children: /* @__PURE__ */ e.jsx(q, {}) }),
|
|
160
|
+
/* @__PURE__ */ e.jsx(I, { children: /* @__PURE__ */ e.jsxs(D, { children: [
|
|
161
|
+
[7, 30, 60, 90].map((s) => /* @__PURE__ */ e.jsxs(p, { value: String(s), children: [
|
|
162
|
+
s,
|
|
175
163
|
" days"
|
|
176
|
-
] },
|
|
177
|
-
/* @__PURE__ */ e.jsx(
|
|
164
|
+
] }, s)),
|
|
165
|
+
/* @__PURE__ */ e.jsx(p, { value: "never", children: "Never" })
|
|
178
166
|
] }) })
|
|
179
167
|
]
|
|
180
168
|
}
|
|
@@ -187,19 +175,19 @@ const Z = ({ service: t }) => {
|
|
|
187
175
|
}
|
|
188
176
|
)
|
|
189
177
|
] }) : null;
|
|
190
|
-
},
|
|
191
|
-
const
|
|
192
|
-
return
|
|
193
|
-
},
|
|
194
|
-
const
|
|
195
|
-
queryFn: () => t.getKeys(
|
|
178
|
+
}, $ = (t) => {
|
|
179
|
+
const n = /* @__PURE__ */ new Date();
|
|
180
|
+
return n.setDate(n.getDate() + t), n.toISOString();
|
|
181
|
+
}, J = ({ service: t }) => {
|
|
182
|
+
const n = m(), a = O(), { data: r } = z({
|
|
183
|
+
queryFn: () => t.getKeys(n),
|
|
196
184
|
queryKey: ["api-keys"],
|
|
197
185
|
retry: !1
|
|
198
186
|
}), i = h({
|
|
199
|
-
mutationFn: (
|
|
187
|
+
mutationFn: (s) => {
|
|
200
188
|
if (!t.deleteKey)
|
|
201
189
|
throw new Error("deleteKey not implemented");
|
|
202
|
-
return t.deleteKey(
|
|
190
|
+
return t.deleteKey(s, n);
|
|
203
191
|
},
|
|
204
192
|
onSuccess: () => {
|
|
205
193
|
a.invalidateQueries({ queryKey: ["api-keys"] });
|
|
@@ -210,108 +198,108 @@ const Z = ({ service: t }) => {
|
|
|
210
198
|
/* @__PURE__ */ e.jsx("h1", { className: "font-medium text-2xl", children: "API Keys" }),
|
|
211
199
|
t.createKey && /* @__PURE__ */ e.jsx(o, { asChild: !0, children: /* @__PURE__ */ e.jsx(d, { to: "/settings/api-keys/new", children: "Create API Key" }) })
|
|
212
200
|
] }),
|
|
213
|
-
|
|
201
|
+
r.length === 0 ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-4 items-center h-1/2 my-8", children: [
|
|
214
202
|
/* @__PURE__ */ e.jsxs("div", { className: "text-center", children: [
|
|
215
203
|
"No API keys created yet.",
|
|
216
204
|
/* @__PURE__ */ e.jsx("br", {}),
|
|
217
205
|
"Get started and create the first one now"
|
|
218
206
|
] }),
|
|
219
207
|
t.createKey && /* @__PURE__ */ e.jsx(o, { asChild: !0, children: /* @__PURE__ */ e.jsx(d, { to: "/settings/api-keys/new", children: "Create API Key" }) })
|
|
220
|
-
] }) : /* @__PURE__ */ e.jsx("ul", { className: "grid grid-cols-[minmax(250px,min-content)_1fr_min-content] ", children:
|
|
208
|
+
] }) : /* @__PURE__ */ e.jsx("ul", { className: "grid grid-cols-[minmax(250px,min-content)_1fr_min-content] ", children: r.map((s) => /* @__PURE__ */ e.jsxs(
|
|
221
209
|
"li",
|
|
222
210
|
{
|
|
223
211
|
className: "border-b border-border p-5 grid grid-cols-subgrid col-span-full gap-2 items-center",
|
|
224
212
|
children: [
|
|
225
213
|
/* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-1 text-sm", children: [
|
|
226
|
-
|
|
214
|
+
s.description ?? s.id,
|
|
227
215
|
/* @__PURE__ */ e.jsxs("div", { className: "text-muted-foreground text-xs", children: [
|
|
228
|
-
|
|
216
|
+
s.createdOn && /* @__PURE__ */ e.jsxs("div", { children: [
|
|
229
217
|
"Created on ",
|
|
230
|
-
new Date(
|
|
218
|
+
new Date(s.createdOn).toLocaleDateString()
|
|
231
219
|
] }),
|
|
232
|
-
|
|
220
|
+
s.expiresOn && /* @__PURE__ */ e.jsxs("div", { children: [
|
|
233
221
|
"Expires on ",
|
|
234
|
-
new Date(
|
|
222
|
+
new Date(s.expiresOn).toLocaleDateString()
|
|
235
223
|
] })
|
|
236
224
|
] })
|
|
237
225
|
] }),
|
|
238
|
-
/* @__PURE__ */ e.jsx("div", { className: "items-center flex justify-center", children: /* @__PURE__ */ e.jsx(
|
|
226
|
+
/* @__PURE__ */ e.jsx("div", { className: "items-center flex justify-center", children: /* @__PURE__ */ e.jsx(Y, { apiKey: s.key }) }),
|
|
239
227
|
/* @__PURE__ */ e.jsxs("div", { className: "flex gap-2", children: [
|
|
240
|
-
t.rollKey && /* @__PURE__ */ e.jsx(o, { size: "icon", children: /* @__PURE__ */ e.jsx(
|
|
228
|
+
t.rollKey && /* @__PURE__ */ e.jsx(o, { size: "icon", children: /* @__PURE__ */ e.jsx(V, { size: 16 }) }),
|
|
241
229
|
t.deleteKey && /* @__PURE__ */ e.jsx(
|
|
242
230
|
o,
|
|
243
231
|
{
|
|
244
232
|
variant: "ghost",
|
|
245
233
|
size: "icon",
|
|
246
234
|
onClick: () => {
|
|
247
|
-
confirm("Do you want to delete this key?") && i.mutate(
|
|
235
|
+
confirm("Do you want to delete this key?") && i.mutate(s.id);
|
|
248
236
|
},
|
|
249
237
|
disabled: i.isPending,
|
|
250
|
-
children: /* @__PURE__ */ e.jsx(
|
|
238
|
+
children: /* @__PURE__ */ e.jsx(_, { size: 16 })
|
|
251
239
|
}
|
|
252
240
|
)
|
|
253
241
|
] })
|
|
254
242
|
]
|
|
255
243
|
},
|
|
256
|
-
|
|
244
|
+
s.id
|
|
257
245
|
)) })
|
|
258
246
|
] });
|
|
259
|
-
},
|
|
260
|
-
const [
|
|
247
|
+
}, Y = ({ apiKey: t }) => {
|
|
248
|
+
const [n, a] = L(!1);
|
|
261
249
|
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:
|
|
250
|
+
/* @__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
251
|
/* @__PURE__ */ e.jsx(
|
|
264
252
|
o,
|
|
265
253
|
{
|
|
266
254
|
variant: "outline",
|
|
267
|
-
onClick: () => a((
|
|
255
|
+
onClick: () => a((r) => !r),
|
|
268
256
|
size: "icon",
|
|
269
|
-
children:
|
|
257
|
+
children: n ? /* @__PURE__ */ e.jsx(F, { size: 16 }) : /* @__PURE__ */ e.jsx(T, { size: 16 })
|
|
270
258
|
}
|
|
271
259
|
)
|
|
272
260
|
] });
|
|
273
|
-
},
|
|
274
|
-
deleteKey: async (
|
|
275
|
-
const
|
|
261
|
+
}, Z = "https://zudoku-rewiringamerica-main-ef9c9c0.d2.zuplo.dev", W = (t) => ({
|
|
262
|
+
deleteKey: async (n, a) => {
|
|
263
|
+
const r = new Request(t + `/v1/developer/api-keys/${n}`, {
|
|
276
264
|
method: "DELETE"
|
|
277
265
|
});
|
|
278
|
-
await a.signRequest(
|
|
279
|
-
const i = await fetch(
|
|
280
|
-
|
|
266
|
+
await a.signRequest(r);
|
|
267
|
+
const i = await fetch(r);
|
|
268
|
+
x(i.ok, "Failed to delete API key");
|
|
281
269
|
},
|
|
282
|
-
createKey: async (
|
|
283
|
-
const
|
|
270
|
+
createKey: async (n, a) => {
|
|
271
|
+
const r = new Request(t + "/v1/developer/api-keys", {
|
|
284
272
|
method: "POST",
|
|
285
273
|
headers: {
|
|
286
274
|
"Content-Type": "application/json"
|
|
287
275
|
},
|
|
288
|
-
body: JSON.stringify(
|
|
276
|
+
body: JSON.stringify(n)
|
|
289
277
|
});
|
|
290
|
-
await a.signRequest(
|
|
291
|
-
const i = await fetch(
|
|
292
|
-
|
|
278
|
+
await a.signRequest(r);
|
|
279
|
+
const i = await fetch(r);
|
|
280
|
+
x(i.ok, "Failed to create API key");
|
|
293
281
|
},
|
|
294
|
-
getKeys: async (
|
|
282
|
+
getKeys: async (n) => {
|
|
295
283
|
const a = new Request(t + "/v1/developer/api-keys");
|
|
296
|
-
await
|
|
297
|
-
const
|
|
298
|
-
return
|
|
284
|
+
await n.signRequest(a);
|
|
285
|
+
const r = await fetch(a);
|
|
286
|
+
return x(r.ok, "Failed to fetch API keys"), await r.json();
|
|
299
287
|
}
|
|
300
|
-
}),
|
|
301
|
-
const t =
|
|
288
|
+
}), X = () => {
|
|
289
|
+
const t = k();
|
|
302
290
|
return t.isPending ? null : t.isAuthenticated ? /* @__PURE__ */ e.jsx(b, {}) : /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col justify-center gap-2 items-center h-1/2 my-12", children: [
|
|
303
291
|
"Please login first to view this page",
|
|
304
292
|
/* @__PURE__ */ e.jsx(o, { onClick: () => t.login(), children: "Login" })
|
|
305
293
|
] });
|
|
306
|
-
},
|
|
307
|
-
const
|
|
294
|
+
}, ce = (t) => {
|
|
295
|
+
const n = "endpoint" in t ? t.endpoint : Z, a = "getKeys" in t ? t : W(n);
|
|
308
296
|
return {
|
|
309
|
-
getIdentities: async (
|
|
297
|
+
getIdentities: async (r) => {
|
|
310
298
|
try {
|
|
311
|
-
return (await a.getKeys(
|
|
312
|
-
authorizeRequest: (
|
|
313
|
-
id:
|
|
314
|
-
label:
|
|
299
|
+
return (await a.getKeys(r)).map((s) => ({
|
|
300
|
+
authorizeRequest: (c) => (c.headers.set("Authorization", `Bearer ${s.key}`), c),
|
|
301
|
+
id: s.id,
|
|
302
|
+
label: s.description ?? s.id
|
|
315
303
|
}));
|
|
316
304
|
} catch {
|
|
317
305
|
return [];
|
|
@@ -319,16 +307,16 @@ const Z = ({ service: t }) => {
|
|
|
319
307
|
},
|
|
320
308
|
getRoutes: () => [
|
|
321
309
|
{
|
|
322
|
-
element: /* @__PURE__ */ e.jsx(
|
|
323
|
-
errorElement: /* @__PURE__ */ e.jsx(
|
|
310
|
+
element: /* @__PURE__ */ e.jsx(X, {}),
|
|
311
|
+
errorElement: /* @__PURE__ */ e.jsx(B, {}),
|
|
324
312
|
children: [
|
|
325
313
|
{
|
|
326
314
|
path: "/settings/api-keys",
|
|
327
|
-
element: /* @__PURE__ */ e.jsx(
|
|
315
|
+
element: /* @__PURE__ */ e.jsx(J, { service: a })
|
|
328
316
|
},
|
|
329
317
|
{
|
|
330
318
|
path: "/settings/api-keys/new",
|
|
331
|
-
element: /* @__PURE__ */ e.jsx(
|
|
319
|
+
element: /* @__PURE__ */ e.jsx(Q, { service: a })
|
|
332
320
|
}
|
|
333
321
|
]
|
|
334
322
|
}
|
|
@@ -336,6 +324,6 @@ const Z = ({ service: t }) => {
|
|
|
336
324
|
};
|
|
337
325
|
};
|
|
338
326
|
export {
|
|
339
|
-
|
|
327
|
+
ce as apiKeyPlugin
|
|
340
328
|
};
|
|
341
329
|
//# 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/lucide-react@0.378.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/unlink.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","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","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","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"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
|
|
@@ -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-CGTgSCJL.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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zudoku.plugin-markdown.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"zudoku.plugin-markdown.js","sources":["../src/lib/plugins/markdown/generateRoutes.tsx","../src/lib/plugins/markdown/index.tsx"],"sourcesContent":["import { Navigate, type RouteObject } from \"react-router-dom\";\nimport { useTopNavigationItem } from \"../../components/context/DevPortalProvider.js\";\nimport { isPathItem } from \"../../components/navigation/util.js\";\nimport { traverseNavigation } from \"../../util/traverseNavigation.js\";\n\nimport {\n MarkdownPluginDefaultOptions,\n MarkdownPluginOptions,\n} from \"./index.js\";\n\nexport const generateRoutes = (\n markdownFiles: MarkdownPluginOptions[\"markdownFiles\"],\n defaultOptions?: MarkdownPluginDefaultOptions,\n): RouteObject[] => {\n const routes = Object.entries(markdownFiles).flatMap(\n ([file, importPromise]) => {\n // @todo we can pass in the folder name and then filter the markdown files based on that path\n const match = file.match(/pages\\/(.*).mdx?$/);\n const path = match?.at(1);\n\n if (!path) return [];\n\n const pathSegments = path.split(\"/\");\n const isIndexFile = pathSegments.at(-1) === \"index\";\n const routePath = isIndexFile\n ? pathSegments.slice(0, -1).join(\"/\")\n : path;\n\n return {\n path: routePath,\n lazy: async () => {\n const { MdxPage } = await import(\"./MdxPage.js\");\n const { default: Component, ...props } = await importPromise();\n return {\n element: (\n <MdxPage\n mdxComponent={Component}\n {...props}\n defaultOptions={defaultOptions}\n />\n ),\n };\n },\n } satisfies RouteObject;\n },\n );\n\n const rootRoutes: RouteObject[] = Array.from(\n new Set(routes.map((route) => route.path.split(\"/\").at(0))),\n ).map((dir) => ({\n path: `/${dir}`,\n element: <Redirect />,\n }));\n\n return [...routes, ...rootRoutes];\n};\n\nconst Redirect = () => {\n const navItem = useTopNavigationItem();\n\n if (!navItem) return null;\n\n return traverseNavigation(navItem, (node, fullPath) => {\n if (\"children\" in node || !isPathItem(node)) return;\n return <Navigate to={fullPath} replace />;\n });\n};\n","import type { Toc } from \"@stefanprobst/rehype-extract-toc\";\nimport type { MDXProps } from \"mdx/types.js\";\nimport type { DevPortalPlugin } from \"../../core/plugins.js\";\nimport { generateRoutes } from \"./generateRoutes.js\";\n\nexport type MarkdownPluginOptions = {\n markdownFiles: Record<string, () => Promise<MDXImport>>;\n defaultOptions?: MarkdownPluginDefaultOptions;\n};\nexport type MarkdownPluginDefaultOptions = Pick<\n Frontmatter,\n \"toc\" | \"disablePager\"\n>;\n\nexport type Frontmatter = {\n title?: string;\n description?: string;\n category?: string;\n toc?: boolean;\n disablePager?: boolean;\n};\n\nexport type MDXImport = {\n tableOfContents: Toc;\n frontmatter: Frontmatter;\n default: (props: MDXProps) => JSX.Element;\n};\n\nexport const markdownPlugin = ({\n markdownFiles,\n defaultOptions,\n}: MarkdownPluginOptions): DevPortalPlugin => ({\n getRoutes: () => generateRoutes(markdownFiles, defaultOptions),\n});\n"],"names":["generateRoutes","markdownFiles","defaultOptions","routes","file","importPromise","match","path","pathSegments","MdxPage","Component","props","jsx","rootRoutes","route","dir","Redirect","navItem","useTopNavigationItem","traverseNavigation","node","fullPath","isPathItem","Navigate","markdownPlugin"],"mappings":";;;AAUa,MAAAA,IAAiB,CAC5BC,GACAC,MACkB;AAClB,QAAMC,IAAS,OAAO,QAAQF,CAAa,EAAE;AAAA,IAC3C,CAAC,CAACG,GAAMC,CAAa,MAAM;AAEnB,YAAAC,IAAQF,EAAK,MAAM,mBAAmB,GACtCG,IAAOD,KAAA,gBAAAA,EAAO,GAAG;AAEnB,UAAA,CAACC,EAAM,QAAO;AAEZ,YAAAC,IAAeD,EAAK,MAAM,GAAG;AAM5B,aAAA;AAAA,QACL,MANkBC,EAAa,GAAG,EAAE,MAAM,UAExCA,EAAa,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAClCD;AAAA,QAIF,MAAM,YAAY;AAChB,gBAAM,EAAE,SAAAE,EAAA,IAAY,MAAM,OAAO,uBAAc,GACzC,EAAE,SAASC,GAAW,GAAGC,EAAM,IAAI,MAAMN;AACxC,iBAAA;AAAA,YACL,SACEO,gBAAAA,EAAA;AAAA,cAACH;AAAA,cAAA;AAAA,gBACC,cAAcC;AAAA,gBACb,GAAGC;AAAA,gBACJ,gBAAAT;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAGN;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA,GAGIW,IAA4B,MAAM;AAAA,IACtC,IAAI,IAAIV,EAAO,IAAI,CAACW,MAAUA,EAAM,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,EAAA,EAC1D,IAAI,CAACC,OAAS;AAAA,IACd,MAAM,IAAIA,CAAG;AAAA,IACb,+BAAUC,GAAS,EAAA;AAAA,EACnB,EAAA;AAEF,SAAO,CAAC,GAAGb,GAAQ,GAAGU,CAAU;AAClC,GAEMG,IAAW,MAAM;AACrB,QAAMC,IAAUC;AAEZ,SAACD,IAEEE,EAAmBF,GAAS,CAACG,GAAMC,MAAa;AACrD,QAAI,gBAAcD,KAAQ,CAACE,EAAWF,CAAI;AAC1C,aAAQR,gBAAAA,EAAAA,IAAAW,GAAA,EAAS,IAAIF,GAAU,SAAO,GAAC,CAAA;AAAA,EAAA,CACxC,IALoB;AAMvB,GCtCaG,IAAiB,CAAC;AAAA,EAC7B,eAAAvB;AAAA,EACA,gBAAAC;AACF,OAA+C;AAAA,EAC7C,WAAW,MAAMF,EAAeC,GAAeC,CAAc;AAC/D;"}
|