@pyreon/feature 0.0.1

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.
@@ -0,0 +1,501 @@
1
+ import { batch, signal } from "@pyreon/reactivity";
2
+ import { useForm } from "@pyreon/form";
3
+ import { zodSchema } from "@pyreon/validation";
4
+ import { useMutation, useQuery, useQueryClient } from "@pyreon/query";
5
+ import { getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useTable } from "@pyreon/table";
6
+ import { defineStore } from "@pyreon/store";
7
+
8
+ //#region src/schema.ts
9
+ /** Symbol used to tag reference schema objects. */
10
+
11
+ /**
12
+ * Check if a value is a reference schema created by `reference()`.
13
+ */
14
+ function isReference(value) {
15
+ return value !== null && typeof value === "object" && value[REFERENCE_TAG] === true;
16
+ }
17
+ /**
18
+ * Create a reference field that links to another feature.
19
+ *
20
+ * Returns a Zod-compatible schema that validates as `string | number` and
21
+ * carries metadata about the referenced feature for form dropdowns and table links.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { defineFeature, reference } from '@pyreon/feature'
26
+ *
27
+ * const posts = defineFeature({
28
+ * name: 'posts',
29
+ * schema: z.object({
30
+ * title: z.string(),
31
+ * authorId: reference(users),
32
+ * }),
33
+ * api: '/api/posts',
34
+ * })
35
+ * ```
36
+ */
37
+ function reference(feature) {
38
+ const featureName = feature.name;
39
+ function validateRef(value) {
40
+ if (typeof value === "string" || typeof value === "number") return {
41
+ success: true
42
+ };
43
+ return {
44
+ success: false,
45
+ error: {
46
+ issues: [{
47
+ message: `Expected string or number reference to ${featureName}, got ${typeof value}`
48
+ }]
49
+ }
50
+ };
51
+ }
52
+ return {
53
+ [REFERENCE_TAG]: true,
54
+ _featureName: featureName,
55
+ safeParse: validateRef,
56
+ safeParseAsync: async value => validateRef(value),
57
+ _def: {
58
+ typeName: "ZodString"
59
+ }
60
+ };
61
+ }
62
+ /**
63
+ * Convert a field name to a human-readable label.
64
+ * e.g., 'firstName' → 'First Name', 'created_at' → 'Created At'
65
+ */
66
+ function nameToLabel(name) {
67
+ return name.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ").replace(/\b\w/g, c => c.toUpperCase());
68
+ }
69
+ /**
70
+ * Detect the field type from a Zod schema shape entry.
71
+ * Duck-typed — works with Zod v3 and v4 without importing Zod.
72
+ */
73
+ function detectFieldType(zodField) {
74
+ if (isReference(zodField)) return {
75
+ type: "reference",
76
+ optional: false,
77
+ referenceTo: zodField._featureName
78
+ };
79
+ if (!zodField || typeof zodField !== "object") return {
80
+ type: "unknown",
81
+ optional: false
82
+ };
83
+ let inner = zodField;
84
+ let optional = false;
85
+ const getTypeName = obj => {
86
+ const def = obj._def;
87
+ if (def?.typeName && typeof def.typeName === "string") return def.typeName;
88
+ const zodDef = obj._zod?.def;
89
+ if (zodDef?.type && typeof zodDef.type === "string") return zodDef.type;
90
+ };
91
+ const typeName = getTypeName(inner);
92
+ if (typeName === "ZodOptional" || typeName === "ZodNullable" || typeName === "optional" || typeName === "nullable") {
93
+ optional = true;
94
+ const innerType = inner._def?.innerType ?? inner._zod?.def;
95
+ if (innerType && typeof innerType === "object") inner = innerType;
96
+ }
97
+ const innerTypeName = getTypeName(inner) ?? typeName;
98
+ if (!innerTypeName) return {
99
+ type: "unknown",
100
+ optional
101
+ };
102
+ const type = {
103
+ ZodString: "string",
104
+ ZodNumber: "number",
105
+ ZodBoolean: "boolean",
106
+ ZodDate: "date",
107
+ ZodEnum: "enum",
108
+ ZodNativeEnum: "enum",
109
+ ZodArray: "array",
110
+ ZodObject: "object",
111
+ string: "string",
112
+ number: "number",
113
+ boolean: "boolean",
114
+ date: "date",
115
+ enum: "enum",
116
+ array: "array",
117
+ object: "object"
118
+ }[innerTypeName] ?? "string";
119
+ let enumValues;
120
+ if (type === "enum") {
121
+ const def = inner._def;
122
+ if (def?.values && Array.isArray(def.values)) enumValues = def.values;
123
+ const zodDef = inner._zod?.def;
124
+ if (zodDef?.values && Array.isArray(zodDef.values)) enumValues = zodDef.values;
125
+ }
126
+ return {
127
+ type,
128
+ optional,
129
+ enumValues
130
+ };
131
+ }
132
+ /**
133
+ * Extract field information from a Zod object schema.
134
+ * Returns an array of FieldInfo objects describing each field.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * const schema = z.object({ name: z.string(), age: z.number().optional() })
139
+ * const fields = extractFields(schema)
140
+ * // [
141
+ * // { name: 'name', type: 'string', optional: false, label: 'Name' },
142
+ * // { name: 'age', type: 'number', optional: true, label: 'Age' },
143
+ * // ]
144
+ * ```
145
+ */
146
+ function extractFields(schema) {
147
+ if (!schema || typeof schema !== "object") return [];
148
+ const s = schema;
149
+ let shape;
150
+ if (s.shape && typeof s.shape === "object") shape = s.shape;
151
+ if (!shape) {
152
+ const def = s._def;
153
+ if (def?.shape) shape = typeof def.shape === "function" ? def.shape() : def.shape;
154
+ }
155
+ if (!shape) {
156
+ const zodDef = s._zod?.def;
157
+ if (zodDef?.shape && typeof zodDef.shape === "object") shape = zodDef.shape;
158
+ }
159
+ if (!shape) return [];
160
+ return Object.entries(shape).map(([name, fieldSchema]) => {
161
+ const {
162
+ type,
163
+ optional,
164
+ enumValues,
165
+ referenceTo
166
+ } = detectFieldType(fieldSchema);
167
+ const info = {
168
+ name,
169
+ type,
170
+ optional,
171
+ label: nameToLabel(name)
172
+ };
173
+ if (enumValues) info.enumValues = enumValues;
174
+ if (referenceTo) info.referenceTo = referenceTo;
175
+ return info;
176
+ });
177
+ }
178
+ /**
179
+ * Generate default initial values from a schema's field types.
180
+ */
181
+ function defaultInitialValues(fields) {
182
+ const values = {};
183
+ for (const field of fields) switch (field.type) {
184
+ case "string":
185
+ values[field.name] = "";
186
+ break;
187
+ case "number":
188
+ values[field.name] = 0;
189
+ break;
190
+ case "boolean":
191
+ values[field.name] = false;
192
+ break;
193
+ case "enum":
194
+ values[field.name] = field.enumValues?.[0] ?? "";
195
+ break;
196
+ case "date":
197
+ values[field.name] = "";
198
+ break;
199
+ default:
200
+ values[field.name] = "";
201
+ }
202
+ return values;
203
+ }
204
+
205
+ //#endregion
206
+ //#region src/define-feature.ts
207
+ function createFetcher(baseFetcher = fetch) {
208
+ async function request(url, init) {
209
+ const res = await baseFetcher(url, init);
210
+ if (!res.ok) {
211
+ let message = `${init?.method ?? "GET"} ${url} failed: ${res.status}`;
212
+ try {
213
+ const body = await res.json();
214
+ if (body?.message) message = body.message;
215
+ if (body?.errors) throw Object.assign(new Error(message), {
216
+ status: res.status,
217
+ errors: body.errors
218
+ });
219
+ } catch (e) {
220
+ if (e instanceof Error && "errors" in e) throw e;
221
+ }
222
+ throw Object.assign(new Error(message), {
223
+ status: res.status
224
+ });
225
+ }
226
+ if (res.status === 204) return void 0;
227
+ return res.json();
228
+ }
229
+ return {
230
+ list(url, params) {
231
+ return request(`${url}${params ? `?${new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)])).toString()}` : ""}`);
232
+ },
233
+ getById(url, id) {
234
+ return request(`${url}/${id}`);
235
+ },
236
+ create(url, data) {
237
+ return request(url, {
238
+ method: "POST",
239
+ headers: {
240
+ "Content-Type": "application/json"
241
+ },
242
+ body: JSON.stringify(data)
243
+ });
244
+ },
245
+ update(url, id, data) {
246
+ return request(`${url}/${id}`, {
247
+ method: "PUT",
248
+ headers: {
249
+ "Content-Type": "application/json"
250
+ },
251
+ body: JSON.stringify(data)
252
+ });
253
+ },
254
+ delete(url, id) {
255
+ return request(`${url}/${id}`, {
256
+ method: "DELETE"
257
+ });
258
+ }
259
+ };
260
+ }
261
+ function createValidator(schema, customValidate) {
262
+ if (customValidate) return customValidate;
263
+ if (schema && typeof schema === "object" && "safeParseAsync" in schema && typeof schema.safeParseAsync === "function") return zodSchema(schema);
264
+ }
265
+ function resolvePageValue(page) {
266
+ if (page === void 0) return void 0;
267
+ if (typeof page === "function") return page();
268
+ return page;
269
+ }
270
+ /**
271
+ * Define a schema-driven feature with auto-generated CRUD hooks.
272
+ *
273
+ * @example
274
+ * ```ts
275
+ * import { defineFeature } from '@pyreon/feature'
276
+ * import { z } from 'zod'
277
+ *
278
+ * const users = defineFeature({
279
+ * name: 'users',
280
+ * schema: z.object({
281
+ * name: z.string().min(2),
282
+ * email: z.string().email(),
283
+ * role: z.enum(['admin', 'editor', 'viewer']),
284
+ * }),
285
+ * api: '/api/users',
286
+ * })
287
+ * ```
288
+ */
289
+ function defineFeature(config) {
290
+ const {
291
+ name,
292
+ schema,
293
+ api,
294
+ fetcher: customFetcher
295
+ } = config;
296
+ const http = createFetcher(customFetcher);
297
+ const fields = extractFields(schema);
298
+ const autoInitialValues = defaultInitialValues(fields);
299
+ const initialValues = config.initialValues ? {
300
+ ...autoInitialValues,
301
+ ...config.initialValues
302
+ } : autoInitialValues;
303
+ const validate = createValidator(schema, config.validate);
304
+ const queryKeyBase = [name];
305
+ const queryKey = suffix => suffix !== void 0 ? [name, suffix] : [name];
306
+ return {
307
+ name,
308
+ api,
309
+ schema,
310
+ fields,
311
+ queryKey,
312
+ useStore: defineStore(name, () => {
313
+ const items = signal([]);
314
+ const selected = signal(null);
315
+ const loading = signal(false);
316
+ const select = id => {
317
+ const found = items.peek().find(item => {
318
+ return item.id === id;
319
+ });
320
+ selected.set(found ?? null);
321
+ };
322
+ const clear = () => {
323
+ selected.set(null);
324
+ };
325
+ return {
326
+ items,
327
+ selected,
328
+ loading,
329
+ select,
330
+ clear
331
+ };
332
+ }),
333
+ useList(options) {
334
+ return useQuery(() => {
335
+ const pageValue = resolvePageValue(options?.page);
336
+ const pageSize = options?.pageSize ?? 20;
337
+ const params = {
338
+ ...(options?.params ?? {})
339
+ };
340
+ if (pageValue !== void 0) {
341
+ params.page = pageValue;
342
+ params.pageSize = pageSize;
343
+ }
344
+ return {
345
+ queryKey: [...queryKeyBase, "list", params],
346
+ queryFn: () => http.list(api, Object.keys(params).length > 0 ? params : void 0),
347
+ staleTime: options?.staleTime,
348
+ enabled: options?.enabled
349
+ };
350
+ });
351
+ },
352
+ useById(id) {
353
+ return useQuery(() => ({
354
+ queryKey: [name, id],
355
+ queryFn: () => http.getById(api, id),
356
+ enabled: id !== void 0 && id !== null
357
+ }));
358
+ },
359
+ useSearch(searchTerm, options) {
360
+ return useQuery(() => ({
361
+ queryKey: [...queryKeyBase, "search", searchTerm()],
362
+ queryFn: () => http.list(api, {
363
+ ...options?.params,
364
+ q: searchTerm()
365
+ }),
366
+ enabled: searchTerm().length > 0,
367
+ staleTime: options?.staleTime
368
+ }));
369
+ },
370
+ useCreate() {
371
+ const client = useQueryClient();
372
+ return useMutation({
373
+ mutationFn: data => http.create(api, data),
374
+ onSuccess: () => {
375
+ client.invalidateQueries({
376
+ queryKey: queryKeyBase
377
+ });
378
+ }
379
+ });
380
+ },
381
+ useUpdate() {
382
+ const client = useQueryClient();
383
+ return useMutation({
384
+ mutationFn: ({
385
+ id,
386
+ data
387
+ }) => http.update(api, id, data),
388
+ onMutate: async variables => {
389
+ await client.cancelQueries({
390
+ queryKey: [name, variables.id]
391
+ });
392
+ const previous = client.getQueryData([name, variables.id]);
393
+ client.setQueryData([name, variables.id], old => {
394
+ if (old && typeof old === "object") return {
395
+ ...old,
396
+ ...variables.data
397
+ };
398
+ return variables.data;
399
+ });
400
+ return {
401
+ previous
402
+ };
403
+ },
404
+ onError: (_err, variables, context) => {
405
+ if (context?.previous) client.setQueryData([name, variables.id], context.previous);
406
+ },
407
+ onSuccess: (_data, variables) => {
408
+ client.invalidateQueries({
409
+ queryKey: queryKeyBase
410
+ });
411
+ client.invalidateQueries({
412
+ queryKey: [name, variables.id]
413
+ });
414
+ }
415
+ });
416
+ },
417
+ useDelete() {
418
+ const client = useQueryClient();
419
+ return useMutation({
420
+ mutationFn: id => http.delete(api, id),
421
+ onSuccess: () => {
422
+ client.invalidateQueries({
423
+ queryKey: queryKeyBase
424
+ });
425
+ }
426
+ });
427
+ },
428
+ useForm(options) {
429
+ const mode = options?.mode ?? "create";
430
+ const form = useForm({
431
+ initialValues: {
432
+ ...initialValues,
433
+ ...(options?.initialValues ?? {})
434
+ },
435
+ schema: validate,
436
+ validateOn: options?.validateOn ?? "blur",
437
+ onSubmit: async values => {
438
+ try {
439
+ let result;
440
+ if (mode === "edit" && options?.id !== void 0) result = await http.update(api, options.id, values);else result = await http.create(api, values);
441
+ options?.onSuccess?.(result);
442
+ } catch (err) {
443
+ options?.onError?.(err);
444
+ throw err;
445
+ }
446
+ }
447
+ });
448
+ if (mode === "edit" && options?.id !== void 0) {
449
+ form.isSubmitting.set(true);
450
+ http.getById(api, options.id).then(data => {
451
+ batch(() => {
452
+ for (const key of Object.keys(data)) form.setFieldValue(key, data[key]);
453
+ form.isSubmitting.set(false);
454
+ });
455
+ }, () => {
456
+ form.isSubmitting.set(false);
457
+ });
458
+ }
459
+ return form;
460
+ },
461
+ useTable(data, options) {
462
+ const visibleFields = options?.columns ? fields.filter(f => options.columns.includes(f.name)) : fields;
463
+ const columns = visibleFields.map(field => ({
464
+ accessorKey: field.name,
465
+ header: field.label,
466
+ ...(options?.columnOverrides?.[field.name] ?? {})
467
+ }));
468
+ const sorting = signal([]);
469
+ const globalFilter = signal("");
470
+ return {
471
+ table: useTable(() => ({
472
+ data: typeof data === "function" ? data() : data,
473
+ columns,
474
+ state: {
475
+ sorting: sorting(),
476
+ globalFilter: globalFilter()
477
+ },
478
+ onSortingChange: updater => {
479
+ sorting.set(typeof updater === "function" ? updater(sorting()) : updater);
480
+ },
481
+ onGlobalFilterChange: updater => {
482
+ globalFilter.set(typeof updater === "function" ? updater(globalFilter()) : updater);
483
+ },
484
+ getCoreRowModel: getCoreRowModel(),
485
+ getSortedRowModel: getSortedRowModel(),
486
+ getFilteredRowModel: getFilteredRowModel(),
487
+ ...(options?.pageSize ? {
488
+ getPaginationRowModel: getPaginationRowModel()
489
+ } : {})
490
+ })),
491
+ sorting,
492
+ globalFilter,
493
+ columns: visibleFields
494
+ };
495
+ }
496
+ };
497
+ }
498
+
499
+ //#endregion
500
+ export { defaultInitialValues, defineFeature, extractFields, isReference, reference };
501
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":["_useQuery","_useMutation","_useForm","_useTable"],"sources":["../../src/schema.ts","../../src/define-feature.ts"],"mappings":";;;;;;;;;;;;;AA4DA,SAAgB,WAAA,CAAY,KAAA,EAA0C;EACpE,OACE,KAAA,KAAU,IAAA,IACV,OAAO,KAAA,KAAU,QAAA,IAChB,KAAA,CAAkC,aAAA,CAAA,KAAmB,IAAA;;;;;;;;;;;;;;;;;;;;;;AAwB1D,SAAgB,SAAA,CAAU,OAAA,EAA4C;EACpE,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA;EAE5B,SAAS,WAAA,CAAY,KAAA,EAGnB;IACA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAChD,OAAO;MAAE,OAAA,EAAS;IAAA,CAAM;IAE1B,OAAO;MACL,OAAA,EAAS,KAAA;MACT,KAAA,EAAO;QACL,MAAA,EAAQ,CACN;UACE,OAAA,EAAS,0CAA0C,WAAA,SAAoB,OAAO,KAAA;QAAA,CAC/E;MACF;KAEJ;;EAGH,OAAO;KACJ,aAAA,GAAgB,IAAA;IACjB,YAAA,EAAc,WAAA;IACd,SAAA,EAAW,WAAA;IACX,cAAA,EAAgB,MAAO,KAAA,IAAmB,WAAA,CAAY,KAAA,CAAM;IAC5D,IAAA,EAAM;MAAE,QAAA,EAAU;IAAA;GACnB;;;;;;AAOH,SAAS,WAAA,CAAY,IAAA,EAAsB;EACzC,OAAO,IAAA,CACJ,OAAA,CAAQ,iBAAA,EAAmB,OAAA,CAAQ,CACnC,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,CACrB,OAAA,CAAQ,OAAA,EAAU,CAAA,IAAM,CAAA,CAAE,WAAA,CAAA,CAAa,CAAC;;;;;;AAO7C,SAAS,eAAA,CAAgB,QAAA,EAKvB;EAEA,IAAI,WAAA,CAAY,QAAA,CAAS,EACvB,OAAO;IACL,IAAA,EAAM,WAAA;IACN,QAAA,EAAU,KAAA;IACV,WAAA,EAAa,QAAA,CAAS;GACvB;EAGH,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EACnC,OAAO;IAAE,IAAA,EAAM,SAAA;IAAW,QAAA,EAAU;GAAO;EAM7C,IAAI,KAAA,GAHU,QAAA;EAId,IAAI,QAAA,GAAW,KAAA;EAGf,MAAM,WAAA,GAAe,GAAA,IAAqD;IAExE,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA;IAChB,IAAI,GAAA,EAAK,QAAA,IAAY,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,EAC3C,OAAO,GAAA,CAAI,QAAA;IAIb,MAAM,MAAA,GADM,GAAA,CAAI,IAAA,EACI,GAAA;IACpB,IAAI,MAAA,EAAQ,IAAA,IAAQ,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EACzC,OAAO,MAAA,CAAO,IAAA;;EAKlB,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,CAAM;EAGnC,IACE,QAAA,KAAa,aAAA,IACb,QAAA,KAAa,aAAA,IACb,QAAA,KAAa,UAAA,IACb,QAAA,KAAa,UAAA,EACb;IACA,QAAA,GAAW,IAAA;IAEX,MAAM,SAAA,GADM,KAAA,CAAM,IAAA,EAEX,SAAA,IAAc,KAAA,CAAM,IAAA,EAAkC,GAAA;IAC7D,IAAI,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EACpC,KAAA,GAAQ,SAAA;;EAIZ,MAAM,aAAA,GAAgB,WAAA,CAAY,KAAA,CAAM,IAAI,QAAA;EAG5C,IAAI,CAAC,aAAA,EAAe,OAAO;IAAE,IAAA,EAAM,SAAA;IAAW;GAAU;EAqBxD,MAAM,IAAA,GAnBqC;IACzC,SAAA,EAAW,QAAA;IACX,SAAA,EAAW,QAAA;IACX,UAAA,EAAY,SAAA;IACZ,OAAA,EAAS,MAAA;IACT,OAAA,EAAS,MAAA;IACT,aAAA,EAAe,MAAA;IACf,QAAA,EAAU,OAAA;IACV,SAAA,EAAW,QAAA;IAEX,MAAA,EAAQ,QAAA;IACR,MAAA,EAAQ,QAAA;IACR,OAAA,EAAS,SAAA;IACT,IAAA,EAAM,MAAA;IACN,IAAA,EAAM,MAAA;IACN,KAAA,EAAO,OAAA;IACP,MAAA,EAAQ;GACT,CAEoB,aAAA,CAAA,IAAkB,QAAA;EAGvC,IAAI,UAAA;EACJ,IAAI,IAAA,KAAS,MAAA,EAAQ;IACnB,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA;IAClB,IAAI,GAAA,EAAK,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAC1C,UAAA,GAAa,GAAA,CAAI,MAAA;IAGnB,MAAM,MAAA,GAAU,KAAA,CAAM,IAAA,EAAkC,GAAA;IAGxD,IAAI,MAAA,EAAQ,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAChD,UAAA,GAAa,MAAA,CAAO,MAAA;;EAIxB,OAAO;IAAE,IAAA;IAAM,QAAA;IAAU;GAAY;;;;;;;;;;;;;;;;AAiBvC,SAAgB,aAAA,CAAc,MAAA,EAA8B;EAC1D,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,EAAE;EAEpD,MAAM,CAAA,GAAI,MAAA;EAKV,IAAI,KAAA;EAGJ,IAAI,CAAA,CAAE,KAAA,IAAS,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAChC,KAAA,GAAQ,CAAA,CAAE,KAAA;EAIZ,IAAI,CAAC,KAAA,EAAO;IACV,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA;IACd,IAAI,GAAA,EAAK,KAAA,EACP,KAAA,GACE,OAAO,GAAA,CAAI,KAAA,KAAU,UAAA,GAChB,GAAA,CAAI,KAAA,CAAA,CAAyC,GAC7C,GAAA,CAAI,KAAA;;EAKf,IAAI,CAAC,KAAA,EAAO;IAEV,MAAM,MAAA,GADM,CAAA,CAAE,IAAA,EACM,GAAA;IACpB,IAAI,MAAA,EAAQ,KAAA,IAAS,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,EAC3C,KAAA,GAAQ,MAAA,CAAO,KAAA;;EAInB,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE;EAErB,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAA,CAAA,CAAK,CAAC,IAAA,EAAM,WAAA,CAAA,KAAiB;IACxD,MAAM;MAAE,IAAA;MAAM,QAAA;MAAU,UAAA;MAAY;IAAA,CAAA,GAClC,eAAA,CAAgB,WAAA,CAAY;IAC9B,MAAM,IAAA,GAAkB;MACtB,IAAA;MACA,IAAA;MACA,QAAA;MACA,KAAA,EAAO,WAAA,CAAY,IAAA;KACpB;IACD,IAAI,UAAA,EAAY,IAAA,CAAK,UAAA,GAAa,UAAA;IAClC,IAAI,WAAA,EAAa,IAAA,CAAK,WAAA,GAAc,WAAA;IACpC,OAAO,IAAA;IACP;;;;;AAMJ,SAAgB,oBAAA,CACd,MAAA,EACyB;EACzB,MAAM,MAAA,GAAkC,CAAA,CAAE;EAC1C,KAAK,MAAM,KAAA,IAAS,MAAA,EAClB,QAAQ,KAAA,CAAM,IAAA;IACZ,KAAK,QAAA;MACH,MAAA,CAAO,KAAA,CAAM,IAAA,CAAA,GAAQ,EAAA;MACrB;IACF,KAAK,QAAA;MACH,MAAA,CAAO,KAAA,CAAM,IAAA,CAAA,GAAQ,CAAA;MACrB;IACF,KAAK,SAAA;MACH,MAAA,CAAO,KAAA,CAAM,IAAA,CAAA,GAAQ,KAAA;MACrB;IACF,KAAK,MAAA;MACH,MAAA,CAAO,KAAA,CAAM,IAAA,CAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,CAAA,CAAA,IAAM,EAAA;MAC9C;IACF,KAAK,MAAA;MACH,MAAA,CAAO,KAAA,CAAM,IAAA,CAAA,GAAQ,EAAA;MACrB;IACF;MACE,MAAA,CAAO,KAAA,CAAM,IAAA,CAAA,GAAQ,EAAA;;EAG3B,OAAO,MAAA;;;;;AC7ST,SAAS,aAAA,CAAc,WAAA,GAA4B,KAAA,EAAO;EACxD,eAAe,OAAA,CAAW,GAAA,EAAa,IAAA,EAAgC;IACrE,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,GAAA,EAAK,IAAA,CAAK;IAExC,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI;MACX,IAAI,OAAA,GAAU,GAAG,IAAA,EAAM,MAAA,IAAU,KAAA,IAAS,GAAA,YAAe,GAAA,CAAI,MAAA,EAAA;MAC7D,IAAI;QACF,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,CAAA,CAAM;QAC7B,IAAI,IAAA,EAAM,OAAA,EAAS,OAAA,GAAU,IAAA,CAAK,OAAA;QAClC,IAAI,IAAA,EAAM,MAAA,EACR,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAA,CAAQ,EAAE;UACtC,MAAA,EAAQ,GAAA,CAAI,MAAA;UACZ,MAAA,EAAQ,IAAA,CAAK;SACd,CAAC;eAEG,CAAA,EAAG;QACV,IAAI,CAAA,YAAa,KAAA,IAAS,QAAA,IAAY,CAAA,EAAG,MAAM,CAAA;;MAEjD,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAA,CAAQ,EAAE;QAAE,MAAA,EAAQ,GAAA,CAAI;MAAA,CAAQ,CAAC;;IAGjE,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,KAAA,CAAA;IAC/B,OAAO,GAAA,CAAI,IAAA,CAAA,CAAM;;EAGnB,OAAO;IACL,IAAA,CACE,GAAA,EACA,MAAA,EACc;MAId,OAAO,OAAA,CAAa,GAAG,GAAA,GAHT,MAAA,GACV,IAAI,IAAI,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,CAAA,CAAK,CAAC,CAAA,EAAG,CAAA,CAAA,KAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,QAAA,CAAA,CAAU,EAAA,GAC1F,EAAA,EAAA,CACiC;;IAEvC,OAAA,CAAW,GAAA,EAAa,EAAA,EAAiC;MACvD,OAAO,OAAA,CAAW,GAAG,GAAA,IAAO,EAAA,EAAA,CAAK;;IAEnC,MAAA,CAAU,GAAA,EAAa,IAAA,EAA2B;MAChD,OAAO,OAAA,CAAW,GAAA,EAAK;QACrB,MAAA,EAAQ,MAAA;QACR,OAAA,EAAS;UAAE,cAAA,EAAgB;QAAA,CAAoB;QAC/C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA;OACtB,CAAC;;IAEJ,MAAA,CAAU,GAAA,EAAa,EAAA,EAAqB,IAAA,EAA2B;MACrE,OAAO,OAAA,CAAW,GAAG,GAAA,IAAO,EAAA,EAAA,EAAM;QAChC,MAAA,EAAQ,KAAA;QACR,OAAA,EAAS;UAAE,cAAA,EAAgB;QAAA,CAAoB;QAC/C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA;OACtB,CAAC;;IAEJ,MAAA,CAAO,GAAA,EAAa,EAAA,EAAoC;MACtD,OAAO,OAAA,CAAc,GAAG,GAAA,IAAO,EAAA,EAAA,EAAM;QAAE,MAAA,EAAQ;MAAA,CAAU,CAAC;;GAE7D;;AAKH,SAAS,eAAA,CACP,MAAA,EACA,cAAA,EACuC;EACvC,IAAI,cAAA,EAAgB,OAAO,cAAA;EAE3B,IACE,MAAA,IACA,OAAO,MAAA,KAAW,QAAA,IAClB,gBAAA,IAAoB,MAAA,IACpB,OAAQ,MAAA,CAAmC,cAAA,KAAmB,UAAA,EAE9D,OAAO,SAAA,CACL,MAAA,CACD;;AAQL,SAAS,gBAAA,CACP,IAAA,EACoB;EACpB,IAAI,IAAA,KAAS,KAAA,CAAA,EAAW,OAAO,KAAA,CAAA;EAC/B,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA,CAAA,CAAM;EAC7C,OAAO,IAAA;;;;;;;;;;;;;;;;;;;;;AAwBT,SAAgB,aAAA,CACd,MAAA,EACkB;EAClB,MAAM;IAAE,IAAA;IAAM,MAAA;IAAQ,GAAA;IAAK,OAAA,EAAS;EAAA,CAAA,GAAkB,MAAA;EACtD,MAAM,IAAA,GAAO,aAAA,CAAc,aAAA,CAAc;EAGzC,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO;EACpC,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,MAAA,CAAO;EACtD,MAAM,aAAA,GAAgB,MAAA,CAAO,aAAA,GACzB;IAAE,GAAG,iBAAA;IAAmB,GAAG,MAAA,CAAO;GAAe,GACjD,iBAAA;EAEJ,MAAM,QAAA,GAAW,eAAA,CAAyB,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS;EAElE,MAAM,YAAA,GAAe,CAAC,IAAA,CAAK;EAC3B,MAAM,QAAA,GAAY,MAAA,IAChB,MAAA,KAAW,KAAA,CAAA,GAAY,CAAC,IAAA,EAAM,MAAA,CAAO,GAAG,CAAC,IAAA,CAAK;EAwBhD,OAAO;IACL,IAAA;IACA,GAAA;IACA,MAAA;IACA,MAAA;IACA,QAAA;IAIA,QAAA,EA7BmB,WAAA,CAAmC,IAAA,EAAA,MAAY;MAClE,MAAM,KAAA,GAAQ,MAAA,CAAkB,EAAE,CAAC;MACnC,MAAM,QAAA,GAAW,MAAA,CAAuB,IAAA,CAAK;MAC7C,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM;MAE7B,MAAM,MAAA,GAAU,EAAA,IAAwB;QACtC,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAA,CAAM,CAAC,IAAA,CAAM,IAAA,IAAS;UAExC,OADe,IAAA,CACD,EAAA,KAAO,EAAA;UACrB;QACF,QAAA,CAAS,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK;;MAG7B,MAAM,KAAA,GAAA,CAAA,KAAc;QAClB,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK;;MAGpB,OAAO;QAAE,KAAA;QAAO,QAAA;QAAU,OAAA;QAAS,MAAA;QAAQ;OAAO;MAClD;IAeA,OAAA,CAAQ,OAAA,EAAuB;MAC7B,OAAOA,QAAAA,CAAAA,MAAgB;QACrB,MAAM,SAAA,GAAY,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK;QACjD,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,EAAA;QAEtC,MAAM,MAAA,GAAoD;UACxD,IAAI,OAAA,EAAS,MAAA,IAAU,CAAA,CAAE;QAAA,CAC1B;QAED,IAAI,SAAA,KAAc,KAAA,CAAA,EAAW;UAC3B,MAAA,CAAO,IAAA,GAAO,SAAA;UACd,MAAA,CAAO,QAAA,GAAW,QAAA;;QAKpB,OAAO;UACL,QAAA,EAH+B,CAAC,GAAG,YAAA,EAAc,MAAA,EAAQ,MAAA,CAAO;UAIhE,OAAA,EAAA,CAAA,KACE,IAAA,CAAK,IAAA,CACH,GAAA,EACA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,CAAC,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA,CAC3C;UACH,SAAA,EAAW,OAAA,EAAS,SAAA;UACpB,OAAA,EAAS,OAAA,EAAS;SACnB;QACD;;IAGJ,OAAA,CAAQ,EAAA,EAAqB;MAC3B,OAAOA,QAAAA,CAAAA,OAAiB;QACtB,QAAA,EAAU,CAAC,IAAA,EAAM,EAAA,CAAG;QACpB,OAAA,EAAA,CAAA,KAAe,IAAA,CAAK,OAAA,CAAiB,GAAA,EAAK,EAAA,CAAG;QAC7C,OAAA,EAAS,EAAA,KAAO,KAAA,CAAA,IAAa,EAAA,KAAO;OACrC,CAAA,CAAE;;IAGL,SAAA,CAAU,UAAA,EAAY,OAAA,EAAuB;MAC3C,OAAOA,QAAAA,CAAAA,OAAiB;QACtB,QAAA,EAAU,CAAC,GAAG,YAAA,EAAc,QAAA,EAAU,UAAA,CAAA,CAAY,CAAC;QACnD,OAAA,EAAA,CAAA,KACE,IAAA,CAAK,IAAA,CAAc,GAAA,EAAK;UAAE,GAAG,OAAA,EAAS,MAAA;UAAQ,CAAA,EAAG,UAAA,CAAA;SAAc,CAAC;QAClE,OAAA,EAAS,UAAA,CAAA,CAAY,CAAC,MAAA,GAAS,CAAA;QAC/B,SAAA,EAAW,OAAA,EAAS;OACrB,CAAA,CAAE;;IAKL,SAAA,CAAA,EAAY;MACV,MAAM,MAAA,GAAS,cAAA,CAAA,CAAgB;MAC/B,OAAOC,WAAAA,CAAa;QAClB,UAAA,EAAa,IAAA,IAA2B,IAAA,CAAK,MAAA,CAAgB,GAAA,EAAK,IAAA,CAAK;QACvE,SAAA,EAAA,CAAA,KAAiB;UACf,MAAA,CAAO,iBAAA,CAAkB;YACvB,QAAA,EAAU;UAAA,CACX,CAAC;;OAEL,CAAC;;IAGJ,SAAA,CAAA,EAAY;MAEV,MAAM,MAAA,GAAS,cAAA,CAAA,CAAgB;MAC/B,OAAOA,WAAAA,CACL;QACE,UAAA,EAAA,CAAa;UAAE,EAAA;UAAI;QAAA,CAAA,KACjB,IAAA,CAAK,MAAA,CAAgB,GAAA,EAAK,EAAA,EAAI,IAAA,CAAK;QACrC,QAAA,EAAU,MAAO,SAAA,IAAc;UAC7B,MAAM,MAAA,CAAO,aAAA,CAAc;YAAE,QAAA,EAAU,CAAC,IAAA,EAAM,SAAA,CAAU,EAAA;UAAG,CAAE,CAAC;UAC9D,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,CAAC,IAAA,EAAM,SAAA,CAAU,EAAA,CAAG,CAAC;UAC1D,MAAA,CAAO,YAAA,CAAa,CAAC,IAAA,EAAM,SAAA,CAAU,EAAA,CAAG,EAAG,GAAA,IAAiB;YAC1D,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EACxB,OAAO;cAAE,GAAG,GAAA;cAAK,GAAG,SAAA,CAAU;aAAM;YAEtC,OAAO,SAAA,CAAU,IAAA;YACjB;UACF,OAAO;YAAE;UAAA,CAAU;;QAErB,OAAA,EAAA,CAAU,IAAA,EAAM,SAAA,EAAW,OAAA,KAAY;UACrC,IAAI,OAAA,EAAS,QAAA,EACX,MAAA,CAAO,YAAA,CAAa,CAAC,IAAA,EAAM,SAAA,CAAU,EAAA,CAAG,EAAE,OAAA,CAAQ,QAAA,CAAS;;QAG/D,SAAA,EAAA,CAAY,KAAA,EAAO,SAAA,KAAc;UAC/B,MAAA,CAAO,iBAAA,CAAkB;YACvB,QAAA,EAAU;UAAA,CACX,CAAC;UACF,MAAA,CAAO,iBAAA,CAAkB;YAAE,QAAA,EAAU,CAAC,IAAA,EAAM,SAAA,CAAU,EAAA;UAAG,CAAE,CAAC;;OAE/D,CACF;;IAGH,SAAA,CAAA,EAAY;MACV,MAAM,MAAA,GAAS,cAAA,CAAA,CAAgB;MAC/B,OAAOA,WAAAA,CAAa;QAClB,UAAA,EAAa,EAAA,IAAwB,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,EAAA,CAAG;QACzD,SAAA,EAAA,CAAA,KAAiB;UACf,MAAA,CAAO,iBAAA,CAAkB;YACvB,QAAA,EAAU;UAAA,CACX,CAAC;;OAEL,CAAC;;IAKJ,OAAA,CAAQ,OAAA,EAAuC;MAC7C,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,IAAQ,QAAA;MAM9B,MAAM,IAAA,GAAOC,OAAAA,CAAkB;QAC7B,aAAA,EANoB;UACpB,GAAG,aAAA;UACH,IAAI,OAAA,EAAS,aAAA,IAAiB,CAAA,CAAE;SACjC;QAIC,MAAA,EAAQ,QAAA;QACR,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,MAAA;QACnC,QAAA,EAAU,MAAO,MAAA,IAAW;UAC1B,IAAI;YACF,IAAI,MAAA;YACJ,IAAI,IAAA,KAAS,MAAA,IAAU,OAAA,EAAS,EAAA,KAAO,KAAA,CAAA,EACrC,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAgB,GAAA,EAAK,OAAA,CAAQ,EAAA,EAAI,MAAA,CAAO,CAAA,KAE5D,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAgB,GAAA,EAAK,MAAA,CAAO;YAElD,OAAA,EAAS,SAAA,GAAY,MAAA,CAAO;mBACrB,GAAA,EAAK;YACZ,OAAA,EAAS,OAAA,GAAU,GAAA,CAAI;YACvB,MAAM,GAAA;;;OAGX,CAAC;MAGF,IAAI,IAAA,KAAS,MAAA,IAAU,OAAA,EAAS,EAAA,KAAO,KAAA,CAAA,EAAW;QAChD,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK;QAC3B,IAAA,CAAK,OAAA,CAAiB,GAAA,EAAK,OAAA,CAAQ,EAAA,CAAG,CAAC,IAAA,CACpC,IAAA,IAAS;UACR,KAAA,CAAA,MAAY;YACV,KAAK,MAAM,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EACjC,IAAA,CAAK,aAAA,CACH,GAAA,EACC,IAAA,CACC,GAAA,CAAA,CAEH;YAEH,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM;YAC5B;iBAEE;UACJ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM;UAE/B;;MAGH,OAAO,IAAA;;IAKT,QAAA,CACE,IAAA,EACA,OAAA,EACA;MACA,MAAM,aAAA,GAAgB,OAAA,EAAS,OAAA,GAC3B,MAAA,CAAO,MAAA,CAAQ,CAAA,IACb,OAAA,CAAQ,OAAA,CAAS,QAAA,CAAS,CAAA,CAAE,IAAA,CAA+B,CAC5D,GACD,MAAA;MAEJ,MAAM,OAAA,GAAyC,aAAA,CAAc,GAAA,CAC1D,KAAA,KAAW;QACV,WAAA,EAAa,KAAA,CAAM,IAAA;QACnB,MAAA,EAAQ,KAAA,CAAM,KAAA;QACd,IAAI,OAAA,EAAS,eAAA,GACX,KAAA,CAAM,IAAA,CAAA,IACH,CAAA,CAAE;OACR,CAAA,CACF;MAED,MAAM,OAAA,GAAU,MAAA,CAAqB,EAAE,CAAC;MACxC,MAAM,YAAA,GAAe,MAAA,CAAO,EAAA,CAAG;MA+B/B,OAAO;QACL,KAAA,EA9BYC,QAAAA,CAAAA,OAAiB;UAC7B,IAAA,EAAM,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAA,CAAM,GAAG,IAAA;UAC5C,OAAA;UACA,KAAA,EAAO;YACL,OAAA,EAAS,OAAA,CAAA,CAAS;YAClB,YAAA,EAAc,YAAA,CAAA;WACf;UACD,eAAA,EAAkB,OAAA,IAAqB;YACrC,OAAA,CAAQ,GAAA,CACN,OAAO,OAAA,KAAY,UAAA,GACd,OAAA,CAAiD,OAAA,CAAA,CAAS,CAAC,GAC3D,OAAA,CACN;;UAEH,oBAAA,EAAuB,OAAA,IAAqB;YAC1C,YAAA,CAAa,GAAA,CACX,OAAO,OAAA,KAAY,UAAA,GACd,OAAA,CAAqC,YAAA,CAAA,CAAc,CAAC,GACpD,OAAA,CACN;;UAEH,eAAA,EAAiB,eAAA,CAAA,CAAiB;UAClC,iBAAA,EAAmB,iBAAA,CAAA,CAAmB;UACtC,mBAAA,EAAqB,mBAAA,CAAA,CAAqB;UAC1C,IAAI,OAAA,EAAS,QAAA,GACT;YAAE,qBAAA,EAAuB,qBAAA,CAAA;UAAuB,CAAE,GAClD,CAAA,CAAE;SACP,CAAA,CAAE;QAID,OAAA;QACA,YAAA;QACA,OAAA,EAAS;OACV;;GAEJ"}