@mustafaaksoy41/sharepoint-kit 0.1.2
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/README.md +293 -0
- package/dist/bin/sp-generate-types.js +784 -0
- package/dist/bin/sp-generate-types.js.map +1 -0
- package/dist/chunk-2FU6XS6S.cjs +142 -0
- package/dist/chunk-2FU6XS6S.cjs.map +1 -0
- package/dist/chunk-MLY32NZB.js +131 -0
- package/dist/chunk-MLY32NZB.js.map +1 -0
- package/dist/chunk-V6K5IFVV.cjs +253 -0
- package/dist/chunk-V6K5IFVV.cjs.map +1 -0
- package/dist/chunk-VOGWZXJY.js +246 -0
- package/dist/chunk-VOGWZXJY.js.map +1 -0
- package/dist/cli/index.cjs +516 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +117 -0
- package/dist/cli/index.d.ts +117 -0
- package/dist/cli/index.js +505 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/components/index.cjs +509 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +118 -0
- package/dist/components/index.d.ts +118 -0
- package/dist/components/index.js +494 -0
- package/dist/components/index.js.map +1 -0
- package/dist/config-loader-Nbidwviq.d.cts +33 -0
- package/dist/config-loader-Nbidwviq.d.ts +33 -0
- package/dist/hooks/index.cjs +45 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +51 -0
- package/dist/hooks/index.d.ts +51 -0
- package/dist/hooks/index.js +24 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +32 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +32 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/sp-client-A9dM9oYp.d.ts +31 -0
- package/dist/sp-client-DTChApOB.d.cts +31 -0
- package/dist/types-Dk0jbejG.d.cts +108 -0
- package/dist/types-Dk0jbejG.d.ts +108 -0
- package/package.json +123 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import { SpProvider, useSpList, useSpCreate, useSpUpdate } from '../chunk-MLY32NZB.js';
|
|
2
|
+
export { SpProvider, useSpContext } from '../chunk-MLY32NZB.js';
|
|
3
|
+
import { SpAuthError, SpThrottleError, SpError } from '../chunk-VOGWZXJY.js';
|
|
4
|
+
import { createContext, useState, useRef, useEffect, useCallback, useContext, Component } from 'react';
|
|
5
|
+
import { Theme, Box, Card, Flex, Text, Separator, Button, TextField, Spinner, Callout, Table } from '@radix-ui/themes';
|
|
6
|
+
import { LockClosedIcon, ChevronUpIcon, ChevronDownIcon, PersonIcon } from '@radix-ui/react-icons';
|
|
7
|
+
import { PublicClientApplication } from '@azure/msal-browser';
|
|
8
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var DEFAULT_SCOPES = ["https://graph.microsoft.com/.default"];
|
|
11
|
+
function buildMsalConfig(config) {
|
|
12
|
+
const tenantId = config.tenantId.replace(/\/$/, "");
|
|
13
|
+
return {
|
|
14
|
+
auth: {
|
|
15
|
+
clientId: config.clientId,
|
|
16
|
+
authority: `https://login.microsoftonline.com/${tenantId}`,
|
|
17
|
+
redirectUri: config.redirectUri
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
var cachedInstance = null;
|
|
22
|
+
var cachedConfigKey = null;
|
|
23
|
+
async function getMsalInstance(config) {
|
|
24
|
+
const key = `${config.tenantId}:${config.clientId}:${config.redirectUri}`;
|
|
25
|
+
if (cachedInstance && cachedConfigKey === key) {
|
|
26
|
+
return cachedInstance;
|
|
27
|
+
}
|
|
28
|
+
const msalConfig = buildMsalConfig(config);
|
|
29
|
+
const instance = await PublicClientApplication.createPublicClientApplication(msalConfig);
|
|
30
|
+
cachedInstance = instance;
|
|
31
|
+
cachedConfigKey = key;
|
|
32
|
+
return instance;
|
|
33
|
+
}
|
|
34
|
+
async function loginWithRedirect(config) {
|
|
35
|
+
const instance = await getMsalInstance(config);
|
|
36
|
+
const scopes = config.scopes ?? DEFAULT_SCOPES;
|
|
37
|
+
const request = { scopes };
|
|
38
|
+
await instance.loginRedirect(request);
|
|
39
|
+
}
|
|
40
|
+
async function handleRedirectPromise(config) {
|
|
41
|
+
const instance = await getMsalInstance(config);
|
|
42
|
+
const result = await instance.handleRedirectPromise();
|
|
43
|
+
if (!result) return null;
|
|
44
|
+
return { accessToken: result.accessToken };
|
|
45
|
+
}
|
|
46
|
+
var AuthContext = createContext(null);
|
|
47
|
+
var MICROSOFT_BLUE = "#00a4ef";
|
|
48
|
+
function MicrosoftLogoIcon({ size = 21 }) {
|
|
49
|
+
return /* @__PURE__ */ jsxs(
|
|
50
|
+
"svg",
|
|
51
|
+
{
|
|
52
|
+
width: size,
|
|
53
|
+
height: size,
|
|
54
|
+
viewBox: "0 0 21 21",
|
|
55
|
+
fill: "none",
|
|
56
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
57
|
+
style: { flexShrink: 0 },
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx("rect", { width: "10", height: "10", fill: "#F25022" }),
|
|
60
|
+
/* @__PURE__ */ jsx("rect", { x: "11", width: "10", height: "10", fill: "#7FBA00" }),
|
|
61
|
+
/* @__PURE__ */ jsx("rect", { y: "11", width: "10", height: "10", fill: "#00A4EF" }),
|
|
62
|
+
/* @__PURE__ */ jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" })
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function SpAuthProvider({
|
|
68
|
+
children,
|
|
69
|
+
loginConfig,
|
|
70
|
+
bypassEnabled = false,
|
|
71
|
+
onTokenChange
|
|
72
|
+
}) {
|
|
73
|
+
const [token, setToken] = useState(() => {
|
|
74
|
+
if (typeof window !== "undefined") {
|
|
75
|
+
return localStorage.getItem("sp-kit-token");
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
});
|
|
79
|
+
const [bypass, setBypass] = useState(bypassEnabled);
|
|
80
|
+
const [manualToken, setManualToken] = useState("");
|
|
81
|
+
const [manualTokenOpen, setManualTokenOpen] = useState(false);
|
|
82
|
+
const redirectCheckDone = useRef(false);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (onTokenChange) {
|
|
85
|
+
onTokenChange(token);
|
|
86
|
+
}
|
|
87
|
+
}, [token, onTokenChange]);
|
|
88
|
+
const login = useCallback((newToken) => {
|
|
89
|
+
setToken(newToken);
|
|
90
|
+
if (typeof window !== "undefined") {
|
|
91
|
+
localStorage.setItem("sp-kit-token", newToken);
|
|
92
|
+
}
|
|
93
|
+
setBypass(false);
|
|
94
|
+
}, []);
|
|
95
|
+
const logout = useCallback(() => {
|
|
96
|
+
setToken(null);
|
|
97
|
+
if (typeof window !== "undefined") {
|
|
98
|
+
localStorage.removeItem("sp-kit-token");
|
|
99
|
+
}
|
|
100
|
+
}, []);
|
|
101
|
+
const handleManualLogin = useCallback(() => {
|
|
102
|
+
if (manualToken.trim()) {
|
|
103
|
+
login(manualToken.trim());
|
|
104
|
+
}
|
|
105
|
+
}, [manualToken, login]);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
if (!loginConfig || redirectCheckDone.current || typeof window === "undefined") return;
|
|
108
|
+
redirectCheckDone.current = true;
|
|
109
|
+
handleRedirectPromise(loginConfig).then((result) => {
|
|
110
|
+
if (result) {
|
|
111
|
+
login(result.accessToken);
|
|
112
|
+
}
|
|
113
|
+
}).catch(() => {
|
|
114
|
+
redirectCheckDone.current = false;
|
|
115
|
+
});
|
|
116
|
+
}, [loginConfig, login]);
|
|
117
|
+
const handleMicrosoftLogin = useCallback(() => {
|
|
118
|
+
if (!loginConfig) return;
|
|
119
|
+
loginWithRedirect(loginConfig);
|
|
120
|
+
}, [loginConfig]);
|
|
121
|
+
const isAuthenticated = bypass || !!token;
|
|
122
|
+
if (!isAuthenticated) {
|
|
123
|
+
const showMicrosoftFirst = !!loginConfig;
|
|
124
|
+
return /* @__PURE__ */ jsx(Theme, { children: /* @__PURE__ */ jsx(
|
|
125
|
+
Box,
|
|
126
|
+
{
|
|
127
|
+
style: {
|
|
128
|
+
minHeight: "100vh",
|
|
129
|
+
display: "flex",
|
|
130
|
+
alignItems: "center",
|
|
131
|
+
justifyContent: "center",
|
|
132
|
+
background: "var(--gray-2)",
|
|
133
|
+
padding: "1rem"
|
|
134
|
+
},
|
|
135
|
+
children: /* @__PURE__ */ jsx(Card, { style: { width: "100%", maxWidth: "400px" }, children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "4", p: "4", children: [
|
|
136
|
+
/* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", align: "center", children: [
|
|
137
|
+
/* @__PURE__ */ jsx(
|
|
138
|
+
Box,
|
|
139
|
+
{
|
|
140
|
+
style: {
|
|
141
|
+
width: "48px",
|
|
142
|
+
height: "48px",
|
|
143
|
+
borderRadius: "50%",
|
|
144
|
+
background: showMicrosoftFirst ? MICROSOFT_BLUE : "var(--accent-9)",
|
|
145
|
+
display: "flex",
|
|
146
|
+
alignItems: "center",
|
|
147
|
+
justifyContent: "center"
|
|
148
|
+
},
|
|
149
|
+
children: /* @__PURE__ */ jsx(LockClosedIcon, { width: "24", height: "24", color: "white" })
|
|
150
|
+
}
|
|
151
|
+
),
|
|
152
|
+
/* @__PURE__ */ jsx(Text, { size: "5", weight: "bold", children: showMicrosoftFirst ? "Sign in to SharePoint" : "SharePoint Authentication" }),
|
|
153
|
+
/* @__PURE__ */ jsx(Text, { size: "2", color: "gray", align: "center", children: showMicrosoftFirst ? "Sign in with your Microsoft account to continue" : "Enter your access token to continue" })
|
|
154
|
+
] }),
|
|
155
|
+
/* @__PURE__ */ jsx(Separator, { size: "4" }),
|
|
156
|
+
/* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", children: [
|
|
157
|
+
showMicrosoftFirst && /* @__PURE__ */ jsxs(
|
|
158
|
+
Button,
|
|
159
|
+
{
|
|
160
|
+
size: "3",
|
|
161
|
+
onClick: handleMicrosoftLogin,
|
|
162
|
+
style: {
|
|
163
|
+
width: "100%",
|
|
164
|
+
backgroundColor: MICROSOFT_BLUE,
|
|
165
|
+
color: "white"
|
|
166
|
+
},
|
|
167
|
+
children: [
|
|
168
|
+
/* @__PURE__ */ jsx(MicrosoftLogoIcon, {}),
|
|
169
|
+
"Sign in with Microsoft"
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
showMicrosoftFirst && /* @__PURE__ */ jsxs(
|
|
174
|
+
Button,
|
|
175
|
+
{
|
|
176
|
+
variant: "soft",
|
|
177
|
+
size: "2",
|
|
178
|
+
style: { width: "100%" },
|
|
179
|
+
onClick: () => setManualTokenOpen((o) => !o),
|
|
180
|
+
children: [
|
|
181
|
+
"Token ile giris",
|
|
182
|
+
manualTokenOpen ? /* @__PURE__ */ jsx(ChevronUpIcon, {}) : /* @__PURE__ */ jsx(ChevronDownIcon, {})
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
),
|
|
186
|
+
(showMicrosoftFirst ? manualTokenOpen : true) && /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", children: [
|
|
187
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
188
|
+
/* @__PURE__ */ jsx(Text, { as: "label", size: "2", weight: "medium", mb: "1", style: { display: "block" }, children: "Access Token" }),
|
|
189
|
+
/* @__PURE__ */ jsx(
|
|
190
|
+
TextField.Root,
|
|
191
|
+
{
|
|
192
|
+
type: "password",
|
|
193
|
+
placeholder: "Enter your SharePoint access token",
|
|
194
|
+
value: manualToken,
|
|
195
|
+
onChange: (e) => setManualToken(e.target.value),
|
|
196
|
+
onKeyDown: (e) => {
|
|
197
|
+
if (e.key === "Enter") {
|
|
198
|
+
handleManualLogin();
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
size: "3",
|
|
202
|
+
children: /* @__PURE__ */ jsx(TextField.Slot, { children: /* @__PURE__ */ jsx(PersonIcon, {}) })
|
|
203
|
+
}
|
|
204
|
+
)
|
|
205
|
+
] }),
|
|
206
|
+
/* @__PURE__ */ jsxs(
|
|
207
|
+
Button,
|
|
208
|
+
{
|
|
209
|
+
size: "3",
|
|
210
|
+
variant: showMicrosoftFirst ? "soft" : "solid",
|
|
211
|
+
onClick: handleManualLogin,
|
|
212
|
+
disabled: !manualToken.trim(),
|
|
213
|
+
style: { width: "100%" },
|
|
214
|
+
children: [
|
|
215
|
+
/* @__PURE__ */ jsx(LockClosedIcon, {}),
|
|
216
|
+
"Sign In"
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
)
|
|
220
|
+
] }),
|
|
221
|
+
bypassEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
222
|
+
/* @__PURE__ */ jsx(Separator, { size: "4" }),
|
|
223
|
+
/* @__PURE__ */ jsx(
|
|
224
|
+
Button,
|
|
225
|
+
{
|
|
226
|
+
variant: "soft",
|
|
227
|
+
size: "2",
|
|
228
|
+
onClick: () => setBypass(true),
|
|
229
|
+
style: { width: "100%" },
|
|
230
|
+
children: "Bypass (Development)"
|
|
231
|
+
}
|
|
232
|
+
)
|
|
233
|
+
] })
|
|
234
|
+
] }),
|
|
235
|
+
/* @__PURE__ */ jsx(Text, { size: "1", color: "gray", align: "center", children: "Your token is stored locally and never sent to external servers" })
|
|
236
|
+
] }) })
|
|
237
|
+
}
|
|
238
|
+
) });
|
|
239
|
+
}
|
|
240
|
+
return /* @__PURE__ */ jsx(AuthContext.Provider, { value: { token, isAuthenticated, login, logout, bypass, setBypass }, children });
|
|
241
|
+
}
|
|
242
|
+
function useSpAuth() {
|
|
243
|
+
const context = useContext(AuthContext);
|
|
244
|
+
if (!context) {
|
|
245
|
+
throw new Error("useSpAuth must be used within a <SpAuthProvider>");
|
|
246
|
+
}
|
|
247
|
+
return context;
|
|
248
|
+
}
|
|
249
|
+
function SpProviderWithAuth({
|
|
250
|
+
siteId,
|
|
251
|
+
children,
|
|
252
|
+
baseUrl,
|
|
253
|
+
retryOptions
|
|
254
|
+
}) {
|
|
255
|
+
const { token, bypass } = useSpAuth();
|
|
256
|
+
const getAccessToken = useCallback(async () => {
|
|
257
|
+
if (bypass) {
|
|
258
|
+
return "bypass-token";
|
|
259
|
+
}
|
|
260
|
+
if (!token) {
|
|
261
|
+
throw new Error("No access token available. Please authenticate.");
|
|
262
|
+
}
|
|
263
|
+
return token;
|
|
264
|
+
}, [token, bypass]);
|
|
265
|
+
return /* @__PURE__ */ jsx(
|
|
266
|
+
SpProvider,
|
|
267
|
+
{
|
|
268
|
+
siteId,
|
|
269
|
+
getAccessToken,
|
|
270
|
+
baseUrl,
|
|
271
|
+
retryOptions,
|
|
272
|
+
children
|
|
273
|
+
}
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
function formatValue(value, format) {
|
|
277
|
+
if (value === null || value === void 0) return "-";
|
|
278
|
+
switch (format) {
|
|
279
|
+
case "currency":
|
|
280
|
+
return typeof value === "number" ? value.toLocaleString("tr-TR", { style: "currency", currency: "TRY" }) : String(value);
|
|
281
|
+
case "number":
|
|
282
|
+
return typeof value === "number" ? value.toLocaleString("tr-TR") : String(value);
|
|
283
|
+
case "date":
|
|
284
|
+
return typeof value === "string" ? new Date(value).toLocaleDateString("tr-TR") : String(value);
|
|
285
|
+
case "boolean":
|
|
286
|
+
return value ? "Evet" : "Hayir";
|
|
287
|
+
default:
|
|
288
|
+
return String(value);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function SpListTable({
|
|
292
|
+
listId,
|
|
293
|
+
contentTypeName,
|
|
294
|
+
columns,
|
|
295
|
+
filter,
|
|
296
|
+
orderBy,
|
|
297
|
+
top,
|
|
298
|
+
onRowClick,
|
|
299
|
+
emptyMessage = "Kayit bulunamadi"
|
|
300
|
+
}) {
|
|
301
|
+
const { data, isLoading, error } = useSpList({
|
|
302
|
+
listId,
|
|
303
|
+
contentTypeName,
|
|
304
|
+
filter,
|
|
305
|
+
orderBy,
|
|
306
|
+
top
|
|
307
|
+
});
|
|
308
|
+
if (isLoading) {
|
|
309
|
+
return /* @__PURE__ */ jsx(Spinner, { size: "3" });
|
|
310
|
+
}
|
|
311
|
+
if (error) {
|
|
312
|
+
return /* @__PURE__ */ jsx(Callout.Root, { color: "red", children: /* @__PURE__ */ jsx(Callout.Text, { children: error.message }) });
|
|
313
|
+
}
|
|
314
|
+
if (!data || data.length === 0) {
|
|
315
|
+
return /* @__PURE__ */ jsx(Text, { color: "gray", children: emptyMessage });
|
|
316
|
+
}
|
|
317
|
+
return /* @__PURE__ */ jsxs(Table.Root, { children: [
|
|
318
|
+
/* @__PURE__ */ jsx(Table.Header, { children: /* @__PURE__ */ jsx(Table.Row, { children: columns.map((col) => /* @__PURE__ */ jsx(Table.ColumnHeaderCell, { children: col.label }, col.key)) }) }),
|
|
319
|
+
/* @__PURE__ */ jsx(Table.Body, { children: data.map((item) => /* @__PURE__ */ jsx(
|
|
320
|
+
Table.Row,
|
|
321
|
+
{
|
|
322
|
+
onClick: onRowClick ? () => onRowClick(item.fields, item.id) : void 0,
|
|
323
|
+
style: onRowClick ? { cursor: "pointer" } : void 0,
|
|
324
|
+
children: columns.map((col) => /* @__PURE__ */ jsx(Table.Cell, { children: col.render ? col.render(item.fields[col.key], item.fields) : formatValue(item.fields[col.key], col.format) }, col.key))
|
|
325
|
+
},
|
|
326
|
+
item.id
|
|
327
|
+
)) })
|
|
328
|
+
] });
|
|
329
|
+
}
|
|
330
|
+
function SpItemForm({
|
|
331
|
+
listId,
|
|
332
|
+
fields,
|
|
333
|
+
mode = "create",
|
|
334
|
+
itemId,
|
|
335
|
+
initialValues = {},
|
|
336
|
+
onSuccess,
|
|
337
|
+
onError,
|
|
338
|
+
submitLabel
|
|
339
|
+
}) {
|
|
340
|
+
const [values, setValues] = useState(() => {
|
|
341
|
+
const initial = {};
|
|
342
|
+
for (const field of fields) {
|
|
343
|
+
initial[field.key] = initialValues[field.key] ?? field.defaultValue ?? "";
|
|
344
|
+
}
|
|
345
|
+
return initial;
|
|
346
|
+
});
|
|
347
|
+
const [formError, setFormError] = useState(null);
|
|
348
|
+
const { mutate: create, isLoading: isCreating } = useSpCreate({ listId });
|
|
349
|
+
const { mutate: update, isLoading: isUpdating } = useSpUpdate({ listId });
|
|
350
|
+
const isLoading = isCreating || isUpdating;
|
|
351
|
+
const handleChange = useCallback((key, value) => {
|
|
352
|
+
setValues((prev) => ({ ...prev, [key]: value }));
|
|
353
|
+
}, []);
|
|
354
|
+
const handleSubmit = useCallback(
|
|
355
|
+
async (e) => {
|
|
356
|
+
e.preventDefault();
|
|
357
|
+
setFormError(null);
|
|
358
|
+
try {
|
|
359
|
+
let result;
|
|
360
|
+
if (mode === "edit" && itemId) {
|
|
361
|
+
result = await update({ itemId, fields: values });
|
|
362
|
+
} else {
|
|
363
|
+
result = await create({ fields: values });
|
|
364
|
+
}
|
|
365
|
+
onSuccess?.(result);
|
|
366
|
+
} catch (error) {
|
|
367
|
+
const err = error;
|
|
368
|
+
setFormError(err.message);
|
|
369
|
+
onError?.(err);
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
[mode, itemId, values, create, update, onSuccess, onError]
|
|
373
|
+
);
|
|
374
|
+
return /* @__PURE__ */ jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", children: [
|
|
375
|
+
formError && /* @__PURE__ */ jsx(Callout.Root, { color: "red", children: /* @__PURE__ */ jsx(Callout.Text, { children: formError }) }),
|
|
376
|
+
fields.map((field) => /* @__PURE__ */ jsxs(Box, { children: [
|
|
377
|
+
/* @__PURE__ */ jsxs(Text, { as: "label", size: "2", weight: "medium", children: [
|
|
378
|
+
field.label,
|
|
379
|
+
field.required && /* @__PURE__ */ jsx(Text, { color: "red", children: " *" })
|
|
380
|
+
] }),
|
|
381
|
+
/* @__PURE__ */ jsx(
|
|
382
|
+
TextField.Root,
|
|
383
|
+
{
|
|
384
|
+
type: field.type === "number" ? "number" : field.type === "date" ? "date" : "text",
|
|
385
|
+
value: String(values[field.key] ?? ""),
|
|
386
|
+
onChange: (e) => handleChange(field.key, e.target.value),
|
|
387
|
+
placeholder: field.placeholder,
|
|
388
|
+
required: field.required
|
|
389
|
+
}
|
|
390
|
+
)
|
|
391
|
+
] }, field.key)),
|
|
392
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: isLoading, children: isLoading ? "Kaydediliyor..." : submitLabel ?? (mode === "edit" ? "Guncelle" : "Olustur") })
|
|
393
|
+
] }) });
|
|
394
|
+
}
|
|
395
|
+
function formatCardValue(value, format) {
|
|
396
|
+
if (value === null || value === void 0) return "-";
|
|
397
|
+
switch (format) {
|
|
398
|
+
case "currency":
|
|
399
|
+
return typeof value === "number" ? value.toLocaleString("tr-TR", { style: "currency", currency: "TRY" }) : String(value);
|
|
400
|
+
case "number":
|
|
401
|
+
return typeof value === "number" ? value.toLocaleString("tr-TR") : String(value);
|
|
402
|
+
case "date":
|
|
403
|
+
return typeof value === "string" ? new Date(value).toLocaleDateString("tr-TR") : String(value);
|
|
404
|
+
case "boolean":
|
|
405
|
+
return value ? "Evet" : "Hayir";
|
|
406
|
+
default:
|
|
407
|
+
return String(value);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
function SpItemCard({
|
|
411
|
+
item,
|
|
412
|
+
fields,
|
|
413
|
+
title,
|
|
414
|
+
onClick
|
|
415
|
+
}) {
|
|
416
|
+
return /* @__PURE__ */ jsx(
|
|
417
|
+
Card,
|
|
418
|
+
{
|
|
419
|
+
onClick,
|
|
420
|
+
style: onClick ? { cursor: "pointer" } : void 0,
|
|
421
|
+
children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
422
|
+
title && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
423
|
+
/* @__PURE__ */ jsx(Text, { size: "4", weight: "bold", children: title }),
|
|
424
|
+
/* @__PURE__ */ jsx(Separator, { size: "4" })
|
|
425
|
+
] }),
|
|
426
|
+
fields.map((field) => /* @__PURE__ */ jsxs(Flex, { justify: "between", align: "center", children: [
|
|
427
|
+
/* @__PURE__ */ jsx(Text, { size: "2", color: "gray", children: field.label }),
|
|
428
|
+
/* @__PURE__ */ jsx(Text, { size: "2", weight: "medium", children: field.render ? field.render(item[field.key]) : formatCardValue(item[field.key], field.format) })
|
|
429
|
+
] }, field.key))
|
|
430
|
+
] })
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
var SpErrorBoundary = class extends Component {
|
|
435
|
+
constructor(props) {
|
|
436
|
+
super(props);
|
|
437
|
+
this.handleRetry = () => {
|
|
438
|
+
this.setState({ error: null });
|
|
439
|
+
};
|
|
440
|
+
this.handleAuthError = () => {
|
|
441
|
+
const { onAuthError } = this.props;
|
|
442
|
+
if (onAuthError) {
|
|
443
|
+
onAuthError();
|
|
444
|
+
} else {
|
|
445
|
+
if (typeof window !== "undefined") {
|
|
446
|
+
localStorage.removeItem("sp-kit-token");
|
|
447
|
+
window.location.reload();
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
this.state = { error: null };
|
|
452
|
+
}
|
|
453
|
+
static getDerivedStateFromError(error) {
|
|
454
|
+
return { error };
|
|
455
|
+
}
|
|
456
|
+
render() {
|
|
457
|
+
const { error } = this.state;
|
|
458
|
+
const { children, fallback } = this.props;
|
|
459
|
+
if (!error) {
|
|
460
|
+
return children;
|
|
461
|
+
}
|
|
462
|
+
if (fallback) {
|
|
463
|
+
return fallback;
|
|
464
|
+
}
|
|
465
|
+
if (error instanceof SpAuthError) {
|
|
466
|
+
return /* @__PURE__ */ jsx(Callout.Root, { color: "orange", children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
467
|
+
/* @__PURE__ */ jsx(Callout.Text, { children: "Session expired or authorization error. Please login again." }),
|
|
468
|
+
/* @__PURE__ */ jsx(Button, { variant: "soft", onClick: this.handleAuthError, children: "Login Again" })
|
|
469
|
+
] }) });
|
|
470
|
+
}
|
|
471
|
+
if (error instanceof SpThrottleError) {
|
|
472
|
+
return /* @__PURE__ */ jsx(Callout.Root, { color: "yellow", children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
473
|
+
/* @__PURE__ */ jsx(Callout.Text, { children: "Too many requests. Please wait a moment and try again." }),
|
|
474
|
+
/* @__PURE__ */ jsx(Text, { size: "1", color: "gray", children: error.retryAfter > 0 ? `Estimated wait time: ${error.retryAfter} seconds` : "Please try again later" }),
|
|
475
|
+
/* @__PURE__ */ jsx(Button, { variant: "soft", onClick: this.handleRetry, children: "Retry" })
|
|
476
|
+
] }) });
|
|
477
|
+
}
|
|
478
|
+
const spError = error instanceof SpError ? error : null;
|
|
479
|
+
return /* @__PURE__ */ jsx(Callout.Root, { color: "red", children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
|
|
480
|
+
/* @__PURE__ */ jsx(Callout.Text, { children: error.message }),
|
|
481
|
+
spError && /* @__PURE__ */ jsxs(Text, { size: "1", color: "gray", children: [
|
|
482
|
+
"Error code: ",
|
|
483
|
+
spError.code,
|
|
484
|
+
" | Status: ",
|
|
485
|
+
spError.status
|
|
486
|
+
] }),
|
|
487
|
+
/* @__PURE__ */ jsx(Button, { variant: "soft", onClick: this.handleRetry, children: "Retry" })
|
|
488
|
+
] }) });
|
|
489
|
+
}
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
export { SpAuthProvider, SpErrorBoundary, SpItemCard, SpItemForm, SpListTable, SpProviderWithAuth, useSpAuth };
|
|
493
|
+
//# sourceMappingURL=index.js.map
|
|
494
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/auth/msal-browser.ts","../../src/components/sp-auth-provider.tsx","../../src/components/sp-provider-with-auth.tsx","../../src/components/sp-list-table.tsx","../../src/components/sp-item-form.tsx","../../src/components/sp-item-card.tsx","../../src/components/sp-error-boundary.tsx"],"names":["useCallback","jsx","Text","jsxs","useState","Flex","Callout","Box","TextField","Button","Card","Fragment","Separator"],"mappings":";;;;;;;;;AAQA,IAAM,cAAA,GAAiB,CAAC,sCAAsC,CAAA;AAK9D,SAAS,gBAAgB,MAAA,EAAsC;AAC7D,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AAClD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAA,EAAW,qCAAqC,QAAQ,CAAA,CAAA;AAAA,MACxD,aAAa,MAAA,CAAO;AAAA;AACtB,GACF;AACF;AAEA,IAAI,cAAA,GAAkD,IAAA;AACtD,IAAI,eAAA,GAAiC,IAAA;AAMrC,eAAsB,gBAAgB,MAAA,EAA0D;AAC9F,EAAA,MAAM,GAAA,GAAM,GAAG,MAAA,CAAO,QAAQ,IAAI,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,CAAA,CAAA;AACvE,EAAA,IAAI,cAAA,IAAkB,oBAAoB,GAAA,EAAK;AAC7C,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAM,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,6BAAA,CAA8B,UAAU,CAAA;AACvF,EAAA,cAAA,GAAiB,QAAA;AACjB,EAAA,eAAA,GAAkB,GAAA;AAClB,EAAA,OAAO,QAAA;AACT;AAMA,eAAsB,kBAAkB,MAAA,EAAsC;AAC5E,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,MAAM,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,cAAA;AAChC,EAAA,MAAM,OAAA,GAA2B,EAAE,MAAA,EAAO;AAC1C,EAAA,MAAM,QAAA,CAAS,cAAc,OAAO,CAAA;AACtC;AAMA,eAAsB,sBACpB,MAAA,EACyC;AACzC,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,MAAM,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,qBAAA,EAAsB;AACpD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY;AAC3C;AC3CA,IAAM,WAAA,GAAc,cAAuC,IAAI,CAAA;AAE/D,IAAM,cAAA,GAAiB,SAAA;AAGvB,SAAS,iBAAA,CAAkB,EAAE,IAAA,GAAO,EAAA,EAAG,EAAsB;AAC3D,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,EAAE;AAAA,MAEvB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAK,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,MAAK,SAAA,EAAU,CAAA;AAAA,wBAC5C,GAAA,CAAC,UAAK,CAAA,EAAE,IAAA,EAAK,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,wBACnD,GAAA,CAAC,UAAK,CAAA,EAAE,IAAA,EAAK,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,wBACnD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU;AAAA;AAAA;AAAA,GAC5D;AAEJ;AAUO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,MAAM;AACtD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,YAAA,CAAa,QAAQ,cAAc,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,aAAa,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,iBAAA,GAAoB,OAAO,KAAK,CAAA;AAEtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,aAAa,CAAC,CAAA;AAEzB,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,QAAA,KAAqB;AAC9C,IAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,YAAA,CAAa,OAAA,CAAQ,gBAAgB,QAAQ,CAAA;AAAA,IAC/C;AACA,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,YAAA,CAAa,WAAW,cAAc,CAAA;AAAA,IACxC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,IAAI,WAAA,CAAY,MAAK,EAAG;AACtB,MAAA,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,KAAK,CAAC,CAAA;AAGvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,iBAAA,CAAkB,OAAA,IAAW,OAAO,WAAW,WAAA,EAAa;AAChF,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,qBAAA,CAAsB,WAAW,CAAA,CAC9B,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,CAAM,OAAO,WAAW,CAAA;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,MAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,WAAA,EAAa,KAAK,CAAC,CAAA;AAEvB,EAAA,MAAM,oBAAA,GAAuB,YAAY,MAAM;AAC7C,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,iBAAA,CAAkB,WAAW,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,eAAA,GAAkB,MAAA,IAAU,CAAC,CAAC,KAAA;AAEpC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAC,WAAA;AAC7B,IAAA,2BACG,KAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,OAAA;AAAA,UACX,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,UAAA,EAAY,eAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACX;AAAA,QAEA,8BAAC,IAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,QAAQ,QAAA,EAAU,OAAA,EAAQ,EAC9C,QAAA,kBAAA,IAAA,CAAC,QAAK,SAAA,EAAU,QAAA,EAAS,GAAA,EAAI,GAAA,EAAI,GAAE,GAAA,EACjC,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAK,SAAA,EAAU,QAAA,EAAS,GAAA,EAAI,GAAA,EAAI,OAAM,QAAA,EACrC,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,KAAA,EAAO,MAAA;AAAA,kBACP,MAAA,EAAQ,MAAA;AAAA,kBACR,YAAA,EAAc,KAAA;AAAA,kBACd,UAAA,EAAY,qBAAqB,cAAA,GAAiB,iBAAA;AAAA,kBAClD,OAAA,EAAS,MAAA;AAAA,kBACT,UAAA,EAAY,QAAA;AAAA,kBACZ,cAAA,EAAgB;AAAA,iBAClB;AAAA,gBAEA,8BAAC,cAAA,EAAA,EAAe,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAM,OAAA,EAAQ;AAAA;AAAA,aACvD;AAAA,4BACA,GAAA,CAAC,QAAK,IAAA,EAAK,GAAA,EAAI,QAAO,MAAA,EACnB,QAAA,EAAA,kBAAA,GAAqB,0BAA0B,2BAAA,EAClD,CAAA;AAAA,4BACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,KAAA,EAAM,QAAO,KAAA,EAAM,QAAA,EAC/B,QAAA,EAAA,kBAAA,GACG,iDAAA,GACA,qCAAA,EACN;AAAA,WAAA,EACF,CAAA;AAAA,0BAEA,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAK,GAAA,EAAI,CAAA;AAAA,0BAEpB,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAI,GAAA,EAC1B,QAAA,EAAA;AAAA,YAAA,kBAAA,oBACC,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,GAAA;AAAA,gBACL,OAAA,EAAS,oBAAA;AAAA,gBACT,KAAA,EAAO;AAAA,kBACL,KAAA,EAAO,MAAA;AAAA,kBACP,eAAA,EAAiB,cAAA;AAAA,kBACjB,KAAA,EAAO;AAAA,iBACT;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,aAEvB;AAAA,YAGD,kBAAA,oBACC,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,MAAA;AAAA,gBACR,IAAA,EAAK,GAAA;AAAA,gBACL,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,gBACvB,SAAS,MAAM,kBAAA,CAAmB,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,gBAC5C,QAAA,EAAA;AAAA,kBAAA,iBAAA;AAAA,kBAEE,eAAA,mBAAkB,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA,uBAAM,eAAA,EAAA,EAAgB;AAAA;AAAA;AAAA,aAC1D;AAAA,YAAA,CAGA,kBAAA,GAAqB,kBAAkB,IAAA,qBACvC,IAAA,CAAC,QAAK,SAAA,EAAU,QAAA,EAAS,KAAI,GAAA,EAC3B,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,IAAA,EAAK,KAAI,MAAA,EAAO,QAAA,EAAS,EAAA,EAAG,GAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,IAAW,QAAA,EAAA,cAAA,EAE9E,CAAA;AAAA,gCACA,GAAA;AAAA,kBAAC,SAAA,CAAU,IAAA;AAAA,kBAAV;AAAA,oBACC,IAAA,EAAK,UAAA;AAAA,oBACL,WAAA,EAAY,oCAAA;AAAA,oBACZ,KAAA,EAAO,WAAA;AAAA,oBACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBAC9C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,sBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,wBAAA,iBAAA,EAAkB;AAAA,sBACpB;AAAA,oBACF,CAAA;AAAA,oBACA,IAAA,EAAK,GAAA;AAAA,oBAEL,8BAAC,SAAA,CAAU,IAAA,EAAV,EACC,QAAA,kBAAA,GAAA,CAAC,cAAW,CAAA,EACd;AAAA;AAAA;AACF,eAAA,EACF,CAAA;AAAA,8BACA,IAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,GAAA;AAAA,kBACL,OAAA,EAAS,qBAAqB,MAAA,GAAS,OAAA;AAAA,kBACvC,OAAA,EAAS,iBAAA;AAAA,kBACT,QAAA,EAAU,CAAC,WAAA,CAAY,IAAA,EAAK;AAAA,kBAC5B,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,kBAEvB,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA;AAEpB,aAAA,EACF,CAAA;AAAA,YAGD,iCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,SAAA,EAAA,EAAU,MAAK,GAAA,EAAI,CAAA;AAAA,8BACpB,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,MAAA;AAAA,kBACR,IAAA,EAAK,GAAA;AAAA,kBACL,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,kBAC7B,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,kBACxB,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EACF;AAAA,WAAA,EAEJ,CAAA;AAAA,0BAEA,GAAA,CAAC,QAAK,IAAA,EAAK,GAAA,EAAI,OAAM,MAAA,EAAO,KAAA,EAAM,UAAS,QAAA,EAAA,iEAAA,EAE3C;AAAA,SAAA,EACF,CAAA,EACF;AAAA;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAO,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,SAAA,IAC3E,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,SAAA,GAA8B;AAC5C,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,OAAA;AACT;ACzPO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,SAAA,EAAU;AAEpC,EAAA,MAAM,cAAA,GAAiBA,YAAY,YAAY;AAC7C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,cAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAA,uBACEC,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACpBA,SAAS,WAAA,CAAY,OAAgB,MAAA,EAAyB;AAC5D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,GAAA;AAClD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,UAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,eAAe,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,IACzH,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,UAAU,QAAA,GAAW,KAAA,CAAM,eAAe,OAAO,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,IACjF,KAAK,MAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAA,CAAmB,OAAO,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,IAC/F,KAAK,SAAA;AACH,MAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,IAC1B;AACE,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA;AAEzB;AAEO,SAAS,WAAA,CAAyE;AAAA,EACvF,MAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,KAAU,SAAA,CAAa;AAAA,IAC9C,MAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,GAAA,EAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,GAAAA,CAAC,OAAA,CAAQ,IAAA,EAAR,EAAa,KAAA,EAAM,KAAA,EAClB,QAAA,kBAAAA,GAAAA,CAAC,OAAA,CAAQ,IAAA,EAAR,EAAc,QAAA,EAAA,KAAA,CAAM,SAAQ,CAAA,EAC/B,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,uBAAOA,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAQ,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,EAC1C;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,CAAM,IAAA,EAAN,EACC,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,KAAA,CAAM,MAAA,EAAN,EACC,QAAA,kBAAAA,IAAC,KAAA,CAAM,GAAA,EAAN,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,wBACZA,GAAAA,CAAC,KAAA,CAAM,gBAAA,EAAN,EAAsC,QAAA,EAAA,GAAA,CAAI,SAAd,GAAA,CAAI,GAAgB,CAClD,CAAA,EACH,CAAA,EACF,CAAA;AAAA,oBACAA,IAAC,KAAA,CAAM,IAAA,EAAN,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,qBACTA,GAAAA;AAAA,MAAC,KAAA,CAAM,GAAA;AAAA,MAAN;AAAA,QAEC,OAAA,EAAS,aAAa,MAAM,UAAA,CAAW,KAAK,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AAAA,QAC/D,KAAA,EAAO,UAAA,GAAa,EAAE,MAAA,EAAQ,WAAU,GAAI,MAAA;AAAA,QAE3C,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZA,GAAAA,CAAC,KAAA,CAAM,IAAA,EAAN,EACE,QAAA,EAAA,GAAA,CAAI,MAAA,GACD,GAAA,CAAI,MAAA,CAAO,KAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,GAC5C,WAAA,CAAY,KAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,EAAA,EAHjC,GAAA,CAAI,GAIrB,CACD;AAAA,OAAA;AAAA,MAVI,IAAA,CAAK;AAAA,KAYb,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AC3EO,SAAS,UAAA,CAAwE;AAAA,EACtF,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,MAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIG,SAAkC,MAAM;AAClE,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,GAAI,aAAA,CAAc,MAAM,GAAc,CAAA,IAAK,MAAM,YAAA,IAAgB,EAAA;AAAA,IACpF;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE9D,EAAA,MAAM,EAAE,QAAQ,MAAA,EAAQ,SAAA,EAAW,YAAW,GAAI,WAAA,CAAe,EAAE,MAAA,EAAQ,CAAA;AAC3E,EAAA,MAAM,EAAE,QAAQ,MAAA,EAAQ,SAAA,EAAW,YAAW,GAAI,WAAA,CAAe,EAAE,MAAA,EAAQ,CAAA;AAE3E,EAAA,MAAM,YAAY,UAAA,IAAc,UAAA;AAEhC,EAAA,MAAM,YAAA,GAAeJ,WAAAA,CAAY,CAAC,GAAA,EAAa,KAAA,KAAkB;AAC/D,IAAA,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,KAAA,EAAM,CAAE,CAAA;AAAA,EACjD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,OAAO,CAAA,KAAuB;AAC5B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,IAAI,IAAA,KAAS,UAAU,MAAA,EAAQ;AAC7B,UAAA,MAAA,GAAS,MAAM,MAAA,CAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAsB,CAAA;AAAA,QAChE,CAAA,MAAO;AACL,UAAA,MAAA,GAAS,MAAM,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAsB,CAAA;AAAA,QACxD;AACA,QAAA,SAAA,GAAY,MAAM,CAAA;AAAA,MACpB,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,GAAA,GAAM,KAAA;AACZ,QAAA,YAAA,CAAa,IAAI,OAAO,CAAA;AACxB,QAAA,OAAA,GAAU,GAAG,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,WAAW,OAAO;AAAA,GAC3D;AAEA,EAAA,uBACEC,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACd,QAAA,kBAAAE,IAAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,GAAA,EAAI,GAAA,EAC1B,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCJ,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAa,KAAA,EAAM,KAAA,EAClB,QAAA,kBAAAL,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAc,qBAAU,CAAA,EAC3B,CAAA;AAAA,IAGD,OAAO,GAAA,CAAI,CAAC,0BACXH,IAAAA,CAACI,KAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,IAAAA,CAACD,MAAA,EAAK,EAAA,EAAG,SAAQ,IAAA,EAAK,GAAA,EAAI,QAAO,QAAA,EAC9B,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,KAAA;AAAA,QACN,KAAA,CAAM,4BAAYD,GAAAA,CAACC,MAAA,EAAK,KAAA,EAAM,OAAM,QAAA,EAAA,IAAA,EAAE;AAAA,OAAA,EACzC,CAAA;AAAA,sBACAD,GAAAA;AAAA,QAACO,SAAAA,CAAU,IAAA;AAAA,QAAV;AAAA,UACC,IAAA,EAAM,MAAM,IAAA,KAAS,QAAA,GAAW,WAAW,KAAA,CAAM,IAAA,KAAS,SAAS,MAAA,GAAS,MAAA;AAAA,UAC5E,OAAO,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,GAAG,KAAK,EAAE,CAAA;AAAA,UACrC,QAAA,EAAU,CAAC,CAAA,KAA2C,YAAA,CAAa,MAAM,GAAA,EAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC5F,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,UAAU,KAAA,CAAM;AAAA;AAAA;AAClB,KAAA,EAAA,EAXQ,KAAA,CAAM,GAYhB,CACD,CAAA;AAAA,oBAEDP,GAAAA,CAACQ,MAAAA,EAAA,EAAO,MAAK,QAAA,EAAS,QAAA,EAAU,SAAA,EAC7B,QAAA,EAAA,SAAA,GAAY,iBAAA,GAAoB,WAAA,KAAgB,IAAA,KAAS,MAAA,GAAS,aAAa,SAAA,CAAA,EAClF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACzFA,SAAS,eAAA,CAAgB,OAAgB,MAAA,EAAyB;AAChE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,GAAA;AAClD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,UAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,eAAe,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,IACzH,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,UAAU,QAAA,GAAW,KAAA,CAAM,eAAe,OAAO,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,IACjF,KAAK,MAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,kBAAA,CAAmB,OAAO,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,IAC/F,KAAK,SAAA;AACH,MAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,IAC1B;AACE,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA;AAEzB;AAEO,SAAS,UAAA,CAAwE;AAAA,EACtF,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,uBACER,GAAAA;AAAA,IAACS,IAAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA,EAAO,OAAA,GAAU,EAAE,MAAA,EAAQ,WAAU,GAAI,MAAA;AAAA,MAEzC,0BAAAP,IAAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAI,GAAA,EAC1B,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCF,IAAAA,CAAAQ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAV,IAACC,IAAAA,EAAA,EAAK,MAAK,GAAA,EAAI,MAAA,EAAO,QACnB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BACAD,GAAAA,CAACW,SAAAA,EAAA,EAAU,MAAK,GAAA,EAAI;AAAA,SAAA,EACtB,CAAA;AAAA,QAGD,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACXT,IAAAA,CAACE,IAAAA,EAAA,EAAqB,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,QAAA,EAC5C,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAACC,MAAA,EAAK,IAAA,EAAK,KAAI,KAAA,EAAM,MAAA,EAClB,gBAAM,KAAA,EACT,CAAA;AAAA,0BACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAK,KAAI,MAAA,EAAO,QAAA,EACnB,QAAA,EAAA,KAAA,CAAM,MAAA,GACH,KAAA,CAAM,MAAA,CAAO,KAAK,KAAA,CAAM,GAAG,CAAC,CAAA,GAC5B,eAAA,CAAgB,IAAA,CAAK,MAAM,GAAG,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,EACnD;AAAA,SAAA,EAAA,EARS,KAAA,CAAM,GASjB,CACD;AAAA,OAAA,EACH;AAAA;AAAA,GACF;AAEJ;ACvDO,IAAM,eAAA,GAAN,cAA8B,SAAA,CAAsD;AAAA,EACzF,YAAY,KAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA;AAQb,IAAA,IAAA,CAAA,WAAA,GAAc,MAAM;AAClB,MAAA,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAA,CAAA,eAAA,GAAkB,MAAM;AACtB,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA;AAC7B,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,EAAY;AAAA,MACd,CAAA,MAAO;AAEL,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,YAAA,CAAa,WAAW,cAAc,CAAA;AACtC,UAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAA;AAtBE,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,EAC7B;AAAA,EAEA,OAAO,yBAAyB,KAAA,EAAoC;AAClE,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAAA,EAmBA,MAAA,GAAS;AACP,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,KAAA;AACvB,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AAEpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,uBACED,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAa,KAAA,EAAM,QAAA,EAClB,QAAA,kBAAAH,IAAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAI,GAAA,EAC3B,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAa,QAAA,EAAA,6DAAA,EAEd,CAAA;AAAA,wBACAL,IAACQ,MAAAA,EAAA,EAAO,SAAQ,MAAA,EAAO,OAAA,EAAS,IAAA,CAAK,eAAA,EAAiB,QAAA,EAAA,aAAA,EAEtD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,MAAA,uBACER,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAa,KAAA,EAAM,QAAA,EAClB,QAAA,kBAAAH,IAAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAI,GAAA,EAC3B,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAa,QAAA,EAAA,wDAAA,EAEd,CAAA;AAAA,wBACAL,GAAAA,CAACC,IAAAA,EAAA,EAAK,MAAK,GAAA,EAAI,KAAA,EAAM,MAAA,EAClB,QAAA,EAAA,KAAA,CAAM,aAAa,CAAA,GAChB,CAAA,qBAAA,EAAwB,KAAA,CAAM,UAAU,aACxC,wBAAA,EACN,CAAA;AAAA,wBACAD,IAACQ,MAAAA,EAAA,EAAO,SAAQ,MAAA,EAAO,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,QAAA,EAAA,OAAA,EAElD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,OAAA,GAAU,KAAA,GAAQ,IAAA;AAEnD,IAAA,uBACER,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAa,KAAA,EAAM,KAAA,EAClB,QAAA,kBAAAH,IAAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAI,GAAA,EAC3B,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAACK,OAAAA,CAAQ,IAAA,EAAR,EAAc,gBAAM,OAAA,EAAQ,CAAA;AAAA,MAC5B,OAAA,oBACCH,IAAAA,CAACD,IAAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,OAAM,MAAA,EAAO,QAAA,EAAA;AAAA,QAAA,cAAA;AAAA,QACb,OAAA,CAAQ,IAAA;AAAA,QAAK,aAAA;AAAA,QAAY,OAAA,CAAQ;AAAA,OAAA,EAChD,CAAA;AAAA,sBAEFD,IAACQ,MAAAA,EAAA,EAAO,SAAQ,MAAA,EAAO,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,QAAA,EAAA,OAAA,EAElD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AACF","file":"index.js","sourcesContent":["import type { SpLoginConfig } from '../cli/config-loader.js';\nimport {\n type Configuration,\n type IPublicClientApplication,\n type RedirectRequest,\n PublicClientApplication,\n} from '@azure/msal-browser';\n\nconst DEFAULT_SCOPES = ['https://graph.microsoft.com/.default'];\n\n/**\n * Build MSAL Configuration from SpLoginConfig.\n */\nfunction buildMsalConfig(config: SpLoginConfig): Configuration {\n const tenantId = config.tenantId.replace(/\\/$/, '');\n return {\n auth: {\n clientId: config.clientId,\n authority: `https://login.microsoftonline.com/${tenantId}`,\n redirectUri: config.redirectUri,\n },\n };\n}\n\nlet cachedInstance: IPublicClientApplication | null = null;\nlet cachedConfigKey: string | null = null;\n\n/**\n * Get or create a single MSAL PublicClientApplication instance for the given config.\n * Reuses the same instance when config matches (by key).\n */\nexport async function getMsalInstance(config: SpLoginConfig): Promise<IPublicClientApplication> {\n const key = `${config.tenantId}:${config.clientId}:${config.redirectUri}`;\n if (cachedInstance && cachedConfigKey === key) {\n return cachedInstance;\n }\n const msalConfig = buildMsalConfig(config);\n const instance = await PublicClientApplication.createPublicClientApplication(msalConfig);\n cachedInstance = instance;\n cachedConfigKey = key;\n return instance;\n}\n\n/**\n * Start the Microsoft login flow by redirecting the user to Azure AD.\n * The page will redirect away; after sign-in, Azure redirects back to redirectUri.\n */\nexport async function loginWithRedirect(config: SpLoginConfig): Promise<void> {\n const instance = await getMsalInstance(config);\n const scopes = config.scopes ?? DEFAULT_SCOPES;\n const request: RedirectRequest = { scopes };\n await instance.loginRedirect(request);\n}\n\n/**\n * Handle the redirect when returning from Azure AD after sign-in.\n * Call this once on app load (e.g. in useEffect). Returns the token if this load was a redirect callback.\n */\nexport async function handleRedirectPromise(\n config: SpLoginConfig\n): Promise<{ accessToken: string } | null> {\n const instance = await getMsalInstance(config);\n const result = await instance.handleRedirectPromise();\n if (!result) return null;\n return { accessToken: result.accessToken };\n}\n","import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n useRef,\n} from 'react';\nimport { Theme, Card, TextField, Button, Flex, Text, Box, Separator } from '@radix-ui/themes';\nimport { LockClosedIcon, PersonIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons';\nimport type { SpLoginConfig } from '../cli/config-loader.js';\nimport { loginWithRedirect, handleRedirectPromise } from '../auth/msal-browser.js';\n\ninterface AuthContextValue {\n token: string | null;\n isAuthenticated: boolean;\n login: (token: string) => void;\n logout: () => void;\n bypass: boolean;\n setBypass: (bypass: boolean) => void;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nconst MICROSOFT_BLUE = '#00a4ef';\n\n/** Simple Microsoft logo SVG (M in a square) for \"Sign in with Microsoft\" button */\nfunction MicrosoftLogoIcon({ size = 21 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 21 21\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ flexShrink: 0 }}\n >\n <rect width=\"10\" height=\"10\" fill=\"#F25022\" />\n <rect x=\"11\" width=\"10\" height=\"10\" fill=\"#7FBA00\" />\n <rect y=\"11\" width=\"10\" height=\"10\" fill=\"#00A4EF\" />\n <rect x=\"11\" y=\"11\" width=\"10\" height=\"10\" fill=\"#FFB900\" />\n </svg>\n );\n}\n\nexport interface SpAuthProviderProps {\n children: React.ReactNode;\n /** When set, shows \"Sign in with Microsoft\" and uses MSAL redirect flow. Can be built from env (e.g. NEXT_PUBLIC_*). */\n loginConfig?: SpLoginConfig;\n bypassEnabled?: boolean;\n onTokenChange?: (token: string | null) => void;\n}\n\nexport function SpAuthProvider({\n children,\n loginConfig,\n bypassEnabled = false,\n onTokenChange,\n}: SpAuthProviderProps) {\n const [token, setToken] = useState<string | null>(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('sp-kit-token');\n }\n return null;\n });\n const [bypass, setBypass] = useState(bypassEnabled);\n const [manualToken, setManualToken] = useState('');\n const [manualTokenOpen, setManualTokenOpen] = useState(false);\n const redirectCheckDone = useRef(false);\n\n useEffect(() => {\n if (onTokenChange) {\n onTokenChange(token);\n }\n }, [token, onTokenChange]);\n\n const login = useCallback((newToken: string) => {\n setToken(newToken);\n if (typeof window !== 'undefined') {\n localStorage.setItem('sp-kit-token', newToken);\n }\n setBypass(false);\n }, []);\n\n const logout = useCallback(() => {\n setToken(null);\n if (typeof window !== 'undefined') {\n localStorage.removeItem('sp-kit-token');\n }\n }, []);\n\n const handleManualLogin = useCallback(() => {\n if (manualToken.trim()) {\n login(manualToken.trim());\n }\n }, [manualToken, login]);\n\n // On load: handle redirect return from Microsoft login (only when loginConfig is set)\n useEffect(() => {\n if (!loginConfig || redirectCheckDone.current || typeof window === 'undefined') return;\n redirectCheckDone.current = true;\n handleRedirectPromise(loginConfig)\n .then((result) => {\n if (result) {\n login(result.accessToken);\n }\n })\n .catch(() => {\n redirectCheckDone.current = false;\n });\n }, [loginConfig, login]);\n\n const handleMicrosoftLogin = useCallback(() => {\n if (!loginConfig) return;\n loginWithRedirect(loginConfig);\n }, [loginConfig]);\n\n const isAuthenticated = bypass || !!token;\n\n if (!isAuthenticated) {\n const showMicrosoftFirst = !!loginConfig;\n return (\n <Theme>\n <Box\n style={{\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--gray-2)',\n padding: '1rem',\n }}\n >\n <Card style={{ width: '100%', maxWidth: '400px' }}>\n <Flex direction=\"column\" gap=\"4\" p=\"4\">\n <Flex direction=\"column\" gap=\"2\" align=\"center\">\n <Box\n style={{\n width: '48px',\n height: '48px',\n borderRadius: '50%',\n background: showMicrosoftFirst ? MICROSOFT_BLUE : 'var(--accent-9)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <LockClosedIcon width=\"24\" height=\"24\" color=\"white\" />\n </Box>\n <Text size=\"5\" weight=\"bold\">\n {showMicrosoftFirst ? \"Sign in to SharePoint\" : \"SharePoint Authentication\"}\n </Text>\n <Text size=\"2\" color=\"gray\" align=\"center\">\n {showMicrosoftFirst\n ? \"Sign in with your Microsoft account to continue\"\n : \"Enter your access token to continue\"}\n </Text>\n </Flex>\n\n <Separator size=\"4\" />\n\n <Flex direction=\"column\" gap=\"3\">\n {showMicrosoftFirst && (\n <Button\n size=\"3\"\n onClick={handleMicrosoftLogin}\n style={{\n width: '100%',\n backgroundColor: MICROSOFT_BLUE,\n color: 'white',\n }}\n >\n <MicrosoftLogoIcon />\n Sign in with Microsoft\n </Button>\n )}\n\n {showMicrosoftFirst && (\n <Button\n variant=\"soft\"\n size=\"2\"\n style={{ width: '100%' }}\n onClick={() => setManualTokenOpen((o) => !o)}\n >\n Token ile giris\n {manualTokenOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n </Button>\n )}\n\n {(showMicrosoftFirst ? manualTokenOpen : true) && (\n <Flex direction=\"column\" gap=\"3\">\n <Box>\n <Text as=\"label\" size=\"2\" weight=\"medium\" mb=\"1\" style={{ display: 'block' }}>\n Access Token\n </Text>\n <TextField.Root\n type=\"password\"\n placeholder=\"Enter your SharePoint access token\"\n value={manualToken}\n onChange={(e) => setManualToken(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleManualLogin();\n }\n }}\n size=\"3\"\n >\n <TextField.Slot>\n <PersonIcon />\n </TextField.Slot>\n </TextField.Root>\n </Box>\n <Button\n size=\"3\"\n variant={showMicrosoftFirst ? 'soft' : 'solid'}\n onClick={handleManualLogin}\n disabled={!manualToken.trim()}\n style={{ width: '100%' }}\n >\n <LockClosedIcon />\n Sign In\n </Button>\n </Flex>\n )}\n\n {bypassEnabled && (\n <>\n <Separator size=\"4\" />\n <Button\n variant=\"soft\"\n size=\"2\"\n onClick={() => setBypass(true)}\n style={{ width: '100%' }}\n >\n Bypass (Development)\n </Button>\n </>\n )}\n </Flex>\n\n <Text size=\"1\" color=\"gray\" align=\"center\">\n Your token is stored locally and never sent to external servers\n </Text>\n </Flex>\n </Card>\n </Box>\n </Theme>\n );\n }\n\n return (\n <AuthContext.Provider value={{ token, isAuthenticated, login, logout, bypass, setBypass }}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useSpAuth(): AuthContextValue {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useSpAuth must be used within a <SpAuthProvider>');\n }\n return context;\n}\n","import { useCallback } from 'react';\nimport { SpProvider, type SpProviderProps } from './sp-provider.js';\nimport { useSpAuth } from './sp-auth-provider.js';\n\nexport interface SpProviderWithAuthProps extends Omit<SpProviderProps, 'getAccessToken'> {\n // bypassEnabled is handled by SpAuthProvider, not here\n}\n\n/**\n * SpProvider wrapper that automatically uses SpAuthProvider for authentication.\n * Use this if you want the built-in auth system with login screen.\n *\n * For custom auth systems, use SpProvider directly with your own getAccessToken.\n */\nexport function SpProviderWithAuth({\n siteId,\n children,\n baseUrl,\n retryOptions,\n}: SpProviderWithAuthProps) {\n const { token, bypass } = useSpAuth();\n\n const getAccessToken = useCallback(async () => {\n if (bypass) {\n return 'bypass-token';\n }\n if (!token) {\n throw new Error('No access token available. Please authenticate.');\n }\n return token;\n }, [token, bypass]);\n\n return (\n <SpProvider\n siteId={siteId}\n getAccessToken={getAccessToken}\n baseUrl={baseUrl}\n retryOptions={retryOptions}\n >\n {children}\n </SpProvider>\n );\n}\n","import React from 'react';\nimport { Table, Spinner, Text, Callout } from '@radix-ui/themes';\nimport { useSpList } from '../hooks/use-sp-list.js';\n\nexport interface SpListTableColumn<T> {\n key: keyof T & string;\n label: string;\n format?: 'text' | 'number' | 'currency' | 'date' | 'boolean';\n render?: (value: unknown, item: T) => React.ReactNode;\n}\n\nexport interface SpListTableProps<T extends Record<string, unknown>> {\n listId: string;\n contentTypeName?: string;\n columns: SpListTableColumn<T>[];\n filter?: string;\n orderBy?: string;\n top?: number;\n onRowClick?: (item: T, id: string) => void;\n emptyMessage?: string;\n}\n\nfunction formatValue(value: unknown, format?: string): string {\n if (value === null || value === undefined) return '-';\n switch (format) {\n case 'currency':\n return typeof value === 'number' ? value.toLocaleString('tr-TR', { style: 'currency', currency: 'TRY' }) : String(value);\n case 'number':\n return typeof value === 'number' ? value.toLocaleString('tr-TR') : String(value);\n case 'date':\n return typeof value === 'string' ? new Date(value).toLocaleDateString('tr-TR') : String(value);\n case 'boolean':\n return value ? 'Evet' : 'Hayir';\n default:\n return String(value);\n }\n}\n\nexport function SpListTable<T extends Record<string, unknown> = Record<string, unknown>>({\n listId,\n contentTypeName,\n columns,\n filter,\n orderBy,\n top,\n onRowClick,\n emptyMessage = 'Kayit bulunamadi',\n}: SpListTableProps<T>) {\n const { data, isLoading, error } = useSpList<T>({\n listId,\n contentTypeName,\n filter,\n orderBy,\n top,\n });\n\n if (isLoading) {\n return <Spinner size=\"3\" />;\n }\n\n if (error) {\n return (\n <Callout.Root color=\"red\">\n <Callout.Text>{error.message}</Callout.Text>\n </Callout.Root>\n );\n }\n\n if (!data || data.length === 0) {\n return <Text color=\"gray\">{emptyMessage}</Text>;\n }\n\n return (\n <Table.Root>\n <Table.Header>\n <Table.Row>\n {columns.map((col) => (\n <Table.ColumnHeaderCell key={col.key}>{col.label}</Table.ColumnHeaderCell>\n ))}\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {data.map((item) => (\n <Table.Row\n key={item.id}\n onClick={onRowClick ? () => onRowClick(item.fields, item.id) : undefined}\n style={onRowClick ? { cursor: 'pointer' } : undefined}\n >\n {columns.map((col) => (\n <Table.Cell key={col.key}>\n {col.render\n ? col.render(item.fields[col.key], item.fields)\n : formatValue(item.fields[col.key], col.format)}\n </Table.Cell>\n ))}\n </Table.Row>\n ))}\n </Table.Body>\n </Table.Root>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { Button, TextField, Text, Callout, Flex, Box } from '@radix-ui/themes';\nimport { useSpCreate, useSpUpdate } from '../hooks/use-sp-mutation.js';\nimport type { SpListItem } from '../client/types.js';\n\nexport interface SpFormField {\n key: string;\n label: string;\n type?: 'text' | 'number' | 'date' | 'textarea';\n required?: boolean;\n placeholder?: string;\n defaultValue?: string | number;\n}\n\nexport interface SpItemFormProps<T extends Record<string, unknown>> {\n listId: string;\n fields: SpFormField[];\n mode?: 'create' | 'edit';\n itemId?: string;\n initialValues?: Partial<T>;\n onSuccess?: (item: SpListItem<T>) => void;\n onError?: (error: Error) => void;\n submitLabel?: string;\n}\n\nexport function SpItemForm<T extends Record<string, unknown> = Record<string, unknown>>({\n listId,\n fields,\n mode = 'create',\n itemId,\n initialValues = {},\n onSuccess,\n onError,\n submitLabel,\n}: SpItemFormProps<T>) {\n const [values, setValues] = useState<Record<string, unknown>>(() => {\n const initial: Record<string, unknown> = {};\n for (const field of fields) {\n initial[field.key] = initialValues[field.key as keyof T] ?? field.defaultValue ?? '';\n }\n return initial;\n });\n const [formError, setFormError] = useState<string | null>(null);\n\n const { mutate: create, isLoading: isCreating } = useSpCreate<T>({ listId });\n const { mutate: update, isLoading: isUpdating } = useSpUpdate<T>({ listId });\n\n const isLoading = isCreating || isUpdating;\n\n const handleChange = useCallback((key: string, value: string) => {\n setValues((prev) => ({ ...prev, [key]: value }));\n }, []);\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n setFormError(null);\n\n try {\n let result: SpListItem<T>;\n if (mode === 'edit' && itemId) {\n result = await update({ itemId, fields: values as Partial<T> });\n } else {\n result = await create({ fields: values as Partial<T> });\n }\n onSuccess?.(result);\n } catch (error) {\n const err = error as Error;\n setFormError(err.message);\n onError?.(err);\n }\n },\n [mode, itemId, values, create, update, onSuccess, onError],\n );\n\n return (\n <form onSubmit={handleSubmit}>\n <Flex direction=\"column\" gap=\"3\">\n {formError && (\n <Callout.Root color=\"red\">\n <Callout.Text>{formError}</Callout.Text>\n </Callout.Root>\n )}\n\n {fields.map((field) => (\n <Box key={field.key}>\n <Text as=\"label\" size=\"2\" weight=\"medium\">\n {field.label}\n {field.required && <Text color=\"red\"> *</Text>}\n </Text>\n <TextField.Root\n type={field.type === 'number' ? 'number' : field.type === 'date' ? 'date' : 'text'}\n value={String(values[field.key] ?? '')}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleChange(field.key, e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n />\n </Box>\n ))}\n\n <Button type=\"submit\" disabled={isLoading}>\n {isLoading ? 'Kaydediliyor...' : submitLabel ?? (mode === 'edit' ? 'Guncelle' : 'Olustur')}\n </Button>\n </Flex>\n </form>\n );\n}\n","import React from 'react';\nimport { Card, Flex, Text, Separator } from '@radix-ui/themes';\n\nexport interface SpItemCardField {\n key: string;\n label: string;\n format?: 'text' | 'number' | 'currency' | 'date' | 'boolean';\n render?: (value: unknown) => React.ReactNode;\n}\n\nexport interface SpItemCardProps<T extends Record<string, unknown>> {\n item: T;\n fields: SpItemCardField[];\n title?: string;\n onClick?: () => void;\n}\n\nfunction formatCardValue(value: unknown, format?: string): string {\n if (value === null || value === undefined) return '-';\n switch (format) {\n case 'currency':\n return typeof value === 'number' ? value.toLocaleString('tr-TR', { style: 'currency', currency: 'TRY' }) : String(value);\n case 'number':\n return typeof value === 'number' ? value.toLocaleString('tr-TR') : String(value);\n case 'date':\n return typeof value === 'string' ? new Date(value).toLocaleDateString('tr-TR') : String(value);\n case 'boolean':\n return value ? 'Evet' : 'Hayir';\n default:\n return String(value);\n }\n}\n\nexport function SpItemCard<T extends Record<string, unknown> = Record<string, unknown>>({\n item,\n fields,\n title,\n onClick,\n}: SpItemCardProps<T>) {\n return (\n <Card\n onClick={onClick}\n style={onClick ? { cursor: 'pointer' } : undefined}\n >\n <Flex direction=\"column\" gap=\"2\">\n {title && (\n <>\n <Text size=\"4\" weight=\"bold\">\n {title}\n </Text>\n <Separator size=\"4\" />\n </>\n )}\n\n {fields.map((field) => (\n <Flex key={field.key} justify=\"between\" align=\"center\">\n <Text size=\"2\" color=\"gray\">\n {field.label}\n </Text>\n <Text size=\"2\" weight=\"medium\">\n {field.render\n ? field.render(item[field.key])\n : formatCardValue(item[field.key], field.format)}\n </Text>\n </Flex>\n ))}\n </Flex>\n </Card>\n );\n}\n","import React, { Component } from 'react';\nimport { Callout, Button, Flex, Text } from '@radix-ui/themes';\nimport { SpAuthError, SpThrottleError, SpError } from '../client/errors.js';\n\ninterface SpErrorBoundaryProps {\n children: React.ReactNode;\n onAuthError?: () => void;\n fallback?: React.ReactNode;\n}\n\ninterface SpErrorBoundaryState {\n error: Error | null;\n}\n\nexport class SpErrorBoundary extends Component<SpErrorBoundaryProps, SpErrorBoundaryState> {\n constructor(props: SpErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): SpErrorBoundaryState {\n return { error };\n }\n\n handleRetry = () => {\n this.setState({ error: null });\n };\n\n handleAuthError = () => {\n const { onAuthError } = this.props;\n if (onAuthError) {\n onAuthError();\n } else {\n // Default: logout and show login screen\n if (typeof window !== 'undefined') {\n localStorage.removeItem('sp-kit-token');\n window.location.reload();\n }\n }\n };\n\n render() {\n const { error } = this.state;\n const { children, fallback } = this.props;\n\n if (!error) {\n return children;\n }\n\n if (fallback) {\n return fallback;\n }\n\n if (error instanceof SpAuthError) {\n return (\n <Callout.Root color=\"orange\">\n <Flex direction=\"column\" gap=\"2\">\n <Callout.Text>\n Session expired or authorization error. Please login again.\n </Callout.Text>\n <Button variant=\"soft\" onClick={this.handleAuthError}>\n Login Again\n </Button>\n </Flex>\n </Callout.Root>\n );\n }\n\n if (error instanceof SpThrottleError) {\n return (\n <Callout.Root color=\"yellow\">\n <Flex direction=\"column\" gap=\"2\">\n <Callout.Text>\n Too many requests. Please wait a moment and try again.\n </Callout.Text>\n <Text size=\"1\" color=\"gray\">\n {error.retryAfter > 0\n ? `Estimated wait time: ${error.retryAfter} seconds`\n : 'Please try again later'}\n </Text>\n <Button variant=\"soft\" onClick={this.handleRetry}>\n Retry\n </Button>\n </Flex>\n </Callout.Root>\n );\n }\n\n const spError = error instanceof SpError ? error : null;\n\n return (\n <Callout.Root color=\"red\">\n <Flex direction=\"column\" gap=\"2\">\n <Callout.Text>{error.message}</Callout.Text>\n {spError && (\n <Text size=\"1\" color=\"gray\">\n Error code: {spError.code} | Status: {spError.status}\n </Text>\n )}\n <Button variant=\"soft\" onClick={this.handleRetry}>\n Retry\n </Button>\n </Flex>\n </Callout.Root>\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type ListSelectionStrategy = 'interactive' | 'first' | 'error' | 'all';
|
|
2
|
+
/** Microsoft login (MSAL) config for browser/SPA. Use for "Sign in with Microsoft". */
|
|
3
|
+
interface SpLoginConfig {
|
|
4
|
+
tenantId: string;
|
|
5
|
+
clientId: string;
|
|
6
|
+
redirectUri: string;
|
|
7
|
+
scopes?: string[];
|
|
8
|
+
}
|
|
9
|
+
interface ContentTypeConfig {
|
|
10
|
+
listId?: string;
|
|
11
|
+
listName?: string;
|
|
12
|
+
contentTypeName: string;
|
|
13
|
+
outputType: string;
|
|
14
|
+
strategy?: ListSelectionStrategy;
|
|
15
|
+
}
|
|
16
|
+
interface SpKitConfig {
|
|
17
|
+
siteId: string;
|
|
18
|
+
tenantId?: string;
|
|
19
|
+
clientId?: string;
|
|
20
|
+
clientSecret?: string;
|
|
21
|
+
/** Microsoft login config for browser (SPA). Optional; when set, enables "Sign in with Microsoft". */
|
|
22
|
+
login?: SpLoginConfig;
|
|
23
|
+
defaultStrategy?: ListSelectionStrategy;
|
|
24
|
+
contentTypes: ContentTypeConfig[];
|
|
25
|
+
options?: {
|
|
26
|
+
outputDir?: string;
|
|
27
|
+
outputFile?: string;
|
|
28
|
+
fieldNameMapping?: Record<string, string>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
declare function loadConfig(configPath: string): Promise<SpKitConfig>;
|
|
32
|
+
|
|
33
|
+
export { type ContentTypeConfig as C, type ListSelectionStrategy as L, type SpLoginConfig as S, type SpKitConfig as a, loadConfig as l };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type ListSelectionStrategy = 'interactive' | 'first' | 'error' | 'all';
|
|
2
|
+
/** Microsoft login (MSAL) config for browser/SPA. Use for "Sign in with Microsoft". */
|
|
3
|
+
interface SpLoginConfig {
|
|
4
|
+
tenantId: string;
|
|
5
|
+
clientId: string;
|
|
6
|
+
redirectUri: string;
|
|
7
|
+
scopes?: string[];
|
|
8
|
+
}
|
|
9
|
+
interface ContentTypeConfig {
|
|
10
|
+
listId?: string;
|
|
11
|
+
listName?: string;
|
|
12
|
+
contentTypeName: string;
|
|
13
|
+
outputType: string;
|
|
14
|
+
strategy?: ListSelectionStrategy;
|
|
15
|
+
}
|
|
16
|
+
interface SpKitConfig {
|
|
17
|
+
siteId: string;
|
|
18
|
+
tenantId?: string;
|
|
19
|
+
clientId?: string;
|
|
20
|
+
clientSecret?: string;
|
|
21
|
+
/** Microsoft login config for browser (SPA). Optional; when set, enables "Sign in with Microsoft". */
|
|
22
|
+
login?: SpLoginConfig;
|
|
23
|
+
defaultStrategy?: ListSelectionStrategy;
|
|
24
|
+
contentTypes: ContentTypeConfig[];
|
|
25
|
+
options?: {
|
|
26
|
+
outputDir?: string;
|
|
27
|
+
outputFile?: string;
|
|
28
|
+
fieldNameMapping?: Record<string, string>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
declare function loadConfig(configPath: string): Promise<SpKitConfig>;
|
|
32
|
+
|
|
33
|
+
export { type ContentTypeConfig as C, type ListSelectionStrategy as L, type SpLoginConfig as S, type SpKitConfig as a, loadConfig as l };
|