cross-state 0.46.0 → 0.47.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/dist/cjs/react/index.cjs +119 -123
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/es/react/index.mjs +120 -124
- package/dist/es/react/index.mjs.map +1 -1
- package/dist/types/react/form/form.d.ts +3 -1
- package/package.json +1 -1
package/dist/cjs/react/index.cjs
CHANGED
|
@@ -81,7 +81,7 @@ function FormField({
|
|
|
81
81
|
...restProps
|
|
82
82
|
}) {
|
|
83
83
|
const form = this.useForm();
|
|
84
|
-
const getFormState = () => ({ ...form, ...form
|
|
84
|
+
const getFormState = () => ({ ...form, ...getDerivedState(form) });
|
|
85
85
|
const [localValue, setLocalValue] = require$$0.useState();
|
|
86
86
|
const value = this.useFormState((form2) => {
|
|
87
87
|
const value2 = form2.getField(name).value;
|
|
@@ -266,8 +266,8 @@ function FormContainer({
|
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
268
|
require$$0.useEffect(() => {
|
|
269
|
-
return formInstance.
|
|
270
|
-
}, [
|
|
269
|
+
return formInstance.formState.map(() => formInstance.getErrors()).subscribe((errors) => updateValidity(errors));
|
|
270
|
+
}, []);
|
|
271
271
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
272
272
|
"form",
|
|
273
273
|
{
|
|
@@ -278,40 +278,53 @@ function FormContainer({
|
|
|
278
278
|
formProps.className,
|
|
279
279
|
hasTriggeredValidations ? formInstance.options.validatedClass ?? "validated" : undefined
|
|
280
280
|
].filter(Boolean).join(" "),
|
|
281
|
-
onSubmit: (event) => {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
281
|
+
onSubmit: async (event) => {
|
|
282
|
+
if (formInstance.saveInProgress()) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
formInstance.formState.set("saveInProgress", true);
|
|
287
|
+
event.preventDefault();
|
|
288
|
+
const formElement = event.currentTarget;
|
|
289
|
+
const buttonElement = event.nativeEvent instanceof SubmitEvent && event.nativeEvent.submitter instanceof HTMLButtonElement ? event.nativeEvent.submitter : void 0;
|
|
290
|
+
updateValidity(formInstance.getErrors(), buttonElement);
|
|
291
|
+
formElement.reportValidity();
|
|
292
|
+
const isValid = formInstance.validate();
|
|
293
|
+
if (isValid) {
|
|
294
|
+
await formProps.onSubmit?.(event, {
|
|
295
|
+
...formInstance,
|
|
296
|
+
...getDerivedState(formInstance)
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
} finally {
|
|
300
|
+
formInstance.formState.set("saveInProgress", false);
|
|
293
301
|
}
|
|
294
302
|
}
|
|
295
303
|
}
|
|
296
304
|
);
|
|
297
305
|
}
|
|
298
|
-
function getField(
|
|
299
|
-
|
|
306
|
+
function getField(form, path) {
|
|
307
|
+
const field = {
|
|
300
308
|
get originalValue() {
|
|
301
|
-
return original !== undefined ? propAccess.get(original, path) : undefined;
|
|
309
|
+
return form.original !== undefined ? propAccess.get(form.original, path) : undefined;
|
|
302
310
|
},
|
|
303
311
|
get value() {
|
|
304
|
-
const
|
|
305
|
-
return propAccess.get(draft, path);
|
|
312
|
+
const draft = form.getDraft();
|
|
313
|
+
return propAccess.get(draft ?? form.original ?? form.options.defaultValue, path);
|
|
306
314
|
},
|
|
307
315
|
setValue(update) {
|
|
308
|
-
|
|
316
|
+
form.formState.set("draft", (draft = form.original ?? form.options.defaultValue) => {
|
|
317
|
+
if (update instanceof Function) {
|
|
318
|
+
update = update(propAccess.get(draft, path));
|
|
319
|
+
}
|
|
320
|
+
return propAccess.set(draft, path, update);
|
|
321
|
+
});
|
|
309
322
|
},
|
|
310
323
|
get hasChange() {
|
|
311
324
|
return !propAccess.deepEqual(this.originalValue, this.value);
|
|
312
325
|
},
|
|
313
326
|
get errors() {
|
|
314
|
-
const
|
|
327
|
+
const errors = form.getErrors();
|
|
315
328
|
return errors.get(path) ?? [];
|
|
316
329
|
},
|
|
317
330
|
get names() {
|
|
@@ -326,31 +339,38 @@ function getField(derivedState, original, path) {
|
|
|
326
339
|
},
|
|
327
340
|
add(...args) {
|
|
328
341
|
this.setValue((value) => {
|
|
329
|
-
if (
|
|
342
|
+
if (!value) {
|
|
343
|
+
throw new Error(`Cannot add element to ${JSON.stringify(value)}`);
|
|
344
|
+
}
|
|
345
|
+
if (Array.isArray(value)) {
|
|
330
346
|
return [...value ?? [], args[0]];
|
|
331
347
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
348
|
+
if (propAccess.isObject(value)) {
|
|
349
|
+
return {
|
|
350
|
+
...value,
|
|
351
|
+
[args[0]]: args[1]
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
throw new Error(`Cannot add element to ${JSON.stringify(value)}`);
|
|
336
355
|
});
|
|
337
356
|
},
|
|
338
357
|
remove(key) {
|
|
339
358
|
this.setValue((value) => {
|
|
340
359
|
if (!value) {
|
|
341
|
-
|
|
360
|
+
throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);
|
|
342
361
|
}
|
|
343
362
|
if (Array.isArray(value)) {
|
|
344
|
-
return value.filter((_, index) => index !== key);
|
|
363
|
+
return value.filter((_, index) => index !== Number(key));
|
|
345
364
|
}
|
|
346
365
|
if (propAccess.isObject(value)) {
|
|
347
366
|
const { [key]: _, ...rest } = value;
|
|
348
367
|
return rest;
|
|
349
368
|
}
|
|
350
|
-
|
|
369
|
+
throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);
|
|
351
370
|
});
|
|
352
371
|
}
|
|
353
372
|
};
|
|
373
|
+
return field;
|
|
354
374
|
}
|
|
355
375
|
function getErrors(draft, original, validations) {
|
|
356
376
|
const errors = /* @__PURE__ */ new Map();
|
|
@@ -378,6 +398,17 @@ function getErrors(draft, original, validations) {
|
|
|
378
398
|
}
|
|
379
399
|
return errors;
|
|
380
400
|
}
|
|
401
|
+
function getDerivedState(instance) {
|
|
402
|
+
return {
|
|
403
|
+
draft: instance.getDraft(),
|
|
404
|
+
hasTriggeredValidations: instance.hasTriggeredValidations(),
|
|
405
|
+
saveScheduled: instance.saveScheduled(),
|
|
406
|
+
saveInProgress: instance.saveInProgress(),
|
|
407
|
+
hasChanges: instance.hasChanges(),
|
|
408
|
+
errors: instance.getErrors(),
|
|
409
|
+
isValid: instance.isValid()
|
|
410
|
+
};
|
|
411
|
+
}
|
|
381
412
|
class Form {
|
|
382
413
|
constructor(options) {
|
|
383
414
|
this.options = options;
|
|
@@ -394,12 +425,11 @@ class Form {
|
|
|
394
425
|
useFormState(selector, useStoreOptions) {
|
|
395
426
|
const form = this.useForm();
|
|
396
427
|
return storeMethods.useStore(
|
|
397
|
-
form.
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
),
|
|
428
|
+
form.formState,
|
|
429
|
+
() => selector({
|
|
430
|
+
...form,
|
|
431
|
+
...getDerivedState(form)
|
|
432
|
+
}),
|
|
403
433
|
useStoreOptions
|
|
404
434
|
);
|
|
405
435
|
}
|
|
@@ -438,79 +468,61 @@ class Form {
|
|
|
438
468
|
saveInProgress: false
|
|
439
469
|
});
|
|
440
470
|
}, []);
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
hasChanges: !propAccess.deepEqual(draft, original ?? options.defaultValue),
|
|
457
|
-
errors,
|
|
458
|
-
isValid: errors.size === 0
|
|
459
|
-
};
|
|
460
|
-
},
|
|
461
|
-
(newState) => ({
|
|
462
|
-
draft: newState.draft,
|
|
463
|
-
hasTriggeredValidations: newState.hasTriggeredValidations,
|
|
464
|
-
saveScheduled: newState.saveScheduled,
|
|
465
|
-
saveInProgress: newState.saveInProgress
|
|
466
|
-
})
|
|
467
|
-
);
|
|
468
|
-
}, [formState, original, options.validations, options.defaultValue]);
|
|
469
|
-
const context = require$$0.useMemo(() => {
|
|
470
|
-
return {
|
|
471
|
-
formState,
|
|
472
|
-
derivedState,
|
|
473
|
-
options,
|
|
474
|
-
original,
|
|
475
|
-
getField(path) {
|
|
476
|
-
return getField(derivedState, original, path);
|
|
477
|
-
},
|
|
478
|
-
getDraft() {
|
|
479
|
-
return formState.get().draft ?? original ?? options.defaultValue;
|
|
480
|
-
},
|
|
481
|
-
hasTriggeredValidations() {
|
|
482
|
-
return formState.get().hasTriggeredValidations;
|
|
483
|
-
},
|
|
484
|
-
hasChanges() {
|
|
485
|
-
return derivedState.get().hasChanges;
|
|
486
|
-
},
|
|
487
|
-
getErrors() {
|
|
488
|
-
return derivedState.get().errors;
|
|
489
|
-
},
|
|
490
|
-
isValid() {
|
|
491
|
-
return derivedState.get().isValid;
|
|
492
|
-
},
|
|
493
|
-
validate() {
|
|
494
|
-
formState.set("hasTriggeredValidations", true);
|
|
495
|
-
return derivedState.get().isValid;
|
|
496
|
-
},
|
|
497
|
-
reset() {
|
|
498
|
-
formState.set("draft", undefined);
|
|
499
|
-
formState.set("hasTriggeredValidations", false);
|
|
500
|
-
}
|
|
501
|
-
};
|
|
502
|
-
}, [
|
|
471
|
+
let lastDraft;
|
|
472
|
+
const cache = /* @__PURE__ */ new Map();
|
|
473
|
+
function lazy(key, fn) {
|
|
474
|
+
if (lastDraft !== formState.get().draft) {
|
|
475
|
+
cache.clear();
|
|
476
|
+
lastDraft = formState.get().draft;
|
|
477
|
+
}
|
|
478
|
+
let value = cache.get(key);
|
|
479
|
+
if (!cache.has(key)) {
|
|
480
|
+
value = fn();
|
|
481
|
+
cache.set(key, value);
|
|
482
|
+
}
|
|
483
|
+
return value;
|
|
484
|
+
}
|
|
485
|
+
const context = {
|
|
503
486
|
formState,
|
|
504
|
-
|
|
487
|
+
options,
|
|
505
488
|
original,
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
489
|
+
getField() {
|
|
490
|
+
throw new Error("Not implemented");
|
|
491
|
+
},
|
|
492
|
+
getDraft() {
|
|
493
|
+
return formState.get().draft ?? original ?? options.defaultValue;
|
|
494
|
+
},
|
|
495
|
+
hasTriggeredValidations() {
|
|
496
|
+
return formState.get().hasTriggeredValidations;
|
|
497
|
+
},
|
|
498
|
+
saveScheduled() {
|
|
499
|
+
return formState.get().saveScheduled;
|
|
500
|
+
},
|
|
501
|
+
saveInProgress() {
|
|
502
|
+
return formState.get().saveInProgress;
|
|
503
|
+
},
|
|
504
|
+
hasChanges() {
|
|
505
|
+
return lazy(
|
|
506
|
+
"hasChanges",
|
|
507
|
+
() => !propAccess.deepEqual(this.getDraft(), original ?? options.defaultValue)
|
|
508
|
+
);
|
|
509
|
+
},
|
|
510
|
+
getErrors() {
|
|
511
|
+
return lazy("getErrors", () => getErrors(this.getDraft(), original, options.validations));
|
|
512
|
+
},
|
|
513
|
+
isValid() {
|
|
514
|
+
return lazy("isValid", () => this.getErrors().size === 0);
|
|
515
|
+
},
|
|
516
|
+
validate() {
|
|
517
|
+
formState.set("hasTriggeredValidations", true);
|
|
518
|
+
return this.isValid();
|
|
519
|
+
},
|
|
520
|
+
reset() {
|
|
521
|
+
formState.set("draft", undefined);
|
|
522
|
+
formState.set("hasTriggeredValidations", false);
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
context.getField = (path) => lazy(path, () => getField(context, path));
|
|
514
526
|
require$$0.useEffect(() => {
|
|
515
527
|
if (urlState) {
|
|
516
528
|
return urlStore.connectUrl(
|
|
@@ -520,22 +532,6 @@ class Form {
|
|
|
520
532
|
}
|
|
521
533
|
return undefined;
|
|
522
534
|
}, [formState, hash.simpleHash(urlState)]);
|
|
523
|
-
require$$0.useEffect(() => {
|
|
524
|
-
const handles = options.transform?.map(({ trigger, update }) => {
|
|
525
|
-
const draft = derivedState.map("draft");
|
|
526
|
-
const triggerStore = trigger ? draft.map(trigger) : draft;
|
|
527
|
-
return triggerStore.subscribe(() => {
|
|
528
|
-
const value = trigger ? propAccess.get(draft.get(), trigger) : draft.get();
|
|
529
|
-
const result = update(value, draft);
|
|
530
|
-
if (result !== undefined) {
|
|
531
|
-
draft.set(result);
|
|
532
|
-
}
|
|
533
|
-
});
|
|
534
|
-
});
|
|
535
|
-
return () => {
|
|
536
|
-
handles?.forEach((handle) => handle());
|
|
537
|
-
};
|
|
538
|
-
}, [options.transform]);
|
|
539
535
|
useFormAutosave(context);
|
|
540
536
|
return /* @__PURE__ */ jsxRuntime.jsx(this.context.Provider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsx(FormContainer, { ...formProps, form: this }) });
|
|
541
537
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/react/form/customInput.tsx","../../../src/lib/wildcardMatch.ts","../../../src/react/form/formField.tsx","../../../src/react/form/formForEach.tsx","../../../src/react/form/useFormAutosave.ts","../../../src/react/form/form.tsx","../../../src/react/useDecoupledState.ts","../../../src/lib/castArray.ts","../../../src/react/useUrlParamScope.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CustomInputProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n children?: ReactNode;\n}\n\nexport function CustomInput({ name, children, ...props }: CustomInputProps): JSX.Element {\n return (\n <div\n {...props}\n style={{\n position: 'relative',\n ...props.style,\n }}\n >\n {children}\n\n <input\n name={name}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n opacity: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n />\n </div>\n );\n}\n","import { isObject } from '@lib/helpers';\nimport { type KeyType } from './path';\nimport { castArrayPath } from './propAccess';\n\nexport function wildcardMatch(s: KeyType[] | string, w: KeyType[] | string): boolean {\n if (typeof s === 'string') {\n s = castArrayPath(s);\n }\n\n if (typeof w === 'string') {\n w = castArrayPath(w);\n }\n\n return s.length === w.length && s.every((s, i) => w[i] === '*' || s === w[i]);\n}\n\nexport function getWildCardMatches(\n object: any,\n path: [KeyType, ...KeyType[]] | string,\n): Record<KeyType, any> {\n const matches: Record<KeyType, any> = {};\n const [first, second, ...rest] = castArrayPath(path);\n\n if (first === undefined) {\n throw new Error('Path is empty');\n }\n\n if (!Array.isArray(object) && !isObject(object)) {\n object = {};\n }\n\n for (const [key, value] of first !== '*' ? [[first, object[first]]] : Object.entries(object)) {\n if (first !== '*' && first !== key) {\n continue;\n }\n\n if (second === undefined) {\n matches[key] = value;\n continue;\n }\n\n for (const [subKey, subValue] of Object.entries(getWildCardMatches(value, [second, ...rest]))) {\n matches[`${key}.${subKey}`] = subValue;\n }\n }\n\n return matches;\n}\n","import { type PathAsString, type Value } from '@lib/path';\nimport {\n createElement,\n useEffect,\n useState,\n type Component,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { type Field, type Form, type FormInstance } from './form';\n\nexport interface FormFieldComponentProps<TValue, TPath> {\n name: TPath;\n value: TValue;\n onChange: (event: { target: { value: TValue } } | TValue | undefined, ...args: any[]) => void;\n onBlur: (...args: any[]) => void;\n}\n\nexport type FormFieldInfos<TDraft, TOriginal, TPath extends string> = Field<\n TDraft,\n TOriginal,\n TPath\n> & {\n hasTriggeredValidations: boolean;\n};\n\ntype NativeInputType = 'input' | 'select' | 'textarea';\n\ntype PartialComponentType<P> =\n | (new (props: P, context?: any) => Component<P, any>)\n | ((props: P, context?: any) => ReactNode);\n\nexport type FormFieldComponent = NativeInputType | PartialComponentType<any>;\n\ntype FieldValue<T extends FormFieldComponent> = ComponentPropsWithoutRef<T>['value'];\n\ntype FieldChangeValue<T extends FormFieldComponent> =\n ComponentPropsWithoutRef<T> extends {\n onChange?: (update: infer U) => void;\n }\n ? U extends { target: { value: infer V } }\n ? V\n : U\n : never;\n\ntype MakeOptional<T, Keys extends string> = Omit<T, Keys> & Partial<Pick<T, Keys & keyof T>>;\n\nexport type FormFieldProps<TPath, TDraft> = {\n name: TPath & PathAsString<TDraft>;\n commitOnBlur?: boolean;\n commitDebounce?: number;\n};\n\nexport type FormFieldPropsWithRender<TDraft, TOriginal, TPath extends string> = FormFieldProps<\n TPath,\n TDraft\n> &\n NoInfer<{\n component?: undefined;\n render: (\n props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n info: FormFieldInfos<TDraft, TOriginal, TPath>,\n ) => ReactNode;\n inputFilter?: undefined;\n defaultValue?: undefined;\n serialize?: undefined;\n deserialize?: undefined;\n onChange?: undefined;\n onBlur?: undefined;\n }>;\n\ntype Serialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: Value<TDraft, TPath>,\n formState: FormInstance<TDraft, TOriginal>,\n) => FieldValue<TComponent>;\n\ntype Deserialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: FieldChangeValue<TComponent>,\n formState: FormInstance<TDraft, TOriginal>,\n) => Value<TDraft, TPath>;\n\nexport type FormFieldPropsWithComponent<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n> = FormFieldProps<TPath, TDraft> & {\n component?: TComponent;\n render?: undefined;\n} & NoInfer<\n {\n inputFilter?: (value: FieldChangeValue<TComponent>) => boolean;\n } & MakeOptional<\n Omit<ComponentPropsWithoutRef<TComponent>, 'id' | 'name' | 'value' | 'defaultValue'>,\n 'onChange' | 'onBlur'\n > &\n (Value<TDraft, TPath> extends Exclude<FieldValue<TComponent>, undefined>\n ? {\n defaultValue?: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : Value<TDraft, TPath> extends FieldValue<TComponent>\n ?\n | {\n defaultValue: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n | {\n defaultValue?: FieldValue<TComponent>;\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }) &\n (FieldChangeValue<TComponent> extends Value<TDraft, TPath>\n ? {\n deserialize?: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n deserialize: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n })\n >;\n\nexport function FormField<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n>(\n this: Form<TDraft, any>,\n {\n // id,\n name = '' as any,\n component,\n commitOnBlur,\n commitDebounce,\n render,\n inputFilter,\n defaultValue,\n serialize,\n deserialize = (x) => x as Value<TDraft, TPath>,\n onChange,\n onBlur,\n ...restProps\n }:\n | FormFieldPropsWithRender<TDraft, TOriginal, TPath>\n | FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n): JSX.Element | null {\n type T = FieldChangeValue<TComponent>;\n\n const form = this.useForm();\n const getFormState = () => ({ ...form, ...form.derivedState.get() });\n const [localValue, setLocalValue] = useState<T>();\n\n const value = this.useFormState((form) => {\n const value = form.getField(name as any).value;\n if (serialize) {\n return serialize(value as any, getFormState());\n }\n if (value !== undefined) {\n return value;\n }\n return defaultValue;\n });\n\n const setValue = (x: FieldChangeValue<TComponent>) =>\n form.getField(name as any).setValue(deserialize(x, getFormState()));\n\n const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n useEffect(() => {\n if (localValue === undefined || !commitDebounce) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setValue(localValue);\n setLocalValue(undefined);\n }, commitDebounce);\n\n return () => clearTimeout(timeout);\n }, [localValue, commitDebounce]);\n\n const props = {\n name,\n value: localValue ?? value,\n onChange: (event: { target: { value: T } } | T, ...moreArgs: any[]) => {\n const value =\n typeof event === 'object' && event !== null && 'target' in event\n ? event.target.value\n : event;\n\n if (inputFilter && !inputFilter(value)) {\n return;\n }\n\n if (commitOnBlur || commitDebounce) {\n setLocalValue(value);\n } else {\n setValue(value);\n }\n\n onChange?.(event, ...moreArgs);\n },\n onBlur(...args: any[]) {\n if (localValue !== undefined) {\n setValue(localValue);\n setLocalValue(undefined);\n }\n\n onBlur?.(...args);\n },\n } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n if (render) {\n return (\n <>\n {render(props, { ...form.getField(name as any), hasTriggeredValidations } as any) ?? null}\n </>\n );\n }\n\n if (component) {\n return createElement(component, { ...restProps, ...props });\n }\n\n return null;\n}\n","import { type GetKeys, type Join, type PathAsString, type Value } from '@lib/path';\nimport { Fragment, useCallback, type ReactNode } from 'react';\nimport { type FieldHelperMethods, type Form } from './form';\n\nexport type ElementName<TDraft, TPath extends string> = keyof {\n [Path in TPath as Join<Path, GetKeys<NonNullable<Value<TDraft, Path>>> & (string | number)>]: 1;\n};\n\nexport interface FormForEachProps<TDraft, TPath extends string> {\n name: TPath & PathAsString<TDraft>;\n renderElement?: (props: {\n name: ElementName<TDraft, TPath>;\n key: `${GetKeys<NonNullable<Value<TDraft, TPath>>> & (string | number)}`;\n index: number;\n remove: () => void;\n }) => ReactNode;\n children?: (\n props: {\n setValue: (\n value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>),\n ) => void;\n } & FieldHelperMethods<TDraft, TPath>,\n ) => ReactNode;\n}\n\nexport function FormForEach<TDraft, TPath extends string>(\n this: Form<TDraft, any>,\n { name, renderElement, children }: FormForEachProps<TDraft, TPath>,\n): JSX.Element {\n const form = this.useForm();\n\n const names = this.useFormState(() => {\n const field = form.getField(name as any) as any;\n return field.names as any[];\n });\n\n const add = useCallback(\n (...args: any[]) => {\n const field = form.getField(name as any) as any;\n field.add(...args);\n },\n [form],\n );\n\n const remove = useCallback(\n (key: any) => {\n const field = form.getField(name as any) as any;\n field.remove(key);\n },\n [form],\n );\n\n const setValue = useCallback(\n (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => {\n const field = form.getField(name as any) as any;\n field.setValue(value);\n },\n [form],\n );\n\n return (\n <>\n {renderElement &&\n names.map((name, index) => {\n const key = name.split('.').pop();\n\n return (\n <Fragment key={key}>\n {renderElement({\n name,\n key,\n index,\n remove: () => remove(key),\n })}\n </Fragment>\n );\n })}\n\n {children?.({\n names,\n add,\n remove,\n setValue,\n } as any)}\n </>\n );\n}\n","import type { Duration } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { debounce } from '@lib/debounce';\nimport { deepEqual } from '@lib/equals';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { queue } from '@lib/queue';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { FormContext } from './form';\n\nexport interface FormAutosaveOptions<TDraft, TOriginal> {\n save: (draft: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;\n debounce?: Duration;\n resetAfterSave?: boolean;\n}\n\nexport function useFormAutosave<TDraft, TOriginal extends TDraft>(\n form: FormContext<TDraft, TOriginal>,\n): void {\n const { formState, options, getDraft } = form;\n const debounceTime = calcDuration(options.autoSave?.debounce ?? 2_000);\n const latestRef = useRef({ options });\n const lastValue = useRef<TDraft>();\n const q = useMemo(() => queue(), []);\n\n const run = useMemo(\n () =>\n debounce(async () => {\n const { options } = latestRef.current;\n const save = options.autoSave?.save;\n const draft = getDraft();\n\n lastValue.current = draft;\n\n q.clear();\n\n q(async () => {\n try {\n formState.set('saveInProgress', true);\n await save?.(draft, form);\n\n if (q.size === 0 && options.autoSave?.resetAfterSave) {\n form.reset();\n }\n } finally {\n formState.set('saveInProgress', false);\n\n if (q.size === 0) {\n formState.set('saveScheduled', false);\n }\n }\n });\n }, debounceTime),\n [formState, debounceTime],\n );\n\n useEffect(() => {\n if (!options.autoSave?.save) {\n return;\n }\n\n return formState\n .map((state) => state.draft)\n .subscribe(\n () => {\n if (deepEqual(getDraft(), lastValue.current)) {\n return;\n }\n\n run();\n formState.set('saveScheduled', true);\n },\n { runNow: false },\n );\n }, [formState]);\n\n useEffect(() => {\n latestRef.current = { options };\n });\n}\n","import { connectUrl, createStore, type Store, type Update, type UrlStoreOptions } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { deepEqual } from '@lib/equals';\nimport { simpleHash } from '@lib/hash';\nimport { isObject } from '@lib/helpers';\nimport {\n type Path,\n type PathAsString,\n type Value,\n type WildcardPathAsString,\n type WildcardValue,\n} from '@lib/path';\nimport { get, join } from '@lib/propAccess';\nimport type { Object_ } from '@lib/typeHelpers';\nimport { getWildCardMatches } from '@lib/wildcardMatch';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type Context,\n type FormEvent,\n type FunctionComponent,\n type HTMLProps,\n type ReactNode,\n} from 'react';\nimport { useStore, type UseStoreOptions } from '../useStore';\nimport {\n FormField,\n type FormFieldComponent,\n type FormFieldPropsWithComponent,\n type FormFieldPropsWithRender,\n} from './formField';\nimport { FormForEach, type ElementName, type FormForEachProps } from './formForEach';\nimport { useFormAutosave, type FormAutosaveOptions } from './useFormAutosave';\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Form types\n/// /////////////////////////////////////////////////////////////////////////////\n\nexport type Transform<TDraft> = Path<TDraft> | '' extends infer TPath\n ? TPath extends TPath\n ? {\n update: (value: Value<TDraft, TPath>, store: Store<TDraft>) => void | TDraft;\n } & (TPath extends '' ? { trigger?: '' } : { trigger: TPath })\n : never\n : never;\n\nexport interface FormOptions<TDraft, TOriginal> {\n defaultValue: TDraft;\n validations?: Validations<TDraft, TOriginal>;\n localizeError?: (error: string, field: string) => string | undefined;\n urlState?: boolean | UrlStoreOptions<TDraft>;\n autoSave?: FormAutosaveOptions<TDraft, TOriginal>;\n transform?: Transform<TDraft>[];\n validatedClass?: string;\n}\n\nexport type Validations<TDraft, TOriginal> = {\n [TPath in WildcardPathAsString<TDraft>]?: Record<string, Validation<TDraft, TOriginal, TPath>>;\n} & Record<string, Record<string, Validation<TDraft, TOriginal, any>>>;\n\nexport type Validation<TDraft, TOriginal, TPath> = (\n value: WildcardValue<TDraft, TPath>,\n context: {\n draft: TDraft;\n original: TOriginal;\n field: PathAsString<TDraft> | '';\n },\n) => boolean;\n\nexport type Field<TDraft, TOriginal, TPath extends string> = {\n originalValue: Value<TOriginal, TPath> | undefined;\n value: Value<TDraft, TPath>;\n setValue: (value: Update<Value<TDraft, TPath>>) => void;\n hasChange: boolean;\n errors: string[];\n} & (Value<TDraft, TPath> extends Object_ ? FieldHelperMethods<TDraft, TPath> : {});\n\nexport type FieldHelperMethods<TDraft, TPath extends string> = {\n names: ElementName<TDraft, TPath>[];\n add: NonNullable<Value<TDraft, TPath>> extends readonly (infer T)[]\n ? (element: T) => void\n : NonNullable<Value<TDraft, TPath>> extends Record<infer K, infer V>\n ? (key: K, value: V) => void\n : never;\n remove: Value<TDraft, TPath> extends readonly any[]\n ? (index: number) => void\n : (key: string) => void;\n};\n\nexport interface FormState<TDraft> {\n draft: TDraft | undefined;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n}\n\nexport interface FormDerivedState<TDraft> {\n draft: TDraft;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n hasChanges: boolean;\n errors: Map<string, string[]>;\n isValid: boolean;\n}\n\nexport interface FormContext<TDraft, TOriginal> {\n formState: Store<FormState<TDraft>>;\n derivedState: Store<FormDerivedState<TDraft>>;\n options: FormOptions<TDraft, TOriginal>;\n original: TOriginal | undefined;\n getField: <TPath extends string>(path: TPath) => Field<TDraft, TOriginal, TPath>;\n getDraft: () => TDraft;\n hasTriggeredValidations: () => boolean;\n hasChanges: () => boolean;\n getErrors: () => Map<string, string[]>;\n isValid: () => boolean;\n validate: () => boolean;\n reset: () => void;\n}\n\nexport interface FormInstance<TDraft, TOriginal>\n extends FormDerivedState<TDraft>,\n Pick<\n FormContext<TDraft, TOriginal>,\n 'options' | 'original' | 'getField' | 'validate' | 'reset'\n > {}\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Implementation\n/// /////////////////////////////////////////////////////////////////////////////\n\nfunction FormContainer({\n form,\n ...formProps\n}: {\n form: Form<any, any>;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<any, any>) => void;\n} & Omit<HTMLProps<HTMLFormElement>, 'form' | 'onSubmit'>) {\n const formInstance = form.useForm();\n const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n function updateValidity(errors: Map<string, string[]>, buttonElement?: HTMLButtonElement) {\n const formElement = formRef.current;\n if (!formElement) {\n return;\n }\n\n const localizedErrors = new Map(\n [...errors.entries()].map(\n ([field, errors]) =>\n [\n field,\n errors.map((error) => formInstance.options.localizeError?.(error, field) ?? error),\n ] as const,\n ),\n );\n\n for (const element of Array.from(formElement.elements)) {\n if ('name' in element && 'setCustomValidity' in element) {\n (element as HTMLObjectElement).setCustomValidity(\n localizedErrors.get((element as HTMLObjectElement).name)?.join('\\n') ?? '',\n );\n }\n }\n\n if (buttonElement && 'setCustomValidity' in buttonElement) {\n const errorString = [...errors.values()].flat().join('\\n');\n\n buttonElement.setCustomValidity(errorString);\n }\n }\n\n useEffect(() => {\n return formInstance.derivedState.map('errors').subscribe((errors) => updateValidity(errors));\n }, [formInstance.derivedState]);\n\n return (\n <form\n ref={formRef}\n noValidate\n {...formProps}\n className={[\n formProps.className,\n hasTriggeredValidations ? (formInstance.options.validatedClass ?? 'validated') : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onSubmit={(event) => {\n event.preventDefault();\n\n const formElement = event.currentTarget;\n const buttonElement =\n event.nativeEvent instanceof SubmitEvent &&\n event.nativeEvent.submitter instanceof HTMLButtonElement\n ? event.nativeEvent.submitter\n : undefined;\n\n updateValidity(formInstance.derivedState.get().errors, buttonElement);\n\n formElement.reportValidity();\n\n const isValid = formInstance.validate();\n if (isValid) {\n formProps.onSubmit?.(event, {\n ...formInstance,\n ...formInstance.derivedState.get(),\n });\n }\n }}\n />\n );\n}\n\nfunction getField<TDraft, TOriginal extends TDraft, TPath extends string>(\n derivedState: Store<FormDerivedState<TDraft>>,\n original: TOriginal | undefined,\n path: TPath,\n): Field<TDraft, TOriginal, TPath> {\n return {\n get originalValue() {\n return original !== undefined ? get(original as any, path as any) : undefined;\n },\n\n get value() {\n const { draft } = derivedState.get();\n return get(draft, path as any);\n },\n\n setValue(update: any) {\n derivedState.set(join('draft', path) as any, update);\n },\n\n get hasChange() {\n return !deepEqual(this.originalValue, this.value);\n },\n\n get errors() {\n const { errors } = derivedState.get();\n return errors.get(path) ?? [];\n },\n\n get names(): any {\n const { value } = this;\n\n if (Array.isArray(value)) {\n return value.map((_, index) => join(path, String(index)));\n }\n\n if (isObject(value)) {\n return Object.keys(value).map((key) => join(path, key));\n }\n\n return [];\n },\n\n add(...args: any[]) {\n this.setValue((value: any) => {\n if (args.length === 1) {\n return [...(value ?? []), args[0]];\n }\n\n return {\n ...value,\n [args[0]]: args[1],\n };\n });\n },\n\n remove(key: any) {\n this.setValue((value: any) => {\n if (!value) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.filter((_, index) => index !== key);\n }\n\n if (isObject(value)) {\n const { [key]: _, ...rest } = value;\n return rest;\n }\n\n return value;\n });\n },\n } as any;\n}\n\nfunction getErrors<TDraft, TOriginal>(\n draft: TDraft,\n original: TOriginal | undefined,\n validations: FormOptions<TDraft, TOriginal>['validations'],\n) {\n const errors = new Map<string, string[]>();\n\n for (const [path, block] of Object.entries(validations ?? {})) {\n for (const [validationName, validate] of Object.entries(\n block as Record<string, Validation<any, any, any>>,\n )) {\n let matched = false;\n\n for (const [field, value] of Object.entries(getWildCardMatches(draft, path))) {\n matched = true;\n if (!validate(value, { draft, original, field })) {\n const fieldErrors = errors.get(field) ?? [];\n fieldErrors.push(validationName);\n errors.set(field, fieldErrors);\n }\n }\n\n if (!matched && !path.includes('*')) {\n if (!validate(undefined, { draft, original, field: path })) {\n const fieldErrors = errors.get(path) ?? [];\n fieldErrors.push(validationName);\n errors.set(path, fieldErrors);\n }\n }\n }\n }\n\n return errors;\n}\n\nexport class Form<TDraft, TOriginal extends TDraft = TDraft> {\n context: Context<FormContext<TDraft, TOriginal> | null> = createContext<FormContext<\n TDraft,\n TOriginal\n > | null>(null);\n\n constructor(public readonly options: FormOptions<TDraft, TOriginal>) {\n autobind(Form);\n }\n\n useForm(): FormContext<TDraft, TOriginal> {\n const context = useContext(this.context);\n\n if (!context) {\n throw new Error('Form context not found');\n }\n\n return context;\n }\n\n useFormState<S>(\n selector: (state: FormInstance<TDraft, TOriginal>) => S,\n useStoreOptions?: UseStoreOptions<S>,\n ): S {\n const form = this.useForm();\n\n return useStore(\n form.derivedState.map((state) =>\n selector({\n ...form,\n ...state,\n }),\n ),\n useStoreOptions,\n );\n }\n\n useField<TPath extends string>(\n path: TPath,\n useStoreOptions?: UseStoreOptions<any>,\n ): Field<TDraft, TOriginal, TPath> {\n const form = this.useForm();\n this.useFormState((form) => [form.getField(path).value, form.original], useStoreOptions);\n return form.getField(path);\n }\n\n // ///////////////////////////////////////////////////////////////////////////\n // React Components\n // ///////////////////////////////////////////////////////////////////////////\n\n Form({\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ...formProps\n }: {\n original?: TOriginal;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<TDraft, TOriginal>) => void;\n } & Partial<FormOptions<TDraft, TOriginal>> &\n Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave' | 'onSubmit'>): JSX.Element {\n const options: FormOptions<TDraft, TOriginal> = {\n defaultValue: { ...this.options.defaultValue, ...defaultValue },\n validations: { ...this.options.validations, ...validations } as Validations<\n TDraft,\n TOriginal\n >,\n localizeError: localizeError ?? this.options.localizeError,\n autoSave: autoSave ?? this.options.autoSave,\n transform: transform ?? this.options.transform,\n validatedClass: validatedClass ?? this.options.validatedClass,\n };\n\n const formState = useMemo(() => {\n return createStore<FormState<TDraft>>({\n draft: undefined,\n hasTriggeredValidations: false,\n saveScheduled: false,\n saveInProgress: false,\n });\n }, []);\n\n const derivedState = useMemo(() => {\n return formState.map<FormDerivedState<TDraft>>(\n (state) => {\n const {\n draft = original ?? options.defaultValue,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n } = state;\n const errors = getErrors(draft, original, options.validations);\n\n return {\n draft,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n hasChanges: !deepEqual(draft, original ?? options.defaultValue),\n errors,\n isValid: errors.size === 0,\n };\n },\n (newState) => ({\n draft: newState.draft,\n hasTriggeredValidations: newState.hasTriggeredValidations,\n saveScheduled: newState.saveScheduled,\n saveInProgress: newState.saveInProgress,\n }),\n );\n }, [formState, original, options.validations, options.defaultValue]);\n\n const context = useMemo(() => {\n return {\n formState,\n derivedState,\n options,\n original,\n\n getField(path) {\n return getField(derivedState, original, path);\n },\n\n getDraft() {\n return formState.get().draft ?? original ?? options.defaultValue;\n },\n\n hasTriggeredValidations() {\n return formState.get().hasTriggeredValidations;\n },\n\n hasChanges() {\n return derivedState.get().hasChanges;\n },\n\n getErrors() {\n return derivedState.get().errors;\n },\n\n isValid() {\n return derivedState.get().isValid;\n },\n\n validate() {\n formState.set('hasTriggeredValidations', true);\n return derivedState.get().isValid;\n },\n\n reset() {\n formState.set('draft', undefined);\n formState.set('hasTriggeredValidations', false);\n },\n } satisfies FormContext<TDraft, TOriginal>;\n }, [\n formState,\n derivedState,\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ]);\n\n useEffect(() => {\n if (urlState) {\n return connectUrl(\n formState.map('draft'),\n typeof urlState === 'object' ? urlState : { key: 'form' },\n );\n }\n\n return undefined;\n }, [formState, simpleHash(urlState)]);\n\n useEffect(() => {\n const handles = options.transform?.map(({ trigger, update }) => {\n const draft = derivedState.map('draft');\n const triggerStore = trigger ? draft.map(trigger as any) : draft;\n\n return triggerStore.subscribe(() => {\n const value = trigger ? get(draft.get(), trigger as any) : draft.get();\n const result = update(value as any, draft);\n\n if (result !== undefined) {\n draft.set(result);\n }\n });\n });\n\n return () => {\n handles?.forEach((handle) => handle());\n };\n }, [options.transform]);\n\n useFormAutosave(context);\n\n return (\n <this.context.Provider value={context}>\n <FormContainer {...formProps} form={this} />\n </this.context.Provider>\n );\n }\n\n FormState<S>({\n selector,\n children,\n }: {\n selector: (form: FormInstance<TDraft, TOriginal>) => S;\n children: (selectedState: S) => ReactNode;\n }): JSX.Element {\n const selectedState = this.useFormState(selector);\n return <>{children(selectedState)}</>;\n }\n\n Field<const TPath extends string>(\n props: FormFieldPropsWithRender<TDraft, TOriginal, TPath>,\n ): JSX.Element;\n\n Field<const TPath extends string, const TComponent extends FormFieldComponent = 'input'>(\n props: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n ): JSX.Element;\n\n Field(props: any): JSX.Element {\n return Reflect.apply(FormField, this, [{ component: 'input', ...props }]);\n }\n\n ForEach<const TPath extends string>(props: FormForEachProps<TDraft, TPath>): JSX.Element {\n return Reflect.apply(FormForEach, this, [props]);\n }\n\n withForm<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n formProps?: Parameters<this['Form']>[0],\n ): FunctionComponent<TProps> {\n const { Form } = this;\n return function FormWrapper(props: TProps) {\n return (\n <Form {...formProps}>\n <Component {...props} />\n </Form>\n );\n };\n }\n}\n\nexport function createForm<TDraft, TOriginal extends TDraft = TDraft>(\n options: FormOptions<TDraft, TOriginal>,\n): Form<TDraft, TOriginal> {\n return new Form(options);\n}\n","import { startTransition, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport { simpleHash } from '@lib/hash';\nimport { throttle } from '@lib/throttle';\n\nexport interface UseDecoupledStateOptions<T> {\n debounce?: Duration;\n throttle?: Duration;\n onCommit?: (value: T) => void;\n}\n\nexport function useDecoupledState<T>(\n value: T,\n onChange: (value: T) => void,\n options: UseDecoupledStateOptions<T> = {},\n): [state: T, setState: (value: T) => void] {\n const [dirty, setDirty] = useState<{ v: T }>();\n const ref = useRef({ onChange, onCommit: options.onCommit });\n\n useEffect(() => {\n ref.current = { onChange, onCommit: options.onCommit };\n }, [onChange]);\n\n const update = useMemo(() => {\n const { onChange, onCommit } = ref.current;\n\n const update = (value: T) => {\n onChange(value);\n setDirty(undefined);\n onCommit?.(value);\n };\n\n let delayedUpdate: (value: T) => void;\n\n if (options.debounce) {\n delayedUpdate = debounce(update, options.debounce);\n } else if (options.throttle) {\n delayedUpdate = throttle(update, options.throttle);\n } else {\n delayedUpdate = (value) => startTransition(() => update(value));\n }\n\n return (value: T) => {\n setDirty({ v: value });\n delayedUpdate(value);\n };\n }, [simpleHash([options.debounce, options.throttle])]);\n\n return [dirty ? dirty.v : value, update];\n}\n","export function castArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n","import { castArray } from '@lib/castArray';\nimport { simpleHash } from '@lib/hash';\nimport { useEffect } from 'react';\n\nexport function useUrlParamScope({\n key,\n type = 'search',\n}: {\n key: string | string[];\n type?: 'search' | 'hash';\n}): void {\n useEffect(\n () => () => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n\n for (const _key of castArray(key)) {\n parameters.delete(_key);\n }\n\n url[type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n },\n [simpleHash(key), type],\n );\n}\n"],"names":["jsxs","jsx","castArrayPath","isObject","useState","form","value","useEffect","Fragment","createElement","useCallback","name","calcDuration","useRef","useMemo","queue","debounce","options","deepEqual","errors","get","join","createContext","autobind","useContext","useStore","createStore","connectUrl","simpleHash","Form","onChange","update","throttle","startTransition"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/react/form/customInput.tsx","../../../src/lib/wildcardMatch.ts","../../../src/react/form/formField.tsx","../../../src/react/form/formForEach.tsx","../../../src/react/form/useFormAutosave.ts","../../../src/react/form/form.tsx","../../../src/react/useDecoupledState.ts","../../../src/lib/castArray.ts","../../../src/react/useUrlParamScope.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CustomInputProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n children?: ReactNode;\n}\n\nexport function CustomInput({ name, children, ...props }: CustomInputProps): JSX.Element {\n return (\n <div\n {...props}\n style={{\n position: 'relative',\n ...props.style,\n }}\n >\n {children}\n\n <input\n name={name}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n opacity: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n />\n </div>\n );\n}\n","import { isObject } from '@lib/helpers';\nimport { type KeyType } from './path';\nimport { castArrayPath } from './propAccess';\n\nexport function wildcardMatch(s: KeyType[] | string, w: KeyType[] | string): boolean {\n if (typeof s === 'string') {\n s = castArrayPath(s);\n }\n\n if (typeof w === 'string') {\n w = castArrayPath(w);\n }\n\n return s.length === w.length && s.every((s, i) => w[i] === '*' || s === w[i]);\n}\n\nexport function getWildCardMatches(\n object: any,\n path: [KeyType, ...KeyType[]] | string,\n): Record<KeyType, any> {\n const matches: Record<KeyType, any> = {};\n const [first, second, ...rest] = castArrayPath(path);\n\n if (first === undefined) {\n throw new Error('Path is empty');\n }\n\n if (!Array.isArray(object) && !isObject(object)) {\n object = {};\n }\n\n for (const [key, value] of first !== '*' ? [[first, object[first]]] : Object.entries(object)) {\n if (first !== '*' && first !== key) {\n continue;\n }\n\n if (second === undefined) {\n matches[key] = value;\n continue;\n }\n\n for (const [subKey, subValue] of Object.entries(getWildCardMatches(value, [second, ...rest]))) {\n matches[`${key}.${subKey}`] = subValue;\n }\n }\n\n return matches;\n}\n","import { type PathAsString, type Value } from '@lib/path';\nimport {\n createElement,\n useEffect,\n useState,\n type Component,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { getDerivedState, type Field, type Form, type FormInstance } from './form';\n\nexport interface FormFieldComponentProps<TValue, TPath> {\n name: TPath;\n value: TValue;\n onChange: (event: { target: { value: TValue } } | TValue | undefined, ...args: any[]) => void;\n onBlur: (...args: any[]) => void;\n}\n\nexport type FormFieldInfos<TDraft, TOriginal, TPath extends string> = Field<\n TDraft,\n TOriginal,\n TPath\n> & {\n hasTriggeredValidations: boolean;\n};\n\ntype NativeInputType = 'input' | 'select' | 'textarea';\n\ntype PartialComponentType<P> =\n | (new (props: P, context?: any) => Component<P, any>)\n | ((props: P, context?: any) => ReactNode);\n\nexport type FormFieldComponent = NativeInputType | PartialComponentType<any>;\n\ntype FieldValue<T extends FormFieldComponent> = ComponentPropsWithoutRef<T>['value'];\n\ntype FieldChangeValue<T extends FormFieldComponent> =\n ComponentPropsWithoutRef<T> extends {\n onChange?: (update: infer U) => void;\n }\n ? U extends { target: { value: infer V } }\n ? V\n : U\n : never;\n\ntype MakeOptional<T, Keys extends string> = Omit<T, Keys> & Partial<Pick<T, Keys & keyof T>>;\n\nexport type FormFieldProps<TPath, TDraft> = {\n name: TPath & PathAsString<TDraft>;\n commitOnBlur?: boolean;\n commitDebounce?: number;\n};\n\nexport type FormFieldPropsWithRender<TDraft, TOriginal, TPath extends string> = FormFieldProps<\n TPath,\n TDraft\n> &\n NoInfer<{\n component?: undefined;\n render: (\n props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n info: FormFieldInfos<TDraft, TOriginal, TPath>,\n ) => ReactNode;\n inputFilter?: undefined;\n defaultValue?: undefined;\n serialize?: undefined;\n deserialize?: undefined;\n onChange?: undefined;\n onBlur?: undefined;\n }>;\n\ntype Serialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: Value<TDraft, TPath>,\n formState: FormInstance<TDraft, TOriginal>,\n) => FieldValue<TComponent>;\n\ntype Deserialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: FieldChangeValue<TComponent>,\n formState: FormInstance<TDraft, TOriginal>,\n) => Value<TDraft, TPath>;\n\nexport type FormFieldPropsWithComponent<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n> = FormFieldProps<TPath, TDraft> & {\n component?: TComponent;\n render?: undefined;\n} & NoInfer<\n {\n inputFilter?: (value: FieldChangeValue<TComponent>) => boolean;\n } & MakeOptional<\n Omit<ComponentPropsWithoutRef<TComponent>, 'id' | 'name' | 'value' | 'defaultValue'>,\n 'onChange' | 'onBlur'\n > &\n (Value<TDraft, TPath> extends Exclude<FieldValue<TComponent>, undefined>\n ? {\n defaultValue?: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : Value<TDraft, TPath> extends FieldValue<TComponent>\n ?\n | {\n defaultValue: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n | {\n defaultValue?: FieldValue<TComponent>;\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }) &\n (FieldChangeValue<TComponent> extends Value<TDraft, TPath>\n ? {\n deserialize?: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n deserialize: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n })\n >;\n\nexport function FormField<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n>(\n this: Form<TDraft, any>,\n {\n // id,\n name = '' as any,\n component,\n commitOnBlur,\n commitDebounce,\n render,\n inputFilter,\n defaultValue,\n serialize,\n deserialize = (x) => x as Value<TDraft, TPath>,\n onChange,\n onBlur,\n ...restProps\n }:\n | FormFieldPropsWithRender<TDraft, TOriginal, TPath>\n | FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n): JSX.Element | null {\n type T = FieldChangeValue<TComponent>;\n\n const form = this.useForm();\n const getFormState = () => ({ ...form, ...getDerivedState(form) });\n const [localValue, setLocalValue] = useState<T>();\n\n const value = this.useFormState((form) => {\n const value = form.getField(name as any).value;\n if (serialize) {\n return serialize(value as any, getFormState());\n }\n if (value !== undefined) {\n return value;\n }\n return defaultValue;\n });\n\n const setValue = (x: FieldChangeValue<TComponent>) =>\n form.getField(name as any).setValue(deserialize(x, getFormState()));\n\n const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n useEffect(() => {\n if (localValue === undefined || !commitDebounce) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setValue(localValue);\n setLocalValue(undefined);\n }, commitDebounce);\n\n return () => clearTimeout(timeout);\n }, [localValue, commitDebounce]);\n\n const props = {\n name,\n value: localValue ?? value,\n onChange: (event: { target: { value: T } } | T, ...moreArgs: any[]) => {\n const value =\n typeof event === 'object' && event !== null && 'target' in event\n ? event.target.value\n : event;\n\n if (inputFilter && !inputFilter(value)) {\n return;\n }\n\n if (commitOnBlur || commitDebounce) {\n setLocalValue(value);\n } else {\n setValue(value);\n }\n\n onChange?.(event, ...moreArgs);\n },\n onBlur(...args: any[]) {\n if (localValue !== undefined) {\n setValue(localValue);\n setLocalValue(undefined);\n }\n\n onBlur?.(...args);\n },\n } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n if (render) {\n return (\n <>\n {render(props, { ...form.getField(name as any), hasTriggeredValidations } as any) ?? null}\n </>\n );\n }\n\n if (component) {\n return createElement(component, { ...restProps, ...props });\n }\n\n return null;\n}\n","import { type GetKeys, type Join, type PathAsString, type Value } from '@lib/path';\nimport { Fragment, useCallback, type ReactNode } from 'react';\nimport { type FieldHelperMethods, type Form } from './form';\n\nexport type ElementName<TDraft, TPath extends string> = keyof {\n [Path in TPath as Join<Path, GetKeys<NonNullable<Value<TDraft, Path>>> & (string | number)>]: 1;\n};\n\nexport interface FormForEachProps<TDraft, TPath extends string> {\n name: TPath & PathAsString<TDraft>;\n renderElement?: (props: {\n name: ElementName<TDraft, TPath>;\n key: `${GetKeys<NonNullable<Value<TDraft, TPath>>> & (string | number)}`;\n index: number;\n remove: () => void;\n }) => ReactNode;\n children?: (\n props: {\n setValue: (\n value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>),\n ) => void;\n } & FieldHelperMethods<TDraft, TPath>,\n ) => ReactNode;\n}\n\nexport function FormForEach<TDraft, TPath extends string>(\n this: Form<TDraft, any>,\n { name, renderElement, children }: FormForEachProps<TDraft, TPath>,\n): JSX.Element {\n const form = this.useForm();\n\n const names = this.useFormState(() => {\n const field = form.getField(name as any) as any;\n return field.names as any[];\n });\n\n const add = useCallback(\n (...args: any[]) => {\n const field = form.getField(name as any) as any;\n field.add(...args);\n },\n [form],\n );\n\n const remove = useCallback(\n (key: any) => {\n const field = form.getField(name as any) as any;\n field.remove(key);\n },\n [form],\n );\n\n const setValue = useCallback(\n (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => {\n const field = form.getField(name as any) as any;\n field.setValue(value);\n },\n [form],\n );\n\n return (\n <>\n {renderElement &&\n names.map((name, index) => {\n const key = name.split('.').pop();\n\n return (\n <Fragment key={key}>\n {renderElement({\n name,\n key,\n index,\n remove: () => remove(key),\n })}\n </Fragment>\n );\n })}\n\n {children?.({\n names,\n add,\n remove,\n setValue,\n } as any)}\n </>\n );\n}\n","import type { Duration } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { debounce } from '@lib/debounce';\nimport { deepEqual } from '@lib/equals';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { queue } from '@lib/queue';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { FormContext } from './form';\n\nexport interface FormAutosaveOptions<TDraft, TOriginal> {\n save: (draft: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;\n debounce?: Duration;\n resetAfterSave?: boolean;\n}\n\nexport function useFormAutosave<TDraft, TOriginal extends TDraft>(\n form: FormContext<TDraft, TOriginal>,\n): void {\n const { formState, options, getDraft } = form;\n const debounceTime = calcDuration(options.autoSave?.debounce ?? 2_000);\n const latestRef = useRef({ options });\n const lastValue = useRef<TDraft>();\n const q = useMemo(() => queue(), []);\n\n const run = useMemo(\n () =>\n debounce(async () => {\n const { options } = latestRef.current;\n const save = options.autoSave?.save;\n const draft = getDraft();\n\n lastValue.current = draft;\n\n q.clear();\n\n q(async () => {\n try {\n formState.set('saveInProgress', true);\n await save?.(draft, form);\n\n if (q.size === 0 && options.autoSave?.resetAfterSave) {\n form.reset();\n }\n } finally {\n formState.set('saveInProgress', false);\n\n if (q.size === 0) {\n formState.set('saveScheduled', false);\n }\n }\n });\n }, debounceTime),\n [formState, debounceTime],\n );\n\n useEffect(() => {\n if (!options.autoSave?.save) {\n return;\n }\n\n return formState\n .map((state) => state.draft)\n .subscribe(\n () => {\n if (deepEqual(getDraft(), lastValue.current)) {\n return;\n }\n\n run();\n formState.set('saveScheduled', true);\n },\n { runNow: false },\n );\n }, [formState]);\n\n useEffect(() => {\n latestRef.current = { options };\n });\n}\n","import { connectUrl, createStore, type Store, type Update, type UrlStoreOptions } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { deepEqual } from '@lib/equals';\nimport { simpleHash } from '@lib/hash';\nimport { isObject } from '@lib/helpers';\nimport {\n type Path,\n type PathAsString,\n type Value,\n type WildcardPathAsString,\n type WildcardValue,\n} from '@lib/path';\nimport { get, join, set } from '@lib/propAccess';\nimport type { Object_ } from '@lib/typeHelpers';\nimport { getWildCardMatches } from '@lib/wildcardMatch';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type Context,\n type FormEvent,\n type FunctionComponent,\n type HTMLProps,\n type ReactNode,\n} from 'react';\nimport { useStore, type UseStoreOptions } from '../useStore';\nimport {\n FormField,\n type FormFieldComponent,\n type FormFieldPropsWithComponent,\n type FormFieldPropsWithRender,\n} from './formField';\nimport { FormForEach, type ElementName, type FormForEachProps } from './formForEach';\nimport { useFormAutosave, type FormAutosaveOptions } from './useFormAutosave';\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Form types\n/// /////////////////////////////////////////////////////////////////////////////\n\nexport type Transform<TDraft> = Path<TDraft> | '' extends infer TPath\n ? TPath extends TPath\n ? {\n update: (value: Value<TDraft, TPath>, store: Store<TDraft>) => void | TDraft;\n } & (TPath extends '' ? { trigger?: '' } : { trigger: TPath })\n : never\n : never;\n\nexport interface FormOptions<TDraft, TOriginal> {\n defaultValue: TDraft;\n validations?: Validations<TDraft, TOriginal>;\n localizeError?: (error: string, field: string) => string | undefined;\n urlState?: boolean | UrlStoreOptions<TDraft>;\n autoSave?: FormAutosaveOptions<TDraft, TOriginal>;\n transform?: Transform<TDraft>[];\n validatedClass?: string;\n}\n\nexport type Validations<TDraft, TOriginal> = {\n [TPath in WildcardPathAsString<TDraft>]?: Record<string, Validation<TDraft, TOriginal, TPath>>;\n} & Record<string, Record<string, Validation<TDraft, TOriginal, any>>>;\n\nexport type Validation<TDraft, TOriginal, TPath> = (\n value: WildcardValue<TDraft, TPath>,\n context: {\n draft: TDraft;\n original: TOriginal;\n field: PathAsString<TDraft> | '';\n },\n) => boolean;\n\nexport type Field<TDraft, TOriginal, TPath extends string> = {\n originalValue: Value<TOriginal, TPath> | undefined;\n value: Value<TDraft, TPath>;\n setValue: (value: Update<Value<TDraft, TPath>>) => void;\n hasChange: boolean;\n errors: string[];\n} & (Value<TDraft, TPath> extends Object_ ? FieldHelperMethods<TDraft, TPath> : {});\n\nexport type FieldHelperMethods<TDraft, TPath extends string> = {\n names: ElementName<TDraft, TPath>[];\n add: NonNullable<Value<TDraft, TPath>> extends readonly (infer T)[]\n ? (element: T) => void\n : NonNullable<Value<TDraft, TPath>> extends Record<infer K, infer V>\n ? (key: K, value: V) => void\n : never;\n remove: Value<TDraft, TPath> extends readonly any[]\n ? (index: number) => void\n : (key: string) => void;\n};\n\nexport interface FormState<TDraft> {\n draft: TDraft | undefined;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n}\n\nexport interface FormDerivedState<TDraft> {\n draft: TDraft;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n hasChanges: boolean;\n errors: Map<string, string[]>;\n isValid: boolean;\n}\n\nexport interface FormContext<TDraft, TOriginal> {\n formState: Store<FormState<TDraft>>;\n options: FormOptions<TDraft, TOriginal>;\n original: TOriginal | undefined;\n getField: <TPath extends string>(path: TPath) => Field<TDraft, TOriginal, TPath>;\n getDraft: () => TDraft;\n hasTriggeredValidations: () => boolean;\n saveScheduled: () => boolean;\n saveInProgress: () => boolean;\n hasChanges: () => boolean;\n getErrors: () => Map<string, string[]>;\n isValid: () => boolean;\n validate: () => boolean;\n reset: () => void;\n}\n\nexport interface FormInstance<TDraft, TOriginal>\n extends FormDerivedState<TDraft>,\n Pick<\n FormContext<TDraft, TOriginal>,\n 'options' | 'original' | 'getField' | 'validate' | 'reset'\n > {}\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Implementation\n/// /////////////////////////////////////////////////////////////////////////////\n\nfunction FormContainer({\n form,\n ...formProps\n}: {\n form: Form<any, any>;\n onSubmit?: (\n event: FormEvent<HTMLFormElement>,\n form: FormInstance<any, any>,\n ) => void | Promise<void>;\n} & Omit<HTMLProps<HTMLFormElement>, 'form' | 'onSubmit'>) {\n const formInstance = form.useForm();\n const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n function updateValidity(errors: Map<string, string[]>, buttonElement?: HTMLButtonElement) {\n const formElement = formRef.current;\n if (!formElement) {\n return;\n }\n\n const localizedErrors = new Map(\n [...errors.entries()].map(\n ([field, errors]) =>\n [\n field,\n errors.map((error) => formInstance.options.localizeError?.(error, field) ?? error),\n ] as const,\n ),\n );\n\n for (const element of Array.from(formElement.elements)) {\n if ('name' in element && 'setCustomValidity' in element) {\n (element as HTMLObjectElement).setCustomValidity(\n localizedErrors.get((element as HTMLObjectElement).name)?.join('\\n') ?? '',\n );\n }\n }\n\n if (buttonElement && 'setCustomValidity' in buttonElement) {\n const errorString = [...errors.values()].flat().join('\\n');\n\n buttonElement.setCustomValidity(errorString);\n }\n }\n\n useEffect(() => {\n return formInstance.formState\n .map(() => formInstance.getErrors())\n .subscribe((errors) => updateValidity(errors));\n }, []);\n\n return (\n <form\n ref={formRef}\n noValidate\n {...formProps}\n className={[\n formProps.className,\n hasTriggeredValidations ? (formInstance.options.validatedClass ?? 'validated') : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onSubmit={async (event) => {\n if (formInstance.saveInProgress()) {\n return;\n }\n\n try {\n formInstance.formState.set('saveInProgress', true);\n event.preventDefault();\n\n const formElement = event.currentTarget;\n const buttonElement =\n event.nativeEvent instanceof SubmitEvent &&\n event.nativeEvent.submitter instanceof HTMLButtonElement\n ? event.nativeEvent.submitter\n : undefined;\n\n updateValidity(formInstance.getErrors(), buttonElement);\n\n formElement.reportValidity();\n\n const isValid = formInstance.validate();\n if (isValid) {\n await formProps.onSubmit?.(event, {\n ...formInstance,\n ...getDerivedState(formInstance),\n });\n }\n } finally {\n formInstance.formState.set('saveInProgress', false);\n }\n }}\n />\n );\n}\n\nfunction getField<TDraft, TOriginal extends TDraft, TPath extends string>(\n form: FormContext<TDraft, TOriginal>,\n path: TPath,\n): Field<TDraft, TOriginal, TPath> {\n const field = {\n get originalValue() {\n return form.original !== undefined ? get(form.original as any, path as any) : undefined;\n },\n\n get value() {\n const draft = form.getDraft();\n return get(draft ?? form.original ?? form.options.defaultValue, path as any);\n },\n\n setValue(update: Update<Value<TDraft, TPath>>) {\n form.formState.set('draft', (draft = form.original ?? form.options.defaultValue) => {\n if (update instanceof Function) {\n update = update(get(draft, path as any) as Value<TDraft, TPath>);\n }\n\n return set(draft, path as any, update as any);\n });\n },\n\n get hasChange() {\n return !deepEqual(this.originalValue, this.value);\n },\n\n get errors() {\n const errors = form.getErrors();\n return errors.get(path) ?? [];\n },\n\n get names(): any {\n const { value } = this;\n\n if (Array.isArray(value)) {\n return value.map((_, index) => join(path, String(index)));\n }\n\n if (isObject(value)) {\n return Object.keys(value).map((key) => join(path, key));\n }\n\n return [];\n },\n\n add(...args: any[]) {\n this.setValue((value): any => {\n if (!value) {\n throw new Error(`Cannot add element to ${JSON.stringify(value)}`);\n }\n\n if (Array.isArray(value)) {\n return [...(value ?? []), args[0]];\n }\n\n if (isObject(value)) {\n return {\n ...value,\n [args[0]]: args[1],\n };\n }\n\n throw new Error(`Cannot add element to ${JSON.stringify(value)}`);\n });\n },\n\n remove(key: string | number) {\n this.setValue((value): any => {\n if (!value) {\n throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);\n }\n\n if (Array.isArray(value)) {\n return value.filter((_, index) => index !== Number(key));\n }\n\n if (isObject(value)) {\n const { [key]: _, ...rest } = value as Record<string | number, unknown>;\n return rest;\n }\n\n throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);\n });\n },\n };\n\n return field as any;\n}\n\nfunction getErrors<TDraft, TOriginal>(\n draft: TDraft,\n original: TOriginal | undefined,\n validations: FormOptions<TDraft, TOriginal>['validations'],\n) {\n const errors = new Map<string, string[]>();\n\n for (const [path, block] of Object.entries(validations ?? {})) {\n for (const [validationName, validate] of Object.entries(\n block as Record<string, Validation<any, any, any>>,\n )) {\n let matched = false;\n\n for (const [field, value] of Object.entries(getWildCardMatches(draft, path))) {\n matched = true;\n if (!validate(value, { draft, original, field })) {\n const fieldErrors = errors.get(field) ?? [];\n fieldErrors.push(validationName);\n errors.set(field, fieldErrors);\n }\n }\n\n if (!matched && !path.includes('*')) {\n if (!validate(undefined, { draft, original, field: path })) {\n const fieldErrors = errors.get(path) ?? [];\n fieldErrors.push(validationName);\n errors.set(path, fieldErrors);\n }\n }\n }\n }\n\n return errors;\n}\n\nexport function getDerivedState<TDraft>(\n instance: FormContext<TDraft, any>,\n): FormDerivedState<TDraft> {\n return {\n draft: instance.getDraft(),\n hasTriggeredValidations: instance.hasTriggeredValidations(),\n saveScheduled: instance.saveScheduled(),\n saveInProgress: instance.saveInProgress(),\n hasChanges: instance.hasChanges(),\n errors: instance.getErrors(),\n isValid: instance.isValid(),\n };\n}\n\nexport class Form<TDraft, TOriginal extends TDraft = TDraft> {\n context: Context<FormContext<TDraft, TOriginal> | null> = createContext<FormContext<\n TDraft,\n TOriginal\n > | null>(null);\n\n constructor(public readonly options: FormOptions<TDraft, TOriginal>) {\n autobind(Form);\n }\n\n useForm(): FormContext<TDraft, TOriginal> {\n const context = useContext(this.context);\n\n if (!context) {\n throw new Error('Form context not found');\n }\n\n return context;\n }\n\n useFormState<S>(\n selector: (state: FormInstance<TDraft, TOriginal>) => S,\n useStoreOptions?: UseStoreOptions<S>,\n ): S {\n const form = this.useForm();\n\n return useStore(\n form.formState,\n () =>\n selector({\n ...form,\n ...getDerivedState(form),\n }),\n\n useStoreOptions,\n );\n }\n\n useField<TPath extends string>(\n path: TPath,\n useStoreOptions?: UseStoreOptions<any>,\n ): Field<TDraft, TOriginal, TPath> {\n const form = this.useForm();\n this.useFormState((form) => [form.getField(path).value, form.original], useStoreOptions);\n return form.getField(path);\n }\n\n // ///////////////////////////////////////////////////////////////////////////\n // React Components\n // ///////////////////////////////////////////////////////////////////////////\n\n Form({\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ...formProps\n }: {\n original?: TOriginal;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<TDraft, TOriginal>) => void;\n } & Partial<FormOptions<TDraft, TOriginal>> &\n Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave' | 'onSubmit'>): JSX.Element {\n const options: FormOptions<TDraft, TOriginal> = {\n defaultValue: { ...this.options.defaultValue, ...defaultValue },\n validations: { ...this.options.validations, ...validations } as Validations<\n TDraft,\n TOriginal\n >,\n localizeError: localizeError ?? this.options.localizeError,\n autoSave: autoSave ?? this.options.autoSave,\n transform: transform ?? this.options.transform,\n validatedClass: validatedClass ?? this.options.validatedClass,\n };\n\n const formState = useMemo(() => {\n return createStore<FormState<TDraft>>({\n draft: undefined,\n hasTriggeredValidations: false,\n saveScheduled: false,\n saveInProgress: false,\n });\n }, []);\n\n let lastDraft: TDraft | undefined;\n const cache = new Map<string, unknown>();\n function lazy<T>(key: string, fn: () => T): T {\n if (lastDraft !== formState.get().draft) {\n cache.clear();\n lastDraft = formState.get().draft;\n }\n\n let value = cache.get(key);\n if (!cache.has(key)) {\n value = fn();\n cache.set(key, value);\n }\n\n return value as T;\n }\n\n const context: FormContext<TDraft, TOriginal> = {\n formState,\n options,\n original,\n\n getField() {\n throw new Error('Not implemented');\n },\n\n getDraft() {\n return formState.get().draft ?? original ?? options.defaultValue;\n },\n\n hasTriggeredValidations() {\n return formState.get().hasTriggeredValidations;\n },\n\n saveScheduled() {\n return formState.get().saveScheduled;\n },\n\n saveInProgress() {\n return formState.get().saveInProgress;\n },\n\n hasChanges() {\n return lazy(\n 'hasChanges',\n () => !deepEqual(this.getDraft(), original ?? options.defaultValue),\n );\n },\n\n getErrors() {\n return lazy('getErrors', () => getErrors(this.getDraft(), original, options.validations));\n },\n\n isValid() {\n return lazy('isValid', () => this.getErrors().size === 0);\n },\n\n validate() {\n formState.set('hasTriggeredValidations', true);\n return this.isValid();\n },\n\n reset() {\n formState.set('draft', undefined);\n formState.set('hasTriggeredValidations', false);\n },\n };\n\n context.getField = (path) => lazy(path, () => getField(context, path));\n\n useEffect(() => {\n if (urlState) {\n return connectUrl(\n formState.map('draft'),\n typeof urlState === 'object' ? urlState : { key: 'form' },\n );\n }\n\n return undefined;\n }, [formState, simpleHash(urlState)]);\n\n // useEffect(() => {\n // const handles = options.transform?.map(({ trigger, update }) => {\n // const draft = derivedState.map('draft');\n // const triggerStore = trigger ? draft.map(trigger as any) : draft;\n\n // return triggerStore.subscribe(() => {\n // const value = trigger ? get(draft.get(), trigger as any) : draft.get();\n // const result = update(value as any, draft);\n\n // if (result !== undefined) {\n // draft.set(result);\n // }\n // });\n // });\n\n // return () => {\n // handles?.forEach((handle) => handle());\n // };\n // }, [original,options.transform]);\n\n useFormAutosave(context);\n\n return (\n <this.context.Provider value={context}>\n <FormContainer {...formProps} form={this} />\n </this.context.Provider>\n );\n }\n\n FormState<S>({\n selector,\n children,\n }: {\n selector: (form: FormInstance<TDraft, TOriginal>) => S;\n children: (selectedState: S) => ReactNode;\n }): JSX.Element {\n const selectedState = this.useFormState(selector);\n return <>{children(selectedState)}</>;\n }\n\n Field<const TPath extends string>(\n props: FormFieldPropsWithRender<TDraft, TOriginal, TPath>,\n ): JSX.Element;\n\n Field<const TPath extends string, const TComponent extends FormFieldComponent = 'input'>(\n props: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n ): JSX.Element;\n\n Field(props: any): JSX.Element {\n return Reflect.apply(FormField, this, [{ component: 'input', ...props }]);\n }\n\n ForEach<const TPath extends string>(props: FormForEachProps<TDraft, TPath>): JSX.Element {\n return Reflect.apply(FormForEach, this, [props]);\n }\n\n withForm<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n formProps?: Parameters<this['Form']>[0],\n ): FunctionComponent<TProps> {\n const { Form } = this;\n return function FormWrapper(props: TProps) {\n return (\n <Form {...formProps}>\n <Component {...props} />\n </Form>\n );\n };\n }\n}\n\nexport function createForm<TDraft, TOriginal extends TDraft = TDraft>(\n options: FormOptions<TDraft, TOriginal>,\n): Form<TDraft, TOriginal> {\n return new Form(options);\n}\n","import { startTransition, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport { simpleHash } from '@lib/hash';\nimport { throttle } from '@lib/throttle';\n\nexport interface UseDecoupledStateOptions<T> {\n debounce?: Duration;\n throttle?: Duration;\n onCommit?: (value: T) => void;\n}\n\nexport function useDecoupledState<T>(\n value: T,\n onChange: (value: T) => void,\n options: UseDecoupledStateOptions<T> = {},\n): [state: T, setState: (value: T) => void] {\n const [dirty, setDirty] = useState<{ v: T }>();\n const ref = useRef({ onChange, onCommit: options.onCommit });\n\n useEffect(() => {\n ref.current = { onChange, onCommit: options.onCommit };\n }, [onChange]);\n\n const update = useMemo(() => {\n const { onChange, onCommit } = ref.current;\n\n const update = (value: T) => {\n onChange(value);\n setDirty(undefined);\n onCommit?.(value);\n };\n\n let delayedUpdate: (value: T) => void;\n\n if (options.debounce) {\n delayedUpdate = debounce(update, options.debounce);\n } else if (options.throttle) {\n delayedUpdate = throttle(update, options.throttle);\n } else {\n delayedUpdate = (value) => startTransition(() => update(value));\n }\n\n return (value: T) => {\n setDirty({ v: value });\n delayedUpdate(value);\n };\n }, [simpleHash([options.debounce, options.throttle])]);\n\n return [dirty ? dirty.v : value, update];\n}\n","export function castArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n","import { castArray } from '@lib/castArray';\nimport { simpleHash } from '@lib/hash';\nimport { useEffect } from 'react';\n\nexport function useUrlParamScope({\n key,\n type = 'search',\n}: {\n key: string | string[];\n type?: 'search' | 'hash';\n}): void {\n useEffect(\n () => () => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n\n for (const _key of castArray(key)) {\n parameters.delete(_key);\n }\n\n url[type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n },\n [simpleHash(key), type],\n );\n}\n"],"names":["jsxs","jsx","castArrayPath","isObject","useState","form","value","useEffect","Fragment","createElement","useCallback","name","calcDuration","useRef","useMemo","queue","debounce","options","deepEqual","errors","get","set","join","createContext","autobind","useContext","useStore","createStore","connectUrl","simpleHash","Form","onChange","update","throttle","startTransition"],"mappings":"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"}
|
package/dist/es/react/index.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { c as calcDuration, q as queue, d as debounce, f as autobind, b as creat
|
|
|
5
5
|
import { s as simpleHash } from '../hash.mjs';
|
|
6
6
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
7
7
|
import { c as connectUrl } from '../urlStore.mjs';
|
|
8
|
-
import { c as castArrayPath, e as isObject, d as deepEqual, g as get,
|
|
8
|
+
import { c as castArrayPath, e as isObject, d as deepEqual, j as join, g as get, b as set } from '../propAccess.mjs';
|
|
9
9
|
|
|
10
10
|
function CustomInput({ name, children, ...props }) {
|
|
11
11
|
return /* @__PURE__ */ jsxs(
|
|
@@ -78,7 +78,7 @@ function FormField({
|
|
|
78
78
|
...restProps
|
|
79
79
|
}) {
|
|
80
80
|
const form = this.useForm();
|
|
81
|
-
const getFormState = () => ({ ...form, ...form
|
|
81
|
+
const getFormState = () => ({ ...form, ...getDerivedState(form) });
|
|
82
82
|
const [localValue, setLocalValue] = useState();
|
|
83
83
|
const value = this.useFormState((form2) => {
|
|
84
84
|
const value2 = form2.getField(name).value;
|
|
@@ -263,8 +263,8 @@ function FormContainer({
|
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
265
|
useEffect(() => {
|
|
266
|
-
return formInstance.
|
|
267
|
-
}, [
|
|
266
|
+
return formInstance.formState.map(() => formInstance.getErrors()).subscribe((errors) => updateValidity(errors));
|
|
267
|
+
}, []);
|
|
268
268
|
return /* @__PURE__ */ jsx(
|
|
269
269
|
"form",
|
|
270
270
|
{
|
|
@@ -275,40 +275,53 @@ function FormContainer({
|
|
|
275
275
|
formProps.className,
|
|
276
276
|
hasTriggeredValidations ? formInstance.options.validatedClass ?? "validated" : undefined
|
|
277
277
|
].filter(Boolean).join(" "),
|
|
278
|
-
onSubmit: (event) => {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
278
|
+
onSubmit: async (event) => {
|
|
279
|
+
if (formInstance.saveInProgress()) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
formInstance.formState.set("saveInProgress", true);
|
|
284
|
+
event.preventDefault();
|
|
285
|
+
const formElement = event.currentTarget;
|
|
286
|
+
const buttonElement = event.nativeEvent instanceof SubmitEvent && event.nativeEvent.submitter instanceof HTMLButtonElement ? event.nativeEvent.submitter : void 0;
|
|
287
|
+
updateValidity(formInstance.getErrors(), buttonElement);
|
|
288
|
+
formElement.reportValidity();
|
|
289
|
+
const isValid = formInstance.validate();
|
|
290
|
+
if (isValid) {
|
|
291
|
+
await formProps.onSubmit?.(event, {
|
|
292
|
+
...formInstance,
|
|
293
|
+
...getDerivedState(formInstance)
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
} finally {
|
|
297
|
+
formInstance.formState.set("saveInProgress", false);
|
|
290
298
|
}
|
|
291
299
|
}
|
|
292
300
|
}
|
|
293
301
|
);
|
|
294
302
|
}
|
|
295
|
-
function getField(
|
|
296
|
-
|
|
303
|
+
function getField(form, path) {
|
|
304
|
+
const field = {
|
|
297
305
|
get originalValue() {
|
|
298
|
-
return original !== undefined ? get(original, path) : undefined;
|
|
306
|
+
return form.original !== undefined ? get(form.original, path) : undefined;
|
|
299
307
|
},
|
|
300
308
|
get value() {
|
|
301
|
-
const
|
|
302
|
-
return get(draft, path);
|
|
309
|
+
const draft = form.getDraft();
|
|
310
|
+
return get(draft ?? form.original ?? form.options.defaultValue, path);
|
|
303
311
|
},
|
|
304
312
|
setValue(update) {
|
|
305
|
-
|
|
313
|
+
form.formState.set("draft", (draft = form.original ?? form.options.defaultValue) => {
|
|
314
|
+
if (update instanceof Function) {
|
|
315
|
+
update = update(get(draft, path));
|
|
316
|
+
}
|
|
317
|
+
return set(draft, path, update);
|
|
318
|
+
});
|
|
306
319
|
},
|
|
307
320
|
get hasChange() {
|
|
308
321
|
return !deepEqual(this.originalValue, this.value);
|
|
309
322
|
},
|
|
310
323
|
get errors() {
|
|
311
|
-
const
|
|
324
|
+
const errors = form.getErrors();
|
|
312
325
|
return errors.get(path) ?? [];
|
|
313
326
|
},
|
|
314
327
|
get names() {
|
|
@@ -323,31 +336,38 @@ function getField(derivedState, original, path) {
|
|
|
323
336
|
},
|
|
324
337
|
add(...args) {
|
|
325
338
|
this.setValue((value) => {
|
|
326
|
-
if (
|
|
339
|
+
if (!value) {
|
|
340
|
+
throw new Error(`Cannot add element to ${JSON.stringify(value)}`);
|
|
341
|
+
}
|
|
342
|
+
if (Array.isArray(value)) {
|
|
327
343
|
return [...value ?? [], args[0]];
|
|
328
344
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
345
|
+
if (isObject(value)) {
|
|
346
|
+
return {
|
|
347
|
+
...value,
|
|
348
|
+
[args[0]]: args[1]
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
throw new Error(`Cannot add element to ${JSON.stringify(value)}`);
|
|
333
352
|
});
|
|
334
353
|
},
|
|
335
354
|
remove(key) {
|
|
336
355
|
this.setValue((value) => {
|
|
337
356
|
if (!value) {
|
|
338
|
-
|
|
357
|
+
throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);
|
|
339
358
|
}
|
|
340
359
|
if (Array.isArray(value)) {
|
|
341
|
-
return value.filter((_, index) => index !== key);
|
|
360
|
+
return value.filter((_, index) => index !== Number(key));
|
|
342
361
|
}
|
|
343
362
|
if (isObject(value)) {
|
|
344
363
|
const { [key]: _, ...rest } = value;
|
|
345
364
|
return rest;
|
|
346
365
|
}
|
|
347
|
-
|
|
366
|
+
throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);
|
|
348
367
|
});
|
|
349
368
|
}
|
|
350
369
|
};
|
|
370
|
+
return field;
|
|
351
371
|
}
|
|
352
372
|
function getErrors(draft, original, validations) {
|
|
353
373
|
const errors = /* @__PURE__ */ new Map();
|
|
@@ -375,6 +395,17 @@ function getErrors(draft, original, validations) {
|
|
|
375
395
|
}
|
|
376
396
|
return errors;
|
|
377
397
|
}
|
|
398
|
+
function getDerivedState(instance) {
|
|
399
|
+
return {
|
|
400
|
+
draft: instance.getDraft(),
|
|
401
|
+
hasTriggeredValidations: instance.hasTriggeredValidations(),
|
|
402
|
+
saveScheduled: instance.saveScheduled(),
|
|
403
|
+
saveInProgress: instance.saveInProgress(),
|
|
404
|
+
hasChanges: instance.hasChanges(),
|
|
405
|
+
errors: instance.getErrors(),
|
|
406
|
+
isValid: instance.isValid()
|
|
407
|
+
};
|
|
408
|
+
}
|
|
378
409
|
class Form {
|
|
379
410
|
constructor(options) {
|
|
380
411
|
this.options = options;
|
|
@@ -391,12 +422,11 @@ class Form {
|
|
|
391
422
|
useFormState(selector, useStoreOptions) {
|
|
392
423
|
const form = this.useForm();
|
|
393
424
|
return useStore(
|
|
394
|
-
form.
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
),
|
|
425
|
+
form.formState,
|
|
426
|
+
() => selector({
|
|
427
|
+
...form,
|
|
428
|
+
...getDerivedState(form)
|
|
429
|
+
}),
|
|
400
430
|
useStoreOptions
|
|
401
431
|
);
|
|
402
432
|
}
|
|
@@ -435,79 +465,61 @@ class Form {
|
|
|
435
465
|
saveInProgress: false
|
|
436
466
|
});
|
|
437
467
|
}, []);
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
hasChanges: !deepEqual(draft, original ?? options.defaultValue),
|
|
454
|
-
errors,
|
|
455
|
-
isValid: errors.size === 0
|
|
456
|
-
};
|
|
457
|
-
},
|
|
458
|
-
(newState) => ({
|
|
459
|
-
draft: newState.draft,
|
|
460
|
-
hasTriggeredValidations: newState.hasTriggeredValidations,
|
|
461
|
-
saveScheduled: newState.saveScheduled,
|
|
462
|
-
saveInProgress: newState.saveInProgress
|
|
463
|
-
})
|
|
464
|
-
);
|
|
465
|
-
}, [formState, original, options.validations, options.defaultValue]);
|
|
466
|
-
const context = useMemo(() => {
|
|
467
|
-
return {
|
|
468
|
-
formState,
|
|
469
|
-
derivedState,
|
|
470
|
-
options,
|
|
471
|
-
original,
|
|
472
|
-
getField(path) {
|
|
473
|
-
return getField(derivedState, original, path);
|
|
474
|
-
},
|
|
475
|
-
getDraft() {
|
|
476
|
-
return formState.get().draft ?? original ?? options.defaultValue;
|
|
477
|
-
},
|
|
478
|
-
hasTriggeredValidations() {
|
|
479
|
-
return formState.get().hasTriggeredValidations;
|
|
480
|
-
},
|
|
481
|
-
hasChanges() {
|
|
482
|
-
return derivedState.get().hasChanges;
|
|
483
|
-
},
|
|
484
|
-
getErrors() {
|
|
485
|
-
return derivedState.get().errors;
|
|
486
|
-
},
|
|
487
|
-
isValid() {
|
|
488
|
-
return derivedState.get().isValid;
|
|
489
|
-
},
|
|
490
|
-
validate() {
|
|
491
|
-
formState.set("hasTriggeredValidations", true);
|
|
492
|
-
return derivedState.get().isValid;
|
|
493
|
-
},
|
|
494
|
-
reset() {
|
|
495
|
-
formState.set("draft", undefined);
|
|
496
|
-
formState.set("hasTriggeredValidations", false);
|
|
497
|
-
}
|
|
498
|
-
};
|
|
499
|
-
}, [
|
|
468
|
+
let lastDraft;
|
|
469
|
+
const cache = /* @__PURE__ */ new Map();
|
|
470
|
+
function lazy(key, fn) {
|
|
471
|
+
if (lastDraft !== formState.get().draft) {
|
|
472
|
+
cache.clear();
|
|
473
|
+
lastDraft = formState.get().draft;
|
|
474
|
+
}
|
|
475
|
+
let value = cache.get(key);
|
|
476
|
+
if (!cache.has(key)) {
|
|
477
|
+
value = fn();
|
|
478
|
+
cache.set(key, value);
|
|
479
|
+
}
|
|
480
|
+
return value;
|
|
481
|
+
}
|
|
482
|
+
const context = {
|
|
500
483
|
formState,
|
|
501
|
-
|
|
484
|
+
options,
|
|
502
485
|
original,
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
486
|
+
getField() {
|
|
487
|
+
throw new Error("Not implemented");
|
|
488
|
+
},
|
|
489
|
+
getDraft() {
|
|
490
|
+
return formState.get().draft ?? original ?? options.defaultValue;
|
|
491
|
+
},
|
|
492
|
+
hasTriggeredValidations() {
|
|
493
|
+
return formState.get().hasTriggeredValidations;
|
|
494
|
+
},
|
|
495
|
+
saveScheduled() {
|
|
496
|
+
return formState.get().saveScheduled;
|
|
497
|
+
},
|
|
498
|
+
saveInProgress() {
|
|
499
|
+
return formState.get().saveInProgress;
|
|
500
|
+
},
|
|
501
|
+
hasChanges() {
|
|
502
|
+
return lazy(
|
|
503
|
+
"hasChanges",
|
|
504
|
+
() => !deepEqual(this.getDraft(), original ?? options.defaultValue)
|
|
505
|
+
);
|
|
506
|
+
},
|
|
507
|
+
getErrors() {
|
|
508
|
+
return lazy("getErrors", () => getErrors(this.getDraft(), original, options.validations));
|
|
509
|
+
},
|
|
510
|
+
isValid() {
|
|
511
|
+
return lazy("isValid", () => this.getErrors().size === 0);
|
|
512
|
+
},
|
|
513
|
+
validate() {
|
|
514
|
+
formState.set("hasTriggeredValidations", true);
|
|
515
|
+
return this.isValid();
|
|
516
|
+
},
|
|
517
|
+
reset() {
|
|
518
|
+
formState.set("draft", undefined);
|
|
519
|
+
formState.set("hasTriggeredValidations", false);
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
context.getField = (path) => lazy(path, () => getField(context, path));
|
|
511
523
|
useEffect(() => {
|
|
512
524
|
if (urlState) {
|
|
513
525
|
return connectUrl(
|
|
@@ -517,22 +529,6 @@ class Form {
|
|
|
517
529
|
}
|
|
518
530
|
return undefined;
|
|
519
531
|
}, [formState, simpleHash(urlState)]);
|
|
520
|
-
useEffect(() => {
|
|
521
|
-
const handles = options.transform?.map(({ trigger, update }) => {
|
|
522
|
-
const draft = derivedState.map("draft");
|
|
523
|
-
const triggerStore = trigger ? draft.map(trigger) : draft;
|
|
524
|
-
return triggerStore.subscribe(() => {
|
|
525
|
-
const value = trigger ? get(draft.get(), trigger) : draft.get();
|
|
526
|
-
const result = update(value, draft);
|
|
527
|
-
if (result !== undefined) {
|
|
528
|
-
draft.set(result);
|
|
529
|
-
}
|
|
530
|
-
});
|
|
531
|
-
});
|
|
532
|
-
return () => {
|
|
533
|
-
handles?.forEach((handle) => handle());
|
|
534
|
-
};
|
|
535
|
-
}, [options.transform]);
|
|
536
532
|
useFormAutosave(context);
|
|
537
533
|
return /* @__PURE__ */ jsx(this.context.Provider, { value: context, children: /* @__PURE__ */ jsx(FormContainer, { ...formProps, form: this }) });
|
|
538
534
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/react/form/customInput.tsx","../../../src/lib/wildcardMatch.ts","../../../src/react/form/formField.tsx","../../../src/react/form/formForEach.tsx","../../../src/react/form/useFormAutosave.ts","../../../src/react/form/form.tsx","../../../src/react/useDecoupledState.ts","../../../src/lib/castArray.ts","../../../src/react/useUrlParamScope.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CustomInputProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n children?: ReactNode;\n}\n\nexport function CustomInput({ name, children, ...props }: CustomInputProps): JSX.Element {\n return (\n <div\n {...props}\n style={{\n position: 'relative',\n ...props.style,\n }}\n >\n {children}\n\n <input\n name={name}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n opacity: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n />\n </div>\n );\n}\n","import { isObject } from '@lib/helpers';\nimport { type KeyType } from './path';\nimport { castArrayPath } from './propAccess';\n\nexport function wildcardMatch(s: KeyType[] | string, w: KeyType[] | string): boolean {\n if (typeof s === 'string') {\n s = castArrayPath(s);\n }\n\n if (typeof w === 'string') {\n w = castArrayPath(w);\n }\n\n return s.length === w.length && s.every((s, i) => w[i] === '*' || s === w[i]);\n}\n\nexport function getWildCardMatches(\n object: any,\n path: [KeyType, ...KeyType[]] | string,\n): Record<KeyType, any> {\n const matches: Record<KeyType, any> = {};\n const [first, second, ...rest] = castArrayPath(path);\n\n if (first === undefined) {\n throw new Error('Path is empty');\n }\n\n if (!Array.isArray(object) && !isObject(object)) {\n object = {};\n }\n\n for (const [key, value] of first !== '*' ? [[first, object[first]]] : Object.entries(object)) {\n if (first !== '*' && first !== key) {\n continue;\n }\n\n if (second === undefined) {\n matches[key] = value;\n continue;\n }\n\n for (const [subKey, subValue] of Object.entries(getWildCardMatches(value, [second, ...rest]))) {\n matches[`${key}.${subKey}`] = subValue;\n }\n }\n\n return matches;\n}\n","import { type PathAsString, type Value } from '@lib/path';\nimport {\n createElement,\n useEffect,\n useState,\n type Component,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { type Field, type Form, type FormInstance } from './form';\n\nexport interface FormFieldComponentProps<TValue, TPath> {\n name: TPath;\n value: TValue;\n onChange: (event: { target: { value: TValue } } | TValue | undefined, ...args: any[]) => void;\n onBlur: (...args: any[]) => void;\n}\n\nexport type FormFieldInfos<TDraft, TOriginal, TPath extends string> = Field<\n TDraft,\n TOriginal,\n TPath\n> & {\n hasTriggeredValidations: boolean;\n};\n\ntype NativeInputType = 'input' | 'select' | 'textarea';\n\ntype PartialComponentType<P> =\n | (new (props: P, context?: any) => Component<P, any>)\n | ((props: P, context?: any) => ReactNode);\n\nexport type FormFieldComponent = NativeInputType | PartialComponentType<any>;\n\ntype FieldValue<T extends FormFieldComponent> = ComponentPropsWithoutRef<T>['value'];\n\ntype FieldChangeValue<T extends FormFieldComponent> =\n ComponentPropsWithoutRef<T> extends {\n onChange?: (update: infer U) => void;\n }\n ? U extends { target: { value: infer V } }\n ? V\n : U\n : never;\n\ntype MakeOptional<T, Keys extends string> = Omit<T, Keys> & Partial<Pick<T, Keys & keyof T>>;\n\nexport type FormFieldProps<TPath, TDraft> = {\n name: TPath & PathAsString<TDraft>;\n commitOnBlur?: boolean;\n commitDebounce?: number;\n};\n\nexport type FormFieldPropsWithRender<TDraft, TOriginal, TPath extends string> = FormFieldProps<\n TPath,\n TDraft\n> &\n NoInfer<{\n component?: undefined;\n render: (\n props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n info: FormFieldInfos<TDraft, TOriginal, TPath>,\n ) => ReactNode;\n inputFilter?: undefined;\n defaultValue?: undefined;\n serialize?: undefined;\n deserialize?: undefined;\n onChange?: undefined;\n onBlur?: undefined;\n }>;\n\ntype Serialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: Value<TDraft, TPath>,\n formState: FormInstance<TDraft, TOriginal>,\n) => FieldValue<TComponent>;\n\ntype Deserialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: FieldChangeValue<TComponent>,\n formState: FormInstance<TDraft, TOriginal>,\n) => Value<TDraft, TPath>;\n\nexport type FormFieldPropsWithComponent<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n> = FormFieldProps<TPath, TDraft> & {\n component?: TComponent;\n render?: undefined;\n} & NoInfer<\n {\n inputFilter?: (value: FieldChangeValue<TComponent>) => boolean;\n } & MakeOptional<\n Omit<ComponentPropsWithoutRef<TComponent>, 'id' | 'name' | 'value' | 'defaultValue'>,\n 'onChange' | 'onBlur'\n > &\n (Value<TDraft, TPath> extends Exclude<FieldValue<TComponent>, undefined>\n ? {\n defaultValue?: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : Value<TDraft, TPath> extends FieldValue<TComponent>\n ?\n | {\n defaultValue: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n | {\n defaultValue?: FieldValue<TComponent>;\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }) &\n (FieldChangeValue<TComponent> extends Value<TDraft, TPath>\n ? {\n deserialize?: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n deserialize: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n })\n >;\n\nexport function FormField<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n>(\n this: Form<TDraft, any>,\n {\n // id,\n name = '' as any,\n component,\n commitOnBlur,\n commitDebounce,\n render,\n inputFilter,\n defaultValue,\n serialize,\n deserialize = (x) => x as Value<TDraft, TPath>,\n onChange,\n onBlur,\n ...restProps\n }:\n | FormFieldPropsWithRender<TDraft, TOriginal, TPath>\n | FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n): JSX.Element | null {\n type T = FieldChangeValue<TComponent>;\n\n const form = this.useForm();\n const getFormState = () => ({ ...form, ...form.derivedState.get() });\n const [localValue, setLocalValue] = useState<T>();\n\n const value = this.useFormState((form) => {\n const value = form.getField(name as any).value;\n if (serialize) {\n return serialize(value as any, getFormState());\n }\n if (value !== undefined) {\n return value;\n }\n return defaultValue;\n });\n\n const setValue = (x: FieldChangeValue<TComponent>) =>\n form.getField(name as any).setValue(deserialize(x, getFormState()));\n\n const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n useEffect(() => {\n if (localValue === undefined || !commitDebounce) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setValue(localValue);\n setLocalValue(undefined);\n }, commitDebounce);\n\n return () => clearTimeout(timeout);\n }, [localValue, commitDebounce]);\n\n const props = {\n name,\n value: localValue ?? value,\n onChange: (event: { target: { value: T } } | T, ...moreArgs: any[]) => {\n const value =\n typeof event === 'object' && event !== null && 'target' in event\n ? event.target.value\n : event;\n\n if (inputFilter && !inputFilter(value)) {\n return;\n }\n\n if (commitOnBlur || commitDebounce) {\n setLocalValue(value);\n } else {\n setValue(value);\n }\n\n onChange?.(event, ...moreArgs);\n },\n onBlur(...args: any[]) {\n if (localValue !== undefined) {\n setValue(localValue);\n setLocalValue(undefined);\n }\n\n onBlur?.(...args);\n },\n } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n if (render) {\n return (\n <>\n {render(props, { ...form.getField(name as any), hasTriggeredValidations } as any) ?? null}\n </>\n );\n }\n\n if (component) {\n return createElement(component, { ...restProps, ...props });\n }\n\n return null;\n}\n","import { type GetKeys, type Join, type PathAsString, type Value } from '@lib/path';\nimport { Fragment, useCallback, type ReactNode } from 'react';\nimport { type FieldHelperMethods, type Form } from './form';\n\nexport type ElementName<TDraft, TPath extends string> = keyof {\n [Path in TPath as Join<Path, GetKeys<NonNullable<Value<TDraft, Path>>> & (string | number)>]: 1;\n};\n\nexport interface FormForEachProps<TDraft, TPath extends string> {\n name: TPath & PathAsString<TDraft>;\n renderElement?: (props: {\n name: ElementName<TDraft, TPath>;\n key: `${GetKeys<NonNullable<Value<TDraft, TPath>>> & (string | number)}`;\n index: number;\n remove: () => void;\n }) => ReactNode;\n children?: (\n props: {\n setValue: (\n value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>),\n ) => void;\n } & FieldHelperMethods<TDraft, TPath>,\n ) => ReactNode;\n}\n\nexport function FormForEach<TDraft, TPath extends string>(\n this: Form<TDraft, any>,\n { name, renderElement, children }: FormForEachProps<TDraft, TPath>,\n): JSX.Element {\n const form = this.useForm();\n\n const names = this.useFormState(() => {\n const field = form.getField(name as any) as any;\n return field.names as any[];\n });\n\n const add = useCallback(\n (...args: any[]) => {\n const field = form.getField(name as any) as any;\n field.add(...args);\n },\n [form],\n );\n\n const remove = useCallback(\n (key: any) => {\n const field = form.getField(name as any) as any;\n field.remove(key);\n },\n [form],\n );\n\n const setValue = useCallback(\n (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => {\n const field = form.getField(name as any) as any;\n field.setValue(value);\n },\n [form],\n );\n\n return (\n <>\n {renderElement &&\n names.map((name, index) => {\n const key = name.split('.').pop();\n\n return (\n <Fragment key={key}>\n {renderElement({\n name,\n key,\n index,\n remove: () => remove(key),\n })}\n </Fragment>\n );\n })}\n\n {children?.({\n names,\n add,\n remove,\n setValue,\n } as any)}\n </>\n );\n}\n","import type { Duration } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { debounce } from '@lib/debounce';\nimport { deepEqual } from '@lib/equals';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { queue } from '@lib/queue';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { FormContext } from './form';\n\nexport interface FormAutosaveOptions<TDraft, TOriginal> {\n save: (draft: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;\n debounce?: Duration;\n resetAfterSave?: boolean;\n}\n\nexport function useFormAutosave<TDraft, TOriginal extends TDraft>(\n form: FormContext<TDraft, TOriginal>,\n): void {\n const { formState, options, getDraft } = form;\n const debounceTime = calcDuration(options.autoSave?.debounce ?? 2_000);\n const latestRef = useRef({ options });\n const lastValue = useRef<TDraft>();\n const q = useMemo(() => queue(), []);\n\n const run = useMemo(\n () =>\n debounce(async () => {\n const { options } = latestRef.current;\n const save = options.autoSave?.save;\n const draft = getDraft();\n\n lastValue.current = draft;\n\n q.clear();\n\n q(async () => {\n try {\n formState.set('saveInProgress', true);\n await save?.(draft, form);\n\n if (q.size === 0 && options.autoSave?.resetAfterSave) {\n form.reset();\n }\n } finally {\n formState.set('saveInProgress', false);\n\n if (q.size === 0) {\n formState.set('saveScheduled', false);\n }\n }\n });\n }, debounceTime),\n [formState, debounceTime],\n );\n\n useEffect(() => {\n if (!options.autoSave?.save) {\n return;\n }\n\n return formState\n .map((state) => state.draft)\n .subscribe(\n () => {\n if (deepEqual(getDraft(), lastValue.current)) {\n return;\n }\n\n run();\n formState.set('saveScheduled', true);\n },\n { runNow: false },\n );\n }, [formState]);\n\n useEffect(() => {\n latestRef.current = { options };\n });\n}\n","import { connectUrl, createStore, type Store, type Update, type UrlStoreOptions } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { deepEqual } from '@lib/equals';\nimport { simpleHash } from '@lib/hash';\nimport { isObject } from '@lib/helpers';\nimport {\n type Path,\n type PathAsString,\n type Value,\n type WildcardPathAsString,\n type WildcardValue,\n} from '@lib/path';\nimport { get, join } from '@lib/propAccess';\nimport type { Object_ } from '@lib/typeHelpers';\nimport { getWildCardMatches } from '@lib/wildcardMatch';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type Context,\n type FormEvent,\n type FunctionComponent,\n type HTMLProps,\n type ReactNode,\n} from 'react';\nimport { useStore, type UseStoreOptions } from '../useStore';\nimport {\n FormField,\n type FormFieldComponent,\n type FormFieldPropsWithComponent,\n type FormFieldPropsWithRender,\n} from './formField';\nimport { FormForEach, type ElementName, type FormForEachProps } from './formForEach';\nimport { useFormAutosave, type FormAutosaveOptions } from './useFormAutosave';\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Form types\n/// /////////////////////////////////////////////////////////////////////////////\n\nexport type Transform<TDraft> = Path<TDraft> | '' extends infer TPath\n ? TPath extends TPath\n ? {\n update: (value: Value<TDraft, TPath>, store: Store<TDraft>) => void | TDraft;\n } & (TPath extends '' ? { trigger?: '' } : { trigger: TPath })\n : never\n : never;\n\nexport interface FormOptions<TDraft, TOriginal> {\n defaultValue: TDraft;\n validations?: Validations<TDraft, TOriginal>;\n localizeError?: (error: string, field: string) => string | undefined;\n urlState?: boolean | UrlStoreOptions<TDraft>;\n autoSave?: FormAutosaveOptions<TDraft, TOriginal>;\n transform?: Transform<TDraft>[];\n validatedClass?: string;\n}\n\nexport type Validations<TDraft, TOriginal> = {\n [TPath in WildcardPathAsString<TDraft>]?: Record<string, Validation<TDraft, TOriginal, TPath>>;\n} & Record<string, Record<string, Validation<TDraft, TOriginal, any>>>;\n\nexport type Validation<TDraft, TOriginal, TPath> = (\n value: WildcardValue<TDraft, TPath>,\n context: {\n draft: TDraft;\n original: TOriginal;\n field: PathAsString<TDraft> | '';\n },\n) => boolean;\n\nexport type Field<TDraft, TOriginal, TPath extends string> = {\n originalValue: Value<TOriginal, TPath> | undefined;\n value: Value<TDraft, TPath>;\n setValue: (value: Update<Value<TDraft, TPath>>) => void;\n hasChange: boolean;\n errors: string[];\n} & (Value<TDraft, TPath> extends Object_ ? FieldHelperMethods<TDraft, TPath> : {});\n\nexport type FieldHelperMethods<TDraft, TPath extends string> = {\n names: ElementName<TDraft, TPath>[];\n add: NonNullable<Value<TDraft, TPath>> extends readonly (infer T)[]\n ? (element: T) => void\n : NonNullable<Value<TDraft, TPath>> extends Record<infer K, infer V>\n ? (key: K, value: V) => void\n : never;\n remove: Value<TDraft, TPath> extends readonly any[]\n ? (index: number) => void\n : (key: string) => void;\n};\n\nexport interface FormState<TDraft> {\n draft: TDraft | undefined;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n}\n\nexport interface FormDerivedState<TDraft> {\n draft: TDraft;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n hasChanges: boolean;\n errors: Map<string, string[]>;\n isValid: boolean;\n}\n\nexport interface FormContext<TDraft, TOriginal> {\n formState: Store<FormState<TDraft>>;\n derivedState: Store<FormDerivedState<TDraft>>;\n options: FormOptions<TDraft, TOriginal>;\n original: TOriginal | undefined;\n getField: <TPath extends string>(path: TPath) => Field<TDraft, TOriginal, TPath>;\n getDraft: () => TDraft;\n hasTriggeredValidations: () => boolean;\n hasChanges: () => boolean;\n getErrors: () => Map<string, string[]>;\n isValid: () => boolean;\n validate: () => boolean;\n reset: () => void;\n}\n\nexport interface FormInstance<TDraft, TOriginal>\n extends FormDerivedState<TDraft>,\n Pick<\n FormContext<TDraft, TOriginal>,\n 'options' | 'original' | 'getField' | 'validate' | 'reset'\n > {}\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Implementation\n/// /////////////////////////////////////////////////////////////////////////////\n\nfunction FormContainer({\n form,\n ...formProps\n}: {\n form: Form<any, any>;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<any, any>) => void;\n} & Omit<HTMLProps<HTMLFormElement>, 'form' | 'onSubmit'>) {\n const formInstance = form.useForm();\n const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n function updateValidity(errors: Map<string, string[]>, buttonElement?: HTMLButtonElement) {\n const formElement = formRef.current;\n if (!formElement) {\n return;\n }\n\n const localizedErrors = new Map(\n [...errors.entries()].map(\n ([field, errors]) =>\n [\n field,\n errors.map((error) => formInstance.options.localizeError?.(error, field) ?? error),\n ] as const,\n ),\n );\n\n for (const element of Array.from(formElement.elements)) {\n if ('name' in element && 'setCustomValidity' in element) {\n (element as HTMLObjectElement).setCustomValidity(\n localizedErrors.get((element as HTMLObjectElement).name)?.join('\\n') ?? '',\n );\n }\n }\n\n if (buttonElement && 'setCustomValidity' in buttonElement) {\n const errorString = [...errors.values()].flat().join('\\n');\n\n buttonElement.setCustomValidity(errorString);\n }\n }\n\n useEffect(() => {\n return formInstance.derivedState.map('errors').subscribe((errors) => updateValidity(errors));\n }, [formInstance.derivedState]);\n\n return (\n <form\n ref={formRef}\n noValidate\n {...formProps}\n className={[\n formProps.className,\n hasTriggeredValidations ? (formInstance.options.validatedClass ?? 'validated') : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onSubmit={(event) => {\n event.preventDefault();\n\n const formElement = event.currentTarget;\n const buttonElement =\n event.nativeEvent instanceof SubmitEvent &&\n event.nativeEvent.submitter instanceof HTMLButtonElement\n ? event.nativeEvent.submitter\n : undefined;\n\n updateValidity(formInstance.derivedState.get().errors, buttonElement);\n\n formElement.reportValidity();\n\n const isValid = formInstance.validate();\n if (isValid) {\n formProps.onSubmit?.(event, {\n ...formInstance,\n ...formInstance.derivedState.get(),\n });\n }\n }}\n />\n );\n}\n\nfunction getField<TDraft, TOriginal extends TDraft, TPath extends string>(\n derivedState: Store<FormDerivedState<TDraft>>,\n original: TOriginal | undefined,\n path: TPath,\n): Field<TDraft, TOriginal, TPath> {\n return {\n get originalValue() {\n return original !== undefined ? get(original as any, path as any) : undefined;\n },\n\n get value() {\n const { draft } = derivedState.get();\n return get(draft, path as any);\n },\n\n setValue(update: any) {\n derivedState.set(join('draft', path) as any, update);\n },\n\n get hasChange() {\n return !deepEqual(this.originalValue, this.value);\n },\n\n get errors() {\n const { errors } = derivedState.get();\n return errors.get(path) ?? [];\n },\n\n get names(): any {\n const { value } = this;\n\n if (Array.isArray(value)) {\n return value.map((_, index) => join(path, String(index)));\n }\n\n if (isObject(value)) {\n return Object.keys(value).map((key) => join(path, key));\n }\n\n return [];\n },\n\n add(...args: any[]) {\n this.setValue((value: any) => {\n if (args.length === 1) {\n return [...(value ?? []), args[0]];\n }\n\n return {\n ...value,\n [args[0]]: args[1],\n };\n });\n },\n\n remove(key: any) {\n this.setValue((value: any) => {\n if (!value) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.filter((_, index) => index !== key);\n }\n\n if (isObject(value)) {\n const { [key]: _, ...rest } = value;\n return rest;\n }\n\n return value;\n });\n },\n } as any;\n}\n\nfunction getErrors<TDraft, TOriginal>(\n draft: TDraft,\n original: TOriginal | undefined,\n validations: FormOptions<TDraft, TOriginal>['validations'],\n) {\n const errors = new Map<string, string[]>();\n\n for (const [path, block] of Object.entries(validations ?? {})) {\n for (const [validationName, validate] of Object.entries(\n block as Record<string, Validation<any, any, any>>,\n )) {\n let matched = false;\n\n for (const [field, value] of Object.entries(getWildCardMatches(draft, path))) {\n matched = true;\n if (!validate(value, { draft, original, field })) {\n const fieldErrors = errors.get(field) ?? [];\n fieldErrors.push(validationName);\n errors.set(field, fieldErrors);\n }\n }\n\n if (!matched && !path.includes('*')) {\n if (!validate(undefined, { draft, original, field: path })) {\n const fieldErrors = errors.get(path) ?? [];\n fieldErrors.push(validationName);\n errors.set(path, fieldErrors);\n }\n }\n }\n }\n\n return errors;\n}\n\nexport class Form<TDraft, TOriginal extends TDraft = TDraft> {\n context: Context<FormContext<TDraft, TOriginal> | null> = createContext<FormContext<\n TDraft,\n TOriginal\n > | null>(null);\n\n constructor(public readonly options: FormOptions<TDraft, TOriginal>) {\n autobind(Form);\n }\n\n useForm(): FormContext<TDraft, TOriginal> {\n const context = useContext(this.context);\n\n if (!context) {\n throw new Error('Form context not found');\n }\n\n return context;\n }\n\n useFormState<S>(\n selector: (state: FormInstance<TDraft, TOriginal>) => S,\n useStoreOptions?: UseStoreOptions<S>,\n ): S {\n const form = this.useForm();\n\n return useStore(\n form.derivedState.map((state) =>\n selector({\n ...form,\n ...state,\n }),\n ),\n useStoreOptions,\n );\n }\n\n useField<TPath extends string>(\n path: TPath,\n useStoreOptions?: UseStoreOptions<any>,\n ): Field<TDraft, TOriginal, TPath> {\n const form = this.useForm();\n this.useFormState((form) => [form.getField(path).value, form.original], useStoreOptions);\n return form.getField(path);\n }\n\n // ///////////////////////////////////////////////////////////////////////////\n // React Components\n // ///////////////////////////////////////////////////////////////////////////\n\n Form({\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ...formProps\n }: {\n original?: TOriginal;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<TDraft, TOriginal>) => void;\n } & Partial<FormOptions<TDraft, TOriginal>> &\n Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave' | 'onSubmit'>): JSX.Element {\n const options: FormOptions<TDraft, TOriginal> = {\n defaultValue: { ...this.options.defaultValue, ...defaultValue },\n validations: { ...this.options.validations, ...validations } as Validations<\n TDraft,\n TOriginal\n >,\n localizeError: localizeError ?? this.options.localizeError,\n autoSave: autoSave ?? this.options.autoSave,\n transform: transform ?? this.options.transform,\n validatedClass: validatedClass ?? this.options.validatedClass,\n };\n\n const formState = useMemo(() => {\n return createStore<FormState<TDraft>>({\n draft: undefined,\n hasTriggeredValidations: false,\n saveScheduled: false,\n saveInProgress: false,\n });\n }, []);\n\n const derivedState = useMemo(() => {\n return formState.map<FormDerivedState<TDraft>>(\n (state) => {\n const {\n draft = original ?? options.defaultValue,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n } = state;\n const errors = getErrors(draft, original, options.validations);\n\n return {\n draft,\n hasTriggeredValidations,\n saveScheduled,\n saveInProgress,\n hasChanges: !deepEqual(draft, original ?? options.defaultValue),\n errors,\n isValid: errors.size === 0,\n };\n },\n (newState) => ({\n draft: newState.draft,\n hasTriggeredValidations: newState.hasTriggeredValidations,\n saveScheduled: newState.saveScheduled,\n saveInProgress: newState.saveInProgress,\n }),\n );\n }, [formState, original, options.validations, options.defaultValue]);\n\n const context = useMemo(() => {\n return {\n formState,\n derivedState,\n options,\n original,\n\n getField(path) {\n return getField(derivedState, original, path);\n },\n\n getDraft() {\n return formState.get().draft ?? original ?? options.defaultValue;\n },\n\n hasTriggeredValidations() {\n return formState.get().hasTriggeredValidations;\n },\n\n hasChanges() {\n return derivedState.get().hasChanges;\n },\n\n getErrors() {\n return derivedState.get().errors;\n },\n\n isValid() {\n return derivedState.get().isValid;\n },\n\n validate() {\n formState.set('hasTriggeredValidations', true);\n return derivedState.get().isValid;\n },\n\n reset() {\n formState.set('draft', undefined);\n formState.set('hasTriggeredValidations', false);\n },\n } satisfies FormContext<TDraft, TOriginal>;\n }, [\n formState,\n derivedState,\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ]);\n\n useEffect(() => {\n if (urlState) {\n return connectUrl(\n formState.map('draft'),\n typeof urlState === 'object' ? urlState : { key: 'form' },\n );\n }\n\n return undefined;\n }, [formState, simpleHash(urlState)]);\n\n useEffect(() => {\n const handles = options.transform?.map(({ trigger, update }) => {\n const draft = derivedState.map('draft');\n const triggerStore = trigger ? draft.map(trigger as any) : draft;\n\n return triggerStore.subscribe(() => {\n const value = trigger ? get(draft.get(), trigger as any) : draft.get();\n const result = update(value as any, draft);\n\n if (result !== undefined) {\n draft.set(result);\n }\n });\n });\n\n return () => {\n handles?.forEach((handle) => handle());\n };\n }, [options.transform]);\n\n useFormAutosave(context);\n\n return (\n <this.context.Provider value={context}>\n <FormContainer {...formProps} form={this} />\n </this.context.Provider>\n );\n }\n\n FormState<S>({\n selector,\n children,\n }: {\n selector: (form: FormInstance<TDraft, TOriginal>) => S;\n children: (selectedState: S) => ReactNode;\n }): JSX.Element {\n const selectedState = this.useFormState(selector);\n return <>{children(selectedState)}</>;\n }\n\n Field<const TPath extends string>(\n props: FormFieldPropsWithRender<TDraft, TOriginal, TPath>,\n ): JSX.Element;\n\n Field<const TPath extends string, const TComponent extends FormFieldComponent = 'input'>(\n props: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n ): JSX.Element;\n\n Field(props: any): JSX.Element {\n return Reflect.apply(FormField, this, [{ component: 'input', ...props }]);\n }\n\n ForEach<const TPath extends string>(props: FormForEachProps<TDraft, TPath>): JSX.Element {\n return Reflect.apply(FormForEach, this, [props]);\n }\n\n withForm<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n formProps?: Parameters<this['Form']>[0],\n ): FunctionComponent<TProps> {\n const { Form } = this;\n return function FormWrapper(props: TProps) {\n return (\n <Form {...formProps}>\n <Component {...props} />\n </Form>\n );\n };\n }\n}\n\nexport function createForm<TDraft, TOriginal extends TDraft = TDraft>(\n options: FormOptions<TDraft, TOriginal>,\n): Form<TDraft, TOriginal> {\n return new Form(options);\n}\n","import { startTransition, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport { simpleHash } from '@lib/hash';\nimport { throttle } from '@lib/throttle';\n\nexport interface UseDecoupledStateOptions<T> {\n debounce?: Duration;\n throttle?: Duration;\n onCommit?: (value: T) => void;\n}\n\nexport function useDecoupledState<T>(\n value: T,\n onChange: (value: T) => void,\n options: UseDecoupledStateOptions<T> = {},\n): [state: T, setState: (value: T) => void] {\n const [dirty, setDirty] = useState<{ v: T }>();\n const ref = useRef({ onChange, onCommit: options.onCommit });\n\n useEffect(() => {\n ref.current = { onChange, onCommit: options.onCommit };\n }, [onChange]);\n\n const update = useMemo(() => {\n const { onChange, onCommit } = ref.current;\n\n const update = (value: T) => {\n onChange(value);\n setDirty(undefined);\n onCommit?.(value);\n };\n\n let delayedUpdate: (value: T) => void;\n\n if (options.debounce) {\n delayedUpdate = debounce(update, options.debounce);\n } else if (options.throttle) {\n delayedUpdate = throttle(update, options.throttle);\n } else {\n delayedUpdate = (value) => startTransition(() => update(value));\n }\n\n return (value: T) => {\n setDirty({ v: value });\n delayedUpdate(value);\n };\n }, [simpleHash([options.debounce, options.throttle])]);\n\n return [dirty ? dirty.v : value, update];\n}\n","export function castArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n","import { castArray } from '@lib/castArray';\nimport { simpleHash } from '@lib/hash';\nimport { useEffect } from 'react';\n\nexport function useUrlParamScope({\n key,\n type = 'search',\n}: {\n key: string | string[];\n type?: 'search' | 'hash';\n}): void {\n useEffect(\n () => () => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n\n for (const _key of castArray(key)) {\n parameters.delete(_key);\n }\n\n url[type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n },\n [simpleHash(key), type],\n );\n}\n"],"names":["form","value","name","Fragment","options","errors","Form","onChange","update"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/react/form/customInput.tsx","../../../src/lib/wildcardMatch.ts","../../../src/react/form/formField.tsx","../../../src/react/form/formForEach.tsx","../../../src/react/form/useFormAutosave.ts","../../../src/react/form/form.tsx","../../../src/react/useDecoupledState.ts","../../../src/lib/castArray.ts","../../../src/react/useUrlParamScope.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CustomInputProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n children?: ReactNode;\n}\n\nexport function CustomInput({ name, children, ...props }: CustomInputProps): JSX.Element {\n return (\n <div\n {...props}\n style={{\n position: 'relative',\n ...props.style,\n }}\n >\n {children}\n\n <input\n name={name}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n opacity: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }}\n />\n </div>\n );\n}\n","import { isObject } from '@lib/helpers';\nimport { type KeyType } from './path';\nimport { castArrayPath } from './propAccess';\n\nexport function wildcardMatch(s: KeyType[] | string, w: KeyType[] | string): boolean {\n if (typeof s === 'string') {\n s = castArrayPath(s);\n }\n\n if (typeof w === 'string') {\n w = castArrayPath(w);\n }\n\n return s.length === w.length && s.every((s, i) => w[i] === '*' || s === w[i]);\n}\n\nexport function getWildCardMatches(\n object: any,\n path: [KeyType, ...KeyType[]] | string,\n): Record<KeyType, any> {\n const matches: Record<KeyType, any> = {};\n const [first, second, ...rest] = castArrayPath(path);\n\n if (first === undefined) {\n throw new Error('Path is empty');\n }\n\n if (!Array.isArray(object) && !isObject(object)) {\n object = {};\n }\n\n for (const [key, value] of first !== '*' ? [[first, object[first]]] : Object.entries(object)) {\n if (first !== '*' && first !== key) {\n continue;\n }\n\n if (second === undefined) {\n matches[key] = value;\n continue;\n }\n\n for (const [subKey, subValue] of Object.entries(getWildCardMatches(value, [second, ...rest]))) {\n matches[`${key}.${subKey}`] = subValue;\n }\n }\n\n return matches;\n}\n","import { type PathAsString, type Value } from '@lib/path';\nimport {\n createElement,\n useEffect,\n useState,\n type Component,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { getDerivedState, type Field, type Form, type FormInstance } from './form';\n\nexport interface FormFieldComponentProps<TValue, TPath> {\n name: TPath;\n value: TValue;\n onChange: (event: { target: { value: TValue } } | TValue | undefined, ...args: any[]) => void;\n onBlur: (...args: any[]) => void;\n}\n\nexport type FormFieldInfos<TDraft, TOriginal, TPath extends string> = Field<\n TDraft,\n TOriginal,\n TPath\n> & {\n hasTriggeredValidations: boolean;\n};\n\ntype NativeInputType = 'input' | 'select' | 'textarea';\n\ntype PartialComponentType<P> =\n | (new (props: P, context?: any) => Component<P, any>)\n | ((props: P, context?: any) => ReactNode);\n\nexport type FormFieldComponent = NativeInputType | PartialComponentType<any>;\n\ntype FieldValue<T extends FormFieldComponent> = ComponentPropsWithoutRef<T>['value'];\n\ntype FieldChangeValue<T extends FormFieldComponent> =\n ComponentPropsWithoutRef<T> extends {\n onChange?: (update: infer U) => void;\n }\n ? U extends { target: { value: infer V } }\n ? V\n : U\n : never;\n\ntype MakeOptional<T, Keys extends string> = Omit<T, Keys> & Partial<Pick<T, Keys & keyof T>>;\n\nexport type FormFieldProps<TPath, TDraft> = {\n name: TPath & PathAsString<TDraft>;\n commitOnBlur?: boolean;\n commitDebounce?: number;\n};\n\nexport type FormFieldPropsWithRender<TDraft, TOriginal, TPath extends string> = FormFieldProps<\n TPath,\n TDraft\n> &\n NoInfer<{\n component?: undefined;\n render: (\n props: FormFieldComponentProps<Value<TDraft, TPath>, TPath>,\n info: FormFieldInfos<TDraft, TOriginal, TPath>,\n ) => ReactNode;\n inputFilter?: undefined;\n defaultValue?: undefined;\n serialize?: undefined;\n deserialize?: undefined;\n onChange?: undefined;\n onBlur?: undefined;\n }>;\n\ntype Serialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: Value<TDraft, TPath>,\n formState: FormInstance<TDraft, TOriginal>,\n) => FieldValue<TComponent>;\n\ntype Deserialize<TDraft, TOriginal, TPath, TComponent extends FormFieldComponent> = (\n value: FieldChangeValue<TComponent>,\n formState: FormInstance<TDraft, TOriginal>,\n) => Value<TDraft, TPath>;\n\nexport type FormFieldPropsWithComponent<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n> = FormFieldProps<TPath, TDraft> & {\n component?: TComponent;\n render?: undefined;\n} & NoInfer<\n {\n inputFilter?: (value: FieldChangeValue<TComponent>) => boolean;\n } & MakeOptional<\n Omit<ComponentPropsWithoutRef<TComponent>, 'id' | 'name' | 'value' | 'defaultValue'>,\n 'onChange' | 'onBlur'\n > &\n (Value<TDraft, TPath> extends Exclude<FieldValue<TComponent>, undefined>\n ? {\n defaultValue?: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : Value<TDraft, TPath> extends FieldValue<TComponent>\n ?\n | {\n defaultValue: FieldValue<TComponent>;\n serialize?: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n | {\n defaultValue?: FieldValue<TComponent>;\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n serialize: Serialize<TDraft, TOriginal, TPath, TComponent>;\n }) &\n (FieldChangeValue<TComponent> extends Value<TDraft, TPath>\n ? {\n deserialize?: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n }\n : {\n deserialize: Deserialize<TDraft, TOriginal, TPath, TComponent>;\n })\n >;\n\nexport function FormField<\n TDraft,\n TOriginal,\n TPath extends string,\n TComponent extends FormFieldComponent,\n>(\n this: Form<TDraft, any>,\n {\n // id,\n name = '' as any,\n component,\n commitOnBlur,\n commitDebounce,\n render,\n inputFilter,\n defaultValue,\n serialize,\n deserialize = (x) => x as Value<TDraft, TPath>,\n onChange,\n onBlur,\n ...restProps\n }:\n | FormFieldPropsWithRender<TDraft, TOriginal, TPath>\n | FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n): JSX.Element | null {\n type T = FieldChangeValue<TComponent>;\n\n const form = this.useForm();\n const getFormState = () => ({ ...form, ...getDerivedState(form) });\n const [localValue, setLocalValue] = useState<T>();\n\n const value = this.useFormState((form) => {\n const value = form.getField(name as any).value;\n if (serialize) {\n return serialize(value as any, getFormState());\n }\n if (value !== undefined) {\n return value;\n }\n return defaultValue;\n });\n\n const setValue = (x: FieldChangeValue<TComponent>) =>\n form.getField(name as any).setValue(deserialize(x, getFormState()));\n\n const hasTriggeredValidations = this.useFormState((form) => form.hasTriggeredValidations);\n\n useEffect(() => {\n if (localValue === undefined || !commitDebounce) {\n return;\n }\n\n const timeout = setTimeout(() => {\n setValue(localValue);\n setLocalValue(undefined);\n }, commitDebounce);\n\n return () => clearTimeout(timeout);\n }, [localValue, commitDebounce]);\n\n const props = {\n name,\n value: localValue ?? value,\n onChange: (event: { target: { value: T } } | T, ...moreArgs: any[]) => {\n const value =\n typeof event === 'object' && event !== null && 'target' in event\n ? event.target.value\n : event;\n\n if (inputFilter && !inputFilter(value)) {\n return;\n }\n\n if (commitOnBlur || commitDebounce) {\n setLocalValue(value);\n } else {\n setValue(value);\n }\n\n onChange?.(event, ...moreArgs);\n },\n onBlur(...args: any[]) {\n if (localValue !== undefined) {\n setValue(localValue);\n setLocalValue(undefined);\n }\n\n onBlur?.(...args);\n },\n } as FormFieldComponentProps<Value<TDraft, TPath>, TPath>;\n\n if (render) {\n return (\n <>\n {render(props, { ...form.getField(name as any), hasTriggeredValidations } as any) ?? null}\n </>\n );\n }\n\n if (component) {\n return createElement(component, { ...restProps, ...props });\n }\n\n return null;\n}\n","import { type GetKeys, type Join, type PathAsString, type Value } from '@lib/path';\nimport { Fragment, useCallback, type ReactNode } from 'react';\nimport { type FieldHelperMethods, type Form } from './form';\n\nexport type ElementName<TDraft, TPath extends string> = keyof {\n [Path in TPath as Join<Path, GetKeys<NonNullable<Value<TDraft, Path>>> & (string | number)>]: 1;\n};\n\nexport interface FormForEachProps<TDraft, TPath extends string> {\n name: TPath & PathAsString<TDraft>;\n renderElement?: (props: {\n name: ElementName<TDraft, TPath>;\n key: `${GetKeys<NonNullable<Value<TDraft, TPath>>> & (string | number)}`;\n index: number;\n remove: () => void;\n }) => ReactNode;\n children?: (\n props: {\n setValue: (\n value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>),\n ) => void;\n } & FieldHelperMethods<TDraft, TPath>,\n ) => ReactNode;\n}\n\nexport function FormForEach<TDraft, TPath extends string>(\n this: Form<TDraft, any>,\n { name, renderElement, children }: FormForEachProps<TDraft, TPath>,\n): JSX.Element {\n const form = this.useForm();\n\n const names = this.useFormState(() => {\n const field = form.getField(name as any) as any;\n return field.names as any[];\n });\n\n const add = useCallback(\n (...args: any[]) => {\n const field = form.getField(name as any) as any;\n field.add(...args);\n },\n [form],\n );\n\n const remove = useCallback(\n (key: any) => {\n const field = form.getField(name as any) as any;\n field.remove(key);\n },\n [form],\n );\n\n const setValue = useCallback(\n (value: Value<TDraft, TPath> | ((value: Value<TDraft, TPath>) => Value<TDraft, TPath>)) => {\n const field = form.getField(name as any) as any;\n field.setValue(value);\n },\n [form],\n );\n\n return (\n <>\n {renderElement &&\n names.map((name, index) => {\n const key = name.split('.').pop();\n\n return (\n <Fragment key={key}>\n {renderElement({\n name,\n key,\n index,\n remove: () => remove(key),\n })}\n </Fragment>\n );\n })}\n\n {children?.({\n names,\n add,\n remove,\n setValue,\n } as any)}\n </>\n );\n}\n","import type { Duration } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { debounce } from '@lib/debounce';\nimport { deepEqual } from '@lib/equals';\nimport type { MaybePromise } from '@lib/maybePromise';\nimport { queue } from '@lib/queue';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { FormContext } from './form';\n\nexport interface FormAutosaveOptions<TDraft, TOriginal> {\n save: (draft: TDraft, form: FormContext<TDraft, TOriginal>) => MaybePromise<void>;\n debounce?: Duration;\n resetAfterSave?: boolean;\n}\n\nexport function useFormAutosave<TDraft, TOriginal extends TDraft>(\n form: FormContext<TDraft, TOriginal>,\n): void {\n const { formState, options, getDraft } = form;\n const debounceTime = calcDuration(options.autoSave?.debounce ?? 2_000);\n const latestRef = useRef({ options });\n const lastValue = useRef<TDraft>();\n const q = useMemo(() => queue(), []);\n\n const run = useMemo(\n () =>\n debounce(async () => {\n const { options } = latestRef.current;\n const save = options.autoSave?.save;\n const draft = getDraft();\n\n lastValue.current = draft;\n\n q.clear();\n\n q(async () => {\n try {\n formState.set('saveInProgress', true);\n await save?.(draft, form);\n\n if (q.size === 0 && options.autoSave?.resetAfterSave) {\n form.reset();\n }\n } finally {\n formState.set('saveInProgress', false);\n\n if (q.size === 0) {\n formState.set('saveScheduled', false);\n }\n }\n });\n }, debounceTime),\n [formState, debounceTime],\n );\n\n useEffect(() => {\n if (!options.autoSave?.save) {\n return;\n }\n\n return formState\n .map((state) => state.draft)\n .subscribe(\n () => {\n if (deepEqual(getDraft(), lastValue.current)) {\n return;\n }\n\n run();\n formState.set('saveScheduled', true);\n },\n { runNow: false },\n );\n }, [formState]);\n\n useEffect(() => {\n latestRef.current = { options };\n });\n}\n","import { connectUrl, createStore, type Store, type Update, type UrlStoreOptions } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { deepEqual } from '@lib/equals';\nimport { simpleHash } from '@lib/hash';\nimport { isObject } from '@lib/helpers';\nimport {\n type Path,\n type PathAsString,\n type Value,\n type WildcardPathAsString,\n type WildcardValue,\n} from '@lib/path';\nimport { get, join, set } from '@lib/propAccess';\nimport type { Object_ } from '@lib/typeHelpers';\nimport { getWildCardMatches } from '@lib/wildcardMatch';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type Context,\n type FormEvent,\n type FunctionComponent,\n type HTMLProps,\n type ReactNode,\n} from 'react';\nimport { useStore, type UseStoreOptions } from '../useStore';\nimport {\n FormField,\n type FormFieldComponent,\n type FormFieldPropsWithComponent,\n type FormFieldPropsWithRender,\n} from './formField';\nimport { FormForEach, type ElementName, type FormForEachProps } from './formForEach';\nimport { useFormAutosave, type FormAutosaveOptions } from './useFormAutosave';\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Form types\n/// /////////////////////////////////////////////////////////////////////////////\n\nexport type Transform<TDraft> = Path<TDraft> | '' extends infer TPath\n ? TPath extends TPath\n ? {\n update: (value: Value<TDraft, TPath>, store: Store<TDraft>) => void | TDraft;\n } & (TPath extends '' ? { trigger?: '' } : { trigger: TPath })\n : never\n : never;\n\nexport interface FormOptions<TDraft, TOriginal> {\n defaultValue: TDraft;\n validations?: Validations<TDraft, TOriginal>;\n localizeError?: (error: string, field: string) => string | undefined;\n urlState?: boolean | UrlStoreOptions<TDraft>;\n autoSave?: FormAutosaveOptions<TDraft, TOriginal>;\n transform?: Transform<TDraft>[];\n validatedClass?: string;\n}\n\nexport type Validations<TDraft, TOriginal> = {\n [TPath in WildcardPathAsString<TDraft>]?: Record<string, Validation<TDraft, TOriginal, TPath>>;\n} & Record<string, Record<string, Validation<TDraft, TOriginal, any>>>;\n\nexport type Validation<TDraft, TOriginal, TPath> = (\n value: WildcardValue<TDraft, TPath>,\n context: {\n draft: TDraft;\n original: TOriginal;\n field: PathAsString<TDraft> | '';\n },\n) => boolean;\n\nexport type Field<TDraft, TOriginal, TPath extends string> = {\n originalValue: Value<TOriginal, TPath> | undefined;\n value: Value<TDraft, TPath>;\n setValue: (value: Update<Value<TDraft, TPath>>) => void;\n hasChange: boolean;\n errors: string[];\n} & (Value<TDraft, TPath> extends Object_ ? FieldHelperMethods<TDraft, TPath> : {});\n\nexport type FieldHelperMethods<TDraft, TPath extends string> = {\n names: ElementName<TDraft, TPath>[];\n add: NonNullable<Value<TDraft, TPath>> extends readonly (infer T)[]\n ? (element: T) => void\n : NonNullable<Value<TDraft, TPath>> extends Record<infer K, infer V>\n ? (key: K, value: V) => void\n : never;\n remove: Value<TDraft, TPath> extends readonly any[]\n ? (index: number) => void\n : (key: string) => void;\n};\n\nexport interface FormState<TDraft> {\n draft: TDraft | undefined;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n}\n\nexport interface FormDerivedState<TDraft> {\n draft: TDraft;\n hasTriggeredValidations: boolean;\n saveScheduled: boolean;\n saveInProgress: boolean;\n hasChanges: boolean;\n errors: Map<string, string[]>;\n isValid: boolean;\n}\n\nexport interface FormContext<TDraft, TOriginal> {\n formState: Store<FormState<TDraft>>;\n options: FormOptions<TDraft, TOriginal>;\n original: TOriginal | undefined;\n getField: <TPath extends string>(path: TPath) => Field<TDraft, TOriginal, TPath>;\n getDraft: () => TDraft;\n hasTriggeredValidations: () => boolean;\n saveScheduled: () => boolean;\n saveInProgress: () => boolean;\n hasChanges: () => boolean;\n getErrors: () => Map<string, string[]>;\n isValid: () => boolean;\n validate: () => boolean;\n reset: () => void;\n}\n\nexport interface FormInstance<TDraft, TOriginal>\n extends FormDerivedState<TDraft>,\n Pick<\n FormContext<TDraft, TOriginal>,\n 'options' | 'original' | 'getField' | 'validate' | 'reset'\n > {}\n\n/// /////////////////////////////////////////////////////////////////////////////\n// Implementation\n/// /////////////////////////////////////////////////////////////////////////////\n\nfunction FormContainer({\n form,\n ...formProps\n}: {\n form: Form<any, any>;\n onSubmit?: (\n event: FormEvent<HTMLFormElement>,\n form: FormInstance<any, any>,\n ) => void | Promise<void>;\n} & Omit<HTMLProps<HTMLFormElement>, 'form' | 'onSubmit'>) {\n const formInstance = form.useForm();\n const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);\n\n const formRef = useRef<HTMLFormElement>(null);\n\n function updateValidity(errors: Map<string, string[]>, buttonElement?: HTMLButtonElement) {\n const formElement = formRef.current;\n if (!formElement) {\n return;\n }\n\n const localizedErrors = new Map(\n [...errors.entries()].map(\n ([field, errors]) =>\n [\n field,\n errors.map((error) => formInstance.options.localizeError?.(error, field) ?? error),\n ] as const,\n ),\n );\n\n for (const element of Array.from(formElement.elements)) {\n if ('name' in element && 'setCustomValidity' in element) {\n (element as HTMLObjectElement).setCustomValidity(\n localizedErrors.get((element as HTMLObjectElement).name)?.join('\\n') ?? '',\n );\n }\n }\n\n if (buttonElement && 'setCustomValidity' in buttonElement) {\n const errorString = [...errors.values()].flat().join('\\n');\n\n buttonElement.setCustomValidity(errorString);\n }\n }\n\n useEffect(() => {\n return formInstance.formState\n .map(() => formInstance.getErrors())\n .subscribe((errors) => updateValidity(errors));\n }, []);\n\n return (\n <form\n ref={formRef}\n noValidate\n {...formProps}\n className={[\n formProps.className,\n hasTriggeredValidations ? (formInstance.options.validatedClass ?? 'validated') : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onSubmit={async (event) => {\n if (formInstance.saveInProgress()) {\n return;\n }\n\n try {\n formInstance.formState.set('saveInProgress', true);\n event.preventDefault();\n\n const formElement = event.currentTarget;\n const buttonElement =\n event.nativeEvent instanceof SubmitEvent &&\n event.nativeEvent.submitter instanceof HTMLButtonElement\n ? event.nativeEvent.submitter\n : undefined;\n\n updateValidity(formInstance.getErrors(), buttonElement);\n\n formElement.reportValidity();\n\n const isValid = formInstance.validate();\n if (isValid) {\n await formProps.onSubmit?.(event, {\n ...formInstance,\n ...getDerivedState(formInstance),\n });\n }\n } finally {\n formInstance.formState.set('saveInProgress', false);\n }\n }}\n />\n );\n}\n\nfunction getField<TDraft, TOriginal extends TDraft, TPath extends string>(\n form: FormContext<TDraft, TOriginal>,\n path: TPath,\n): Field<TDraft, TOriginal, TPath> {\n const field = {\n get originalValue() {\n return form.original !== undefined ? get(form.original as any, path as any) : undefined;\n },\n\n get value() {\n const draft = form.getDraft();\n return get(draft ?? form.original ?? form.options.defaultValue, path as any);\n },\n\n setValue(update: Update<Value<TDraft, TPath>>) {\n form.formState.set('draft', (draft = form.original ?? form.options.defaultValue) => {\n if (update instanceof Function) {\n update = update(get(draft, path as any) as Value<TDraft, TPath>);\n }\n\n return set(draft, path as any, update as any);\n });\n },\n\n get hasChange() {\n return !deepEqual(this.originalValue, this.value);\n },\n\n get errors() {\n const errors = form.getErrors();\n return errors.get(path) ?? [];\n },\n\n get names(): any {\n const { value } = this;\n\n if (Array.isArray(value)) {\n return value.map((_, index) => join(path, String(index)));\n }\n\n if (isObject(value)) {\n return Object.keys(value).map((key) => join(path, key));\n }\n\n return [];\n },\n\n add(...args: any[]) {\n this.setValue((value): any => {\n if (!value) {\n throw new Error(`Cannot add element to ${JSON.stringify(value)}`);\n }\n\n if (Array.isArray(value)) {\n return [...(value ?? []), args[0]];\n }\n\n if (isObject(value)) {\n return {\n ...value,\n [args[0]]: args[1],\n };\n }\n\n throw new Error(`Cannot add element to ${JSON.stringify(value)}`);\n });\n },\n\n remove(key: string | number) {\n this.setValue((value): any => {\n if (!value) {\n throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);\n }\n\n if (Array.isArray(value)) {\n return value.filter((_, index) => index !== Number(key));\n }\n\n if (isObject(value)) {\n const { [key]: _, ...rest } = value as Record<string | number, unknown>;\n return rest;\n }\n\n throw new Error(`Cannot remove element from ${JSON.stringify(value)}`);\n });\n },\n };\n\n return field as any;\n}\n\nfunction getErrors<TDraft, TOriginal>(\n draft: TDraft,\n original: TOriginal | undefined,\n validations: FormOptions<TDraft, TOriginal>['validations'],\n) {\n const errors = new Map<string, string[]>();\n\n for (const [path, block] of Object.entries(validations ?? {})) {\n for (const [validationName, validate] of Object.entries(\n block as Record<string, Validation<any, any, any>>,\n )) {\n let matched = false;\n\n for (const [field, value] of Object.entries(getWildCardMatches(draft, path))) {\n matched = true;\n if (!validate(value, { draft, original, field })) {\n const fieldErrors = errors.get(field) ?? [];\n fieldErrors.push(validationName);\n errors.set(field, fieldErrors);\n }\n }\n\n if (!matched && !path.includes('*')) {\n if (!validate(undefined, { draft, original, field: path })) {\n const fieldErrors = errors.get(path) ?? [];\n fieldErrors.push(validationName);\n errors.set(path, fieldErrors);\n }\n }\n }\n }\n\n return errors;\n}\n\nexport function getDerivedState<TDraft>(\n instance: FormContext<TDraft, any>,\n): FormDerivedState<TDraft> {\n return {\n draft: instance.getDraft(),\n hasTriggeredValidations: instance.hasTriggeredValidations(),\n saveScheduled: instance.saveScheduled(),\n saveInProgress: instance.saveInProgress(),\n hasChanges: instance.hasChanges(),\n errors: instance.getErrors(),\n isValid: instance.isValid(),\n };\n}\n\nexport class Form<TDraft, TOriginal extends TDraft = TDraft> {\n context: Context<FormContext<TDraft, TOriginal> | null> = createContext<FormContext<\n TDraft,\n TOriginal\n > | null>(null);\n\n constructor(public readonly options: FormOptions<TDraft, TOriginal>) {\n autobind(Form);\n }\n\n useForm(): FormContext<TDraft, TOriginal> {\n const context = useContext(this.context);\n\n if (!context) {\n throw new Error('Form context not found');\n }\n\n return context;\n }\n\n useFormState<S>(\n selector: (state: FormInstance<TDraft, TOriginal>) => S,\n useStoreOptions?: UseStoreOptions<S>,\n ): S {\n const form = this.useForm();\n\n return useStore(\n form.formState,\n () =>\n selector({\n ...form,\n ...getDerivedState(form),\n }),\n\n useStoreOptions,\n );\n }\n\n useField<TPath extends string>(\n path: TPath,\n useStoreOptions?: UseStoreOptions<any>,\n ): Field<TDraft, TOriginal, TPath> {\n const form = this.useForm();\n this.useFormState((form) => [form.getField(path).value, form.original], useStoreOptions);\n return form.getField(path);\n }\n\n // ///////////////////////////////////////////////////////////////////////////\n // React Components\n // ///////////////////////////////////////////////////////////////////////////\n\n Form({\n original,\n defaultValue,\n validations,\n localizeError,\n urlState,\n autoSave,\n transform,\n validatedClass,\n ...formProps\n }: {\n original?: TOriginal;\n onSubmit?: (event: FormEvent<HTMLFormElement>, form: FormInstance<TDraft, TOriginal>) => void;\n } & Partial<FormOptions<TDraft, TOriginal>> &\n Omit<HTMLProps<HTMLFormElement>, 'defaultValue' | 'autoSave' | 'onSubmit'>): JSX.Element {\n const options: FormOptions<TDraft, TOriginal> = {\n defaultValue: { ...this.options.defaultValue, ...defaultValue },\n validations: { ...this.options.validations, ...validations } as Validations<\n TDraft,\n TOriginal\n >,\n localizeError: localizeError ?? this.options.localizeError,\n autoSave: autoSave ?? this.options.autoSave,\n transform: transform ?? this.options.transform,\n validatedClass: validatedClass ?? this.options.validatedClass,\n };\n\n const formState = useMemo(() => {\n return createStore<FormState<TDraft>>({\n draft: undefined,\n hasTriggeredValidations: false,\n saveScheduled: false,\n saveInProgress: false,\n });\n }, []);\n\n let lastDraft: TDraft | undefined;\n const cache = new Map<string, unknown>();\n function lazy<T>(key: string, fn: () => T): T {\n if (lastDraft !== formState.get().draft) {\n cache.clear();\n lastDraft = formState.get().draft;\n }\n\n let value = cache.get(key);\n if (!cache.has(key)) {\n value = fn();\n cache.set(key, value);\n }\n\n return value as T;\n }\n\n const context: FormContext<TDraft, TOriginal> = {\n formState,\n options,\n original,\n\n getField() {\n throw new Error('Not implemented');\n },\n\n getDraft() {\n return formState.get().draft ?? original ?? options.defaultValue;\n },\n\n hasTriggeredValidations() {\n return formState.get().hasTriggeredValidations;\n },\n\n saveScheduled() {\n return formState.get().saveScheduled;\n },\n\n saveInProgress() {\n return formState.get().saveInProgress;\n },\n\n hasChanges() {\n return lazy(\n 'hasChanges',\n () => !deepEqual(this.getDraft(), original ?? options.defaultValue),\n );\n },\n\n getErrors() {\n return lazy('getErrors', () => getErrors(this.getDraft(), original, options.validations));\n },\n\n isValid() {\n return lazy('isValid', () => this.getErrors().size === 0);\n },\n\n validate() {\n formState.set('hasTriggeredValidations', true);\n return this.isValid();\n },\n\n reset() {\n formState.set('draft', undefined);\n formState.set('hasTriggeredValidations', false);\n },\n };\n\n context.getField = (path) => lazy(path, () => getField(context, path));\n\n useEffect(() => {\n if (urlState) {\n return connectUrl(\n formState.map('draft'),\n typeof urlState === 'object' ? urlState : { key: 'form' },\n );\n }\n\n return undefined;\n }, [formState, simpleHash(urlState)]);\n\n // useEffect(() => {\n // const handles = options.transform?.map(({ trigger, update }) => {\n // const draft = derivedState.map('draft');\n // const triggerStore = trigger ? draft.map(trigger as any) : draft;\n\n // return triggerStore.subscribe(() => {\n // const value = trigger ? get(draft.get(), trigger as any) : draft.get();\n // const result = update(value as any, draft);\n\n // if (result !== undefined) {\n // draft.set(result);\n // }\n // });\n // });\n\n // return () => {\n // handles?.forEach((handle) => handle());\n // };\n // }, [original,options.transform]);\n\n useFormAutosave(context);\n\n return (\n <this.context.Provider value={context}>\n <FormContainer {...formProps} form={this} />\n </this.context.Provider>\n );\n }\n\n FormState<S>({\n selector,\n children,\n }: {\n selector: (form: FormInstance<TDraft, TOriginal>) => S;\n children: (selectedState: S) => ReactNode;\n }): JSX.Element {\n const selectedState = this.useFormState(selector);\n return <>{children(selectedState)}</>;\n }\n\n Field<const TPath extends string>(\n props: FormFieldPropsWithRender<TDraft, TOriginal, TPath>,\n ): JSX.Element;\n\n Field<const TPath extends string, const TComponent extends FormFieldComponent = 'input'>(\n props: FormFieldPropsWithComponent<TDraft, TOriginal, TPath, TComponent>,\n ): JSX.Element;\n\n Field(props: any): JSX.Element {\n return Reflect.apply(FormField, this, [{ component: 'input', ...props }]);\n }\n\n ForEach<const TPath extends string>(props: FormForEachProps<TDraft, TPath>): JSX.Element {\n return Reflect.apply(FormForEach, this, [props]);\n }\n\n withForm<TProps extends Record<string, unknown>>(\n Component: React.ComponentType<TProps>,\n formProps?: Parameters<this['Form']>[0],\n ): FunctionComponent<TProps> {\n const { Form } = this;\n return function FormWrapper(props: TProps) {\n return (\n <Form {...formProps}>\n <Component {...props} />\n </Form>\n );\n };\n }\n}\n\nexport function createForm<TDraft, TOriginal extends TDraft = TDraft>(\n options: FormOptions<TDraft, TOriginal>,\n): Form<TDraft, TOriginal> {\n return new Form(options);\n}\n","import { startTransition, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Duration } from '@core';\nimport { debounce } from '@lib/debounce';\nimport { simpleHash } from '@lib/hash';\nimport { throttle } from '@lib/throttle';\n\nexport interface UseDecoupledStateOptions<T> {\n debounce?: Duration;\n throttle?: Duration;\n onCommit?: (value: T) => void;\n}\n\nexport function useDecoupledState<T>(\n value: T,\n onChange: (value: T) => void,\n options: UseDecoupledStateOptions<T> = {},\n): [state: T, setState: (value: T) => void] {\n const [dirty, setDirty] = useState<{ v: T }>();\n const ref = useRef({ onChange, onCommit: options.onCommit });\n\n useEffect(() => {\n ref.current = { onChange, onCommit: options.onCommit };\n }, [onChange]);\n\n const update = useMemo(() => {\n const { onChange, onCommit } = ref.current;\n\n const update = (value: T) => {\n onChange(value);\n setDirty(undefined);\n onCommit?.(value);\n };\n\n let delayedUpdate: (value: T) => void;\n\n if (options.debounce) {\n delayedUpdate = debounce(update, options.debounce);\n } else if (options.throttle) {\n delayedUpdate = throttle(update, options.throttle);\n } else {\n delayedUpdate = (value) => startTransition(() => update(value));\n }\n\n return (value: T) => {\n setDirty({ v: value });\n delayedUpdate(value);\n };\n }, [simpleHash([options.debounce, options.throttle])]);\n\n return [dirty ? dirty.v : value, update];\n}\n","export function castArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n","import { castArray } from '@lib/castArray';\nimport { simpleHash } from '@lib/hash';\nimport { useEffect } from 'react';\n\nexport function useUrlParamScope({\n key,\n type = 'search',\n}: {\n key: string | string[];\n type?: 'search' | 'hash';\n}): void {\n useEffect(\n () => () => {\n const url = new URL(window.location.href);\n const parameters = new URLSearchParams(url[type].slice(1));\n\n for (const _key of castArray(key)) {\n parameters.delete(_key);\n }\n\n url[type] = parameters.toString();\n window.history.replaceState(null, '', url.toString());\n },\n [simpleHash(key), type],\n );\n}\n"],"names":["form","value","name","Fragment","options","errors","Form","onChange","update"],"mappings":";;;;;;;;;AAOO,SAAS,YAAY,EAAE,IAAA,EAAM,QAAU,EAAA,GAAG,OAAwC,EAAA;AACvF,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,KAAO,EAAA;AAAA,QACL,QAAU,EAAA,UAAA;AAAA,QACV,GAAG,KAAM,CAAA;AAAA,OACX;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBAED,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,KAAO,EAAA;AAAA,cACL,QAAU,EAAA,UAAA;AAAA,cACV,GAAK,EAAA,CAAA;AAAA,cACL,IAAM,EAAA,CAAA;AAAA,cACN,OAAS,EAAA,CAAA;AAAA,cACT,KAAO,EAAA,MAAA;AAAA,cACP,MAAQ,EAAA,MAAA;AAAA,cACR,aAAe,EAAA;AAAA;AACjB;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;;AChBgB,SAAA,kBAAA,CACd,QACA,IACsB,EAAA;AACtB,EAAA,MAAM,UAAgC,EAAC;AACvC,EAAA,MAAM,CAAC,KAAO,EAAA,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,cAAc,IAAI,CAAA;AAEnD,EAAA,IAAI,UAAU,SAAW,EAAA;AACvB,IAAM,MAAA,IAAI,MAAM,eAAe,CAAA;AAAA;AAGjC,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,MAAM,KAAK,CAAC,QAAA,CAAS,MAAM,CAAG,EAAA;AAC/C,IAAA,MAAA,GAAS,EAAC;AAAA;AAGZ,EAAA,KAAA,MAAW,CAAC,GAAK,EAAA,KAAK,CAAK,IAAA,KAAA,KAAU,MAAM,CAAC,CAAC,KAAO,EAAA,MAAA,CAAO,KAAK,CAAC,CAAC,IAAI,MAAO,CAAA,OAAA,CAAQ,MAAM,CAAG,EAAA;AAC5F,IAAI,IAAA,KAAA,KAAU,GAAO,IAAA,KAAA,KAAU,GAAK,EAAA;AAClC,MAAA;AAAA;AAGF,IAAA,IAAI,WAAW,SAAW,EAAA;AACxB,MAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,KAAA;AACf,MAAA;AAAA;AAGF,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,CAAA,IAAK,OAAO,OAAQ,CAAA,kBAAA,CAAmB,KAAO,EAAA,CAAC,MAAQ,EAAA,GAAG,IAAI,CAAC,CAAC,CAAG,EAAA;AAC7F,MAAA,OAAA,CAAQ,CAAG,EAAA,GAAG,CAAI,CAAA,EAAA,MAAM,EAAE,CAAI,GAAA,QAAA;AAAA;AAChC;AAGF,EAAO,OAAA,OAAA;AACT;;AC4EO,SAAS,SAOd,CAAA;AAAA;AAAA,EAEE,IAAO,GAAA,EAAA;AAAA,EACP,SAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,CAAC,CAAM,KAAA,CAAA;AAAA,EACrB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAGoB,EAAA;AAGpB,EAAM,MAAA,IAAA,GAAO,KAAK,OAAQ,EAAA;AAC1B,EAAM,MAAA,YAAA,GAAe,OAAO,EAAE,GAAG,MAAM,GAAG,eAAA,CAAgB,IAAI,CAAE,EAAA,CAAA;AAChE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAY,EAAA;AAEhD,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,YAAa,CAAA,CAACA,KAAS,KAAA;AACxC,IAAA,MAAMC,MAAQD,GAAAA,KAAAA,CAAK,QAAS,CAAA,IAAW,CAAE,CAAA,KAAA;AACzC,IAAA,IAAI,SAAW,EAAA;AACb,MAAO,OAAA,SAAA,CAAUC,MAAc,EAAA,YAAA,EAAc,CAAA;AAAA;AAE/C,IAAA,IAAIA,WAAU,SAAW,EAAA;AACvB,MAAOA,OAAAA,MAAAA;AAAA;AAET,IAAO,OAAA,YAAA;AAAA,GACR,CAAA;AAED,EAAA,MAAM,QAAW,GAAA,CAAC,CAChB,KAAA,IAAA,CAAK,QAAS,CAAA,IAAW,CAAE,CAAA,QAAA,CAAS,WAAY,CAAA,CAAA,EAAG,YAAa,EAAC,CAAC,CAAA;AAEpE,EAAA,MAAM,0BAA0B,IAAK,CAAA,YAAA,CAAa,CAACD,KAAAA,KAASA,MAAK,uBAAuB,CAAA;AAExF,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,UAAA,KAAe,SAAa,IAAA,CAAC,cAAgB,EAAA;AAC/C,MAAA;AAAA;AAGF,IAAM,MAAA,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,QAAA,CAAS,UAAU,CAAA;AACnB,MAAA,aAAA,CAAc,SAAS,CAAA;AAAA,OACtB,cAAc,CAAA;AAEjB,IAAO,OAAA,MAAM,aAAa,OAAO,CAAA;AAAA,GAChC,EAAA,CAAC,UAAY,EAAA,cAAc,CAAC,CAAA;AAE/B,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,IAAA;AAAA,IACA,OAAO,UAAc,IAAA,KAAA;AAAA,IACrB,QAAA,EAAU,CAAC,KAAA,EAAA,GAAwC,QAAoB,KAAA;AACrE,MAAMC,MAAAA,MAAAA,GACJ,OAAO,KAAA,KAAU,QAAY,IAAA,KAAA,KAAU,QAAQ,QAAY,IAAA,KAAA,GACvD,KAAM,CAAA,MAAA,CAAO,KACb,GAAA,KAAA;AAEN,MAAA,IAAI,WAAe,IAAA,CAAC,WAAYA,CAAAA,MAAK,CAAG,EAAA;AACtC,QAAA;AAAA;AAGF,MAAA,IAAI,gBAAgB,cAAgB,EAAA;AAClC,QAAA,aAAA,CAAcA,MAAK,CAAA;AAAA,OACd,MAAA;AACL,QAAA,QAAA,CAASA,MAAK,CAAA;AAAA;AAGhB,MAAW,QAAA,GAAA,KAAA,EAAO,GAAG,QAAQ,CAAA;AAAA,KAC/B;AAAA,IACA,UAAU,IAAa,EAAA;AACrB,MAAA,IAAI,eAAe,SAAW,EAAA;AAC5B,QAAA,QAAA,CAAS,UAAU,CAAA;AACnB,QAAA,aAAA,CAAc,SAAS,CAAA;AAAA;AAGzB,MAAA,MAAA,GAAS,GAAG,IAAI,CAAA;AAAA;AAClB,GACF;AAEA,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,uBAEK,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA,MAAA,CAAO,KAAO,EAAA,EAAE,GAAG,IAAA,CAAK,QAAS,CAAA,IAAW,CAAG,EAAA,uBAAA,EAAgC,CAAA,IAAK,IACvF,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,OAAO,cAAc,SAAW,EAAA,EAAE,GAAG,SAAW,EAAA,GAAG,OAAO,CAAA;AAAA;AAG5D,EAAO,OAAA,IAAA;AACT;;AC1MO,SAAS,WAEd,CAAA,EAAE,IAAM,EAAA,aAAA,EAAe,UACV,EAAA;AACb,EAAM,MAAA,IAAA,GAAO,KAAK,OAAQ,EAAA;AAE1B,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,YAAA,CAAa,MAAM;AACpC,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,QAAA,CAAS,IAAW,CAAA;AACvC,IAAA,OAAO,KAAM,CAAA,KAAA;AAAA,GACd,CAAA;AAED,EAAA,MAAM,GAAM,GAAA,WAAA;AAAA,IACV,IAAI,IAAgB,KAAA;AAClB,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,QAAA,CAAS,IAAW,CAAA;AACvC,MAAM,KAAA,CAAA,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,KACnB;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,MAAS,GAAA,WAAA;AAAA,IACb,CAAC,GAAa,KAAA;AACZ,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,QAAA,CAAS,IAAW,CAAA;AACvC,MAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,KAClB;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAAC,KAA0F,KAAA;AACzF,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,QAAA,CAAS,IAAW,CAAA;AACvC,MAAA,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,KACtB;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,aAAA,IACC,KAAM,CAAA,GAAA,CAAI,CAACC,KAAAA,EAAM,KAAU,KAAA;AACzB,MAAA,MAAM,GAAMA,GAAAA,KAAAA,CAAK,KAAM,CAAA,GAAG,EAAE,GAAI,EAAA;AAEhC,MACE,uBAAA,GAAA,CAACC,UAAA,EAAA,EACE,QAAc,EAAA,aAAA,CAAA;AAAA,QACb,IAAAD,EAAAA,KAAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAG;AAAA,OACzB,KANY,GAOf,CAAA;AAAA,KAEH,CAAA;AAAA,IAEF,QAAW,GAAA;AAAA,MACV,KAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACM;AAAA,GACV,EAAA,CAAA;AAEJ;;ACvEO,SAAS,gBACd,IACM,EAAA;AACN,EAAA,MAAM,EAAE,SAAA,EAAW,OAAS,EAAA,QAAA,EAAa,GAAA,IAAA;AACzC,EAAA,MAAM,YAAe,GAAA,YAAA,CAAa,OAAQ,CAAA,QAAA,EAAU,YAAY,GAAK,CAAA;AACrE,EAAA,MAAM,SAAY,GAAA,MAAA,CAAO,EAAE,OAAA,EAAS,CAAA;AACpC,EAAA,MAAM,YAAY,MAAe,EAAA;AACjC,EAAA,MAAM,IAAI,OAAQ,CAAA,MAAM,KAAM,EAAA,EAAG,EAAE,CAAA;AAEnC,EAAA,MAAM,GAAM,GAAA,OAAA;AAAA,IACV,MACE,SAAS,YAAY;AACnB,MAAA,MAAM,EAAE,OAAA,EAAAE,QAAQ,EAAA,GAAI,SAAU,CAAA,OAAA;AAC9B,MAAM,MAAA,IAAA,GAAOA,SAAQ,QAAU,EAAA,IAAA;AAC/B,MAAA,MAAM,QAAQ,QAAS,EAAA;AAEvB,MAAA,SAAA,CAAU,OAAU,GAAA,KAAA;AAEpB,MAAA,CAAA,CAAE,KAAM,EAAA;AAER,MAAA,CAAA,CAAE,YAAY;AACZ,QAAI,IAAA;AACF,UAAU,SAAA,CAAA,GAAA,CAAI,kBAAkB,IAAI,CAAA;AACpC,UAAM,MAAA,IAAA,GAAO,OAAO,IAAI,CAAA;AAExB,UAAA,IAAI,CAAE,CAAA,IAAA,KAAS,CAAKA,IAAAA,QAAAA,CAAQ,UAAU,cAAgB,EAAA;AACpD,YAAA,IAAA,CAAK,KAAM,EAAA;AAAA;AACb,SACA,SAAA;AACA,UAAU,SAAA,CAAA,GAAA,CAAI,kBAAkB,KAAK,CAAA;AAErC,UAAI,IAAA,CAAA,CAAE,SAAS,CAAG,EAAA;AAChB,YAAU,SAAA,CAAA,GAAA,CAAI,iBAAiB,KAAK,CAAA;AAAA;AACtC;AACF,OACD,CAAA;AAAA,OACA,YAAY,CAAA;AAAA,IACjB,CAAC,WAAW,YAAY;AAAA,GAC1B;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,OAAQ,CAAA,QAAA,EAAU,IAAM,EAAA;AAC3B,MAAA;AAAA;AAGF,IAAA,OAAO,UACJ,GAAI,CAAA,CAAC,KAAU,KAAA,KAAA,CAAM,KAAK,CAC1B,CAAA,SAAA;AAAA,MACC,MAAM;AACJ,QAAA,IAAI,SAAU,CAAA,QAAA,EAAY,EAAA,SAAA,CAAU,OAAO,CAAG,EAAA;AAC5C,UAAA;AAAA;AAGF,QAAI,GAAA,EAAA;AACJ,QAAU,SAAA,CAAA,GAAA,CAAI,iBAAiB,IAAI,CAAA;AAAA,OACrC;AAAA,MACA,EAAE,QAAQ,KAAM;AAAA,KAClB;AAAA,GACJ,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,SAAA,CAAU,MAAM;AACd,IAAU,SAAA,CAAA,OAAA,GAAU,EAAE,OAAQ,EAAA;AAAA,GAC/B,CAAA;AACH;;AC0DA,SAAS,aAAc,CAAA;AAAA,EACrB,IAAA;AAAA,EACA,GAAG;AACL,CAM2D,EAAA;AACzD,EAAM,MAAA,YAAA,GAAe,KAAK,OAAQ,EAAA;AAClC,EAAA,MAAM,0BAA0B,IAAK,CAAA,YAAA,CAAa,CAAC,KAAA,KAAU,MAAM,uBAAuB,CAAA;AAE1F,EAAM,MAAA,OAAA,GAAU,OAAwB,IAAI,CAAA;AAE5C,EAAS,SAAA,cAAA,CAAe,QAA+B,aAAmC,EAAA;AACxF,IAAA,MAAM,cAAc,OAAQ,CAAA,OAAA;AAC5B,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAA;AAAA;AAGF,IAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,MAC1B,CAAC,GAAG,MAAO,CAAA,OAAA,EAAS,CAAE,CAAA,GAAA;AAAA,QACpB,CAAC,CAAC,KAAOC,EAAAA,OAAM,CACb,KAAA;AAAA,UACE,KAAA;AAAA,UACAA,OAAAA,CAAO,GAAI,CAAA,CAAC,KAAU,KAAA,YAAA,CAAa,QAAQ,aAAgB,GAAA,KAAA,EAAO,KAAK,CAAA,IAAK,KAAK;AAAA;AACnF;AACJ,KACF;AAEA,IAAA,KAAA,MAAW,OAAW,IAAA,KAAA,CAAM,IAAK,CAAA,WAAA,CAAY,QAAQ,CAAG,EAAA;AACtD,MAAI,IAAA,MAAA,IAAU,OAAW,IAAA,mBAAA,IAAuB,OAAS,EAAA;AACvD,QAAC,OAA8B,CAAA,iBAAA;AAAA,UAC7B,gBAAgB,GAAK,CAAA,OAAA,CAA8B,IAAI,CAAG,EAAA,IAAA,CAAK,IAAI,CAAK,IAAA;AAAA,SAC1E;AAAA;AACF;AAGF,IAAI,IAAA,aAAA,IAAiB,uBAAuB,aAAe,EAAA;AACzD,MAAM,MAAA,WAAA,GAAc,CAAC,GAAG,MAAO,CAAA,MAAA,EAAQ,CAAE,CAAA,IAAA,EAAO,CAAA,IAAA,CAAK,IAAI,CAAA;AAEzD,MAAA,aAAA,CAAc,kBAAkB,WAAW,CAAA;AAAA;AAC7C;AAGF,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,YAAa,CAAA,SAAA,CACjB,GAAI,CAAA,MAAM,YAAa,CAAA,SAAA,EAAW,CAAA,CAClC,SAAU,CAAA,CAAC,MAAW,KAAA,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,GACjD,EAAG,EAAE,CAAA;AAEL,EACE,uBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAK,EAAA,OAAA;AAAA,MACL,UAAU,EAAA,IAAA;AAAA,MACT,GAAG,SAAA;AAAA,MACJ,SAAW,EAAA;AAAA,QACT,SAAU,CAAA,SAAA;AAAA,QACV,uBAA2B,GAAA,YAAA,CAAa,OAAQ,CAAA,cAAA,IAAkB,WAAe,GAAA;AAAA,OAEhF,CAAA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAAA,MACX,QAAA,EAAU,OAAO,KAAU,KAAA;AACzB,QAAI,IAAA,YAAA,CAAa,gBAAkB,EAAA;AACjC,UAAA;AAAA;AAGF,QAAI,IAAA;AACF,UAAa,YAAA,CAAA,SAAA,CAAU,GAAI,CAAA,gBAAA,EAAkB,IAAI,CAAA;AACjD,UAAA,KAAA,CAAM,cAAe,EAAA;AAErB,UAAA,MAAM,cAAc,KAAM,CAAA,aAAA;AAC1B,UAAM,MAAA,aAAA,GACJ,KAAM,CAAA,WAAA,YAAuB,WAC7B,IAAA,KAAA,CAAM,YAAY,SAAqB,YAAA,iBAAA,GACnC,KAAM,CAAA,WAAA,CAAY,SAClB,GAAA,KAAA,CAAA;AAEN,UAAe,cAAA,CAAA,YAAA,CAAa,SAAU,EAAA,EAAG,aAAa,CAAA;AAEtD,UAAA,WAAA,CAAY,cAAe,EAAA;AAE3B,UAAM,MAAA,OAAA,GAAU,aAAa,QAAS,EAAA;AACtC,UAAA,IAAI,OAAS,EAAA;AACX,YAAM,MAAA,SAAA,CAAU,WAAW,KAAO,EAAA;AAAA,cAChC,GAAG,YAAA;AAAA,cACH,GAAG,gBAAgB,YAAY;AAAA,aAChC,CAAA;AAAA;AACH,SACA,SAAA;AACA,UAAa,YAAA,CAAA,SAAA,CAAU,GAAI,CAAA,gBAAA,EAAkB,KAAK,CAAA;AAAA;AACpD;AACF;AAAA,GACF;AAEJ;AAEA,SAAS,QAAA,CACP,MACA,IACiC,EAAA;AACjC,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,IAAI,aAAgB,GAAA;AAClB,MAAA,OAAO,KAAK,QAAa,KAAA,SAAA,GAAY,IAAI,IAAK,CAAA,QAAA,EAAiB,IAAW,CAAI,GAAA,SAAA;AAAA,KAChF;AAAA,IAEA,IAAI,KAAQ,GAAA;AACV,MAAM,MAAA,KAAA,GAAQ,KAAK,QAAS,EAAA;AAC5B,MAAA,OAAO,IAAI,KAAS,IAAA,IAAA,CAAK,YAAY,IAAK,CAAA,OAAA,CAAQ,cAAc,IAAW,CAAA;AAAA,KAC7E;AAAA,IAEA,SAAS,MAAsC,EAAA;AAC7C,MAAK,IAAA,CAAA,SAAA,CAAU,IAAI,OAAS,EAAA,CAAC,QAAQ,IAAK,CAAA,QAAA,IAAY,IAAK,CAAA,OAAA,CAAQ,YAAiB,KAAA;AAClF,QAAA,IAAI,kBAAkB,QAAU,EAAA;AAC9B,UAAA,MAAA,GAAS,MAAO,CAAA,GAAA,CAAI,KAAO,EAAA,IAAW,CAAyB,CAAA;AAAA;AAGjE,QAAO,OAAA,GAAA,CAAI,KAAO,EAAA,IAAA,EAAa,MAAa,CAAA;AAAA,OAC7C,CAAA;AAAA,KACH;AAAA,IAEA,IAAI,SAAY,GAAA;AACd,MAAA,OAAO,CAAC,SAAA,CAAU,IAAK,CAAA,aAAA,EAAe,KAAK,KAAK,CAAA;AAAA,KAClD;AAAA,IAEA,IAAI,MAAS,GAAA;AACX,MAAM,MAAA,MAAA,GAAS,KAAK,SAAU,EAAA;AAC9B,MAAA,OAAO,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,IAAK,EAAC;AAAA,KAC9B;AAAA,IAEA,IAAI,KAAa,GAAA;AACf,MAAM,MAAA,EAAE,OAAU,GAAA,IAAA;AAElB,MAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,QAAO,OAAA,KAAA,CAAM,GAAI,CAAA,CAAC,CAAG,EAAA,KAAA,KAAU,KAAK,IAAM,EAAA,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA;AAG1D,MAAI,IAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AACnB,QAAO,OAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA,IAAA,CAAK,IAAM,EAAA,GAAG,CAAC,CAAA;AAAA;AAGxD,MAAA,OAAO,EAAC;AAAA,KACV;AAAA,IAEA,OAAO,IAAa,EAAA;AAClB,MAAK,IAAA,CAAA,QAAA,CAAS,CAAC,KAAe,KAAA;AAC5B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAA,MAAM,IAAI,KAAM,CAAA,CAAA,sBAAA,EAAyB,KAAK,SAAU,CAAA,KAAK,CAAC,CAAE,CAAA,CAAA;AAAA;AAGlE,QAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,UAAA,OAAO,CAAC,GAAI,KAAA,IAAS,EAAK,EAAA,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA;AAGnC,QAAI,IAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AACnB,UAAO,OAAA;AAAA,YACL,GAAG,KAAA;AAAA,YACH,CAAC,IAAK,CAAA,CAAC,CAAC,GAAG,KAAK,CAAC;AAAA,WACnB;AAAA;AAGF,QAAA,MAAM,IAAI,KAAM,CAAA,CAAA,sBAAA,EAAyB,KAAK,SAAU,CAAA,KAAK,CAAC,CAAE,CAAA,CAAA;AAAA,OACjE,CAAA;AAAA,KACH;AAAA,IAEA,OAAO,GAAsB,EAAA;AAC3B,MAAK,IAAA,CAAA,QAAA,CAAS,CAAC,KAAe,KAAA;AAC5B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAA,MAAM,IAAI,KAAM,CAAA,CAAA,2BAAA,EAA8B,KAAK,SAAU,CAAA,KAAK,CAAC,CAAE,CAAA,CAAA;AAAA;AAGvE,QAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,UAAO,OAAA,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG,UAAU,KAAU,KAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AAGzD,QAAI,IAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AACnB,UAAA,MAAM,EAAE,CAAC,GAAG,GAAG,CAAG,EAAA,GAAG,MAAS,GAAA,KAAA;AAC9B,UAAO,OAAA,IAAA;AAAA;AAGT,QAAA,MAAM,IAAI,KAAM,CAAA,CAAA,2BAAA,EAA8B,KAAK,SAAU,CAAA,KAAK,CAAC,CAAE,CAAA,CAAA;AAAA,OACtE,CAAA;AAAA;AACH,GACF;AAEA,EAAO,OAAA,KAAA;AACT;AAEA,SAAS,SAAA,CACP,KACA,EAAA,QAAA,EACA,WACA,EAAA;AACA,EAAM,MAAA,MAAA,uBAAa,GAAsB,EAAA;AAEzC,EAAW,KAAA,MAAA,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAQ,CAAA,WAAA,IAAe,EAAE,CAAG,EAAA;AAC7D,IAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,QAAQ,CAAA,IAAK,MAAO,CAAA,OAAA;AAAA,MAC9C;AAAA,KACC,EAAA;AACD,MAAA,IAAI,OAAU,GAAA,KAAA;AAEd,MAAW,KAAA,MAAA,CAAC,KAAO,EAAA,KAAK,CAAK,IAAA,MAAA,CAAO,QAAQ,kBAAmB,CAAA,KAAA,EAAO,IAAI,CAAC,CAAG,EAAA;AAC5E,QAAU,OAAA,GAAA,IAAA;AACV,QAAI,IAAA,CAAC,SAAS,KAAO,EAAA,EAAE,OAAO,QAAU,EAAA,KAAA,EAAO,CAAG,EAAA;AAChD,UAAA,MAAM,WAAc,GAAA,MAAA,CAAO,GAAI,CAAA,KAAK,KAAK,EAAC;AAC1C,UAAA,WAAA,CAAY,KAAK,cAAc,CAAA;AAC/B,UAAO,MAAA,CAAA,GAAA,CAAI,OAAO,WAAW,CAAA;AAAA;AAC/B;AAGF,MAAA,IAAI,CAAC,OAAW,IAAA,CAAC,IAAK,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AACnC,QAAI,IAAA,CAAC,SAAS,SAAW,EAAA,EAAE,OAAO,QAAU,EAAA,KAAA,EAAO,IAAK,EAAC,CAAG,EAAA;AAC1D,UAAA,MAAM,WAAc,GAAA,MAAA,CAAO,GAAI,CAAA,IAAI,KAAK,EAAC;AACzC,UAAA,WAAA,CAAY,KAAK,cAAc,CAAA;AAC/B,UAAO,MAAA,CAAA,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA;AAC9B;AACF;AACF;AAGF,EAAO,OAAA,MAAA;AACT;AAEO,SAAS,gBACd,QAC0B,EAAA;AAC1B,EAAO,OAAA;AAAA,IACL,KAAA,EAAO,SAAS,QAAS,EAAA;AAAA,IACzB,uBAAA,EAAyB,SAAS,uBAAwB,EAAA;AAAA,IAC1D,aAAA,EAAe,SAAS,aAAc,EAAA;AAAA,IACtC,cAAA,EAAgB,SAAS,cAAe,EAAA;AAAA,IACxC,UAAA,EAAY,SAAS,UAAW,EAAA;AAAA,IAChC,MAAA,EAAQ,SAAS,SAAU,EAAA;AAAA,IAC3B,OAAA,EAAS,SAAS,OAAQ;AAAA,GAC5B;AACF;AAEO,MAAM,IAAgD,CAAA;AAAA,EAM3D,YAA4B,OAAyC,EAAA;AAAzC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAL5B,IAAA,IAAA,CAAA,OAAA,GAA0D,cAGhD,IAAI,CAAA;AAGZ,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA;AACf,EAEA,OAA0C,GAAA;AACxC,IAAM,MAAA,OAAA,GAAU,UAAW,CAAA,IAAA,CAAK,OAAO,CAAA;AAEvC,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAG1C,IAAO,OAAA,OAAA;AAAA;AACT,EAEA,YAAA,CACE,UACA,eACG,EAAA;AACH,IAAM,MAAA,IAAA,GAAO,KAAK,OAAQ,EAAA;AAE1B,IAAO,OAAA,QAAA;AAAA,MACL,IAAK,CAAA,SAAA;AAAA,MACL,MACE,QAAS,CAAA;AAAA,QACP,GAAG,IAAA;AAAA,QACH,GAAG,gBAAgB,IAAI;AAAA,OACxB,CAAA;AAAA,MAEH;AAAA,KACF;AAAA;AACF,EAEA,QAAA,CACE,MACA,eACiC,EAAA;AACjC,IAAM,MAAA,IAAA,GAAO,KAAK,OAAQ,EAAA;AAC1B,IAAA,IAAA,CAAK,YAAa,CAAA,CAACL,KAAS,KAAA,CAACA,KAAK,CAAA,QAAA,CAAS,IAAI,CAAA,CAAE,KAAOA,EAAAA,KAAAA,CAAK,QAAQ,CAAA,EAAG,eAAe,CAAA;AACvF,IAAO,OAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA;AAC3B;AAAA;AAAA;AAAA,EAMA,IAAK,CAAA;AAAA,IACH,QAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAG;AAAA,GAKsF,EAAA;AACzF,IAAA,MAAM,OAA0C,GAAA;AAAA,MAC9C,cAAc,EAAE,GAAG,KAAK,OAAQ,CAAA,YAAA,EAAc,GAAG,YAAa,EAAA;AAAA,MAC9D,aAAa,EAAE,GAAG,KAAK,OAAQ,CAAA,WAAA,EAAa,GAAG,WAAY,EAAA;AAAA,MAI3D,aAAA,EAAe,aAAiB,IAAA,IAAA,CAAK,OAAQ,CAAA,aAAA;AAAA,MAC7C,QAAA,EAAU,QAAY,IAAA,IAAA,CAAK,OAAQ,CAAA,QAAA;AAAA,MACnC,SAAA,EAAW,SAAa,IAAA,IAAA,CAAK,OAAQ,CAAA,SAAA;AAAA,MACrC,cAAA,EAAgB,cAAkB,IAAA,IAAA,CAAK,OAAQ,CAAA;AAAA,KACjD;AAEA,IAAM,MAAA,SAAA,GAAY,QAAQ,MAAM;AAC9B,MAAA,OAAO,WAA+B,CAAA;AAAA,QACpC,KAAO,EAAA,SAAA;AAAA,QACP,uBAAyB,EAAA,KAAA;AAAA,QACzB,aAAe,EAAA,KAAA;AAAA,QACf,cAAgB,EAAA;AAAA,OACjB,CAAA;AAAA,KACH,EAAG,EAAE,CAAA;AAEL,IAAI,IAAA,SAAA;AACJ,IAAM,MAAA,KAAA,uBAAY,GAAqB,EAAA;AACvC,IAAS,SAAA,IAAA,CAAQ,KAAa,EAAgB,EAAA;AAC5C,MAAA,IAAI,SAAc,KAAA,SAAA,CAAU,GAAI,EAAA,CAAE,KAAO,EAAA;AACvC,QAAA,KAAA,CAAM,KAAM,EAAA;AACZ,QAAY,SAAA,GAAA,SAAA,CAAU,KAAM,CAAA,KAAA;AAAA;AAG9B,MAAI,IAAA,KAAA,GAAQ,KAAM,CAAA,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,IAAI,CAAC,KAAA,CAAM,GAAI,CAAA,GAAG,CAAG,EAAA;AACnB,QAAA,KAAA,GAAQ,EAAG,EAAA;AACX,QAAM,KAAA,CAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA;AAGtB,MAAO,OAAA,KAAA;AAAA;AAGT,IAAA,MAAM,OAA0C,GAAA;AAAA,MAC9C,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MAEA,QAAW,GAAA;AACT,QAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA,OACnC;AAAA,MAEA,QAAW,GAAA;AACT,QAAA,OAAO,SAAU,CAAA,GAAA,EAAM,CAAA,KAAA,IAAS,YAAY,OAAQ,CAAA,YAAA;AAAA,OACtD;AAAA,MAEA,uBAA0B,GAAA;AACxB,QAAO,OAAA,SAAA,CAAU,KAAM,CAAA,uBAAA;AAAA,OACzB;AAAA,MAEA,aAAgB,GAAA;AACd,QAAO,OAAA,SAAA,CAAU,KAAM,CAAA,aAAA;AAAA,OACzB;AAAA,MAEA,cAAiB,GAAA;AACf,QAAO,OAAA,SAAA,CAAU,KAAM,CAAA,cAAA;AAAA,OACzB;AAAA,MAEA,UAAa,GAAA;AACX,QAAO,OAAA,IAAA;AAAA,UACL,YAAA;AAAA,UACA,MAAM,CAAC,SAAU,CAAA,IAAA,CAAK,UAAY,EAAA,QAAA,IAAY,QAAQ,YAAY;AAAA,SACpE;AAAA,OACF;AAAA,MAEA,SAAY,GAAA;AACV,QAAO,OAAA,IAAA,CAAK,WAAa,EAAA,MAAM,SAAU,CAAA,IAAA,CAAK,UAAY,EAAA,QAAA,EAAU,OAAQ,CAAA,WAAW,CAAC,CAAA;AAAA,OAC1F;AAAA,MAEA,OAAU,GAAA;AACR,QAAA,OAAO,KAAK,SAAW,EAAA,MAAM,KAAK,SAAU,EAAA,CAAE,SAAS,CAAC,CAAA;AAAA,OAC1D;AAAA,MAEA,QAAW,GAAA;AACT,QAAU,SAAA,CAAA,GAAA,CAAI,2BAA2B,IAAI,CAAA;AAC7C,QAAA,OAAO,KAAK,OAAQ,EAAA;AAAA,OACtB;AAAA,MAEA,KAAQ,GAAA;AACN,QAAU,SAAA,CAAA,GAAA,CAAI,SAAS,SAAS,CAAA;AAChC,QAAU,SAAA,CAAA,GAAA,CAAI,2BAA2B,KAAK,CAAA;AAAA;AAChD,KACF;AAEA,IAAQ,OAAA,CAAA,QAAA,GAAW,CAAC,IAAS,KAAA,IAAA,CAAK,MAAM,MAAM,QAAA,CAAS,OAAS,EAAA,IAAI,CAAC,CAAA;AAErE,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,QAAU,EAAA;AACZ,QAAO,OAAA,UAAA;AAAA,UACL,SAAA,CAAU,IAAI,OAAO,CAAA;AAAA,UACrB,OAAO,QAAa,KAAA,QAAA,GAAW,QAAW,GAAA,EAAE,KAAK,MAAO;AAAA,SAC1D;AAAA;AAGF,MAAO,OAAA,SAAA;AAAA,OACN,CAAC,SAAA,EAAW,UAAW,CAAA,QAAQ,CAAC,CAAC,CAAA;AAsBpC,IAAA,eAAA,CAAgB,OAAO,CAAA;AAEvB,IAAA,uBACG,GAAA,CAAA,IAAA,CAAK,OAAQ,CAAA,QAAA,EAAb,EAAsB,KAAA,EAAO,OAC5B,EAAA,QAAA,kBAAA,GAAA,CAAC,aAAe,EAAA,EAAA,GAAG,SAAW,EAAA,IAAA,EAAM,MAAM,CAC5C,EAAA,CAAA;AAAA;AAEJ,EAEA,SAAa,CAAA;AAAA,IACX,QAAA;AAAA,IACA;AAAA,GAIc,EAAA;AACd,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,YAAA,CAAa,QAAQ,CAAA;AAChD,IAAO,uBAAA,GAAA,CAAA,QAAA,EAAA,EAAG,QAAS,EAAA,QAAA,CAAA,aAAa,CAAE,EAAA,CAAA;AAAA;AACpC,EAUA,MAAM,KAAyB,EAAA;AAC7B,IAAO,OAAA,OAAA,CAAQ,KAAM,CAAA,SAAA,EAAW,IAAM,EAAA,CAAC,EAAE,SAAA,EAAW,OAAS,EAAA,GAAG,KAAM,EAAC,CAAC,CAAA;AAAA;AAC1E,EAEA,QAAoC,KAAqD,EAAA;AACvF,IAAA,OAAO,QAAQ,KAAM,CAAA,WAAA,EAAa,IAAM,EAAA,CAAC,KAAK,CAAC,CAAA;AAAA;AACjD,EAEA,QAAA,CACE,WACA,SAC2B,EAAA;AAC3B,IAAM,MAAA,EAAE,IAAAM,EAAAA,KAAAA,EAAS,GAAA,IAAA;AACjB,IAAO,OAAA,SAAS,YAAY,KAAe,EAAA;AACzC,MACE,uBAAA,GAAA,CAACA,OAAA,EAAM,GAAG,WACR,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA,EAAW,GAAG,KAAA,EAAO,CACxB,EAAA,CAAA;AAAA,KAEJ;AAAA;AAEJ;AAEO,SAAS,WACd,OACyB,EAAA;AACzB,EAAO,OAAA,IAAI,KAAK,OAAO,CAAA;AACzB;;AC7lBO,SAAS,iBACd,CAAA,KAAA,EACA,QACA,EAAA,OAAA,GAAuC,EACG,EAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAmB,EAAA;AAC7C,EAAA,MAAM,MAAM,MAAO,CAAA,EAAE,UAAU,QAAU,EAAA,OAAA,CAAQ,UAAU,CAAA;AAE3D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAU,GAAA,EAAE,QAAU,EAAA,QAAA,EAAU,QAAQ,QAAS,EAAA;AAAA,GACvD,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAM,MAAA,MAAA,GAAS,QAAQ,MAAM;AAC3B,IAAA,MAAM,EAAE,QAAA,EAAAC,SAAU,EAAA,QAAA,KAAa,GAAI,CAAA,OAAA;AAEnC,IAAMC,MAAAA,OAAAA,GAAS,CAACP,MAAa,KAAA;AAC3B,MAAAM,UAASN,MAAK,CAAA;AACd,MAAA,QAAA,CAAS,SAAS,CAAA;AAClB,MAAA,QAAA,GAAWA,MAAK,CAAA;AAAA,KAClB;AAEA,IAAI,IAAA,aAAA;AAEJ,IAAA,IAAI,QAAQ,QAAU,EAAA;AACpB,MAAgB,aAAA,GAAA,QAAA,CAASO,OAAQ,EAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,KACnD,MAAA,IAAW,QAAQ,QAAU,EAAA;AAC3B,MAAgB,aAAA,GAAA,QAAA,CAASA,OAAQ,EAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,KAC5C,MAAA;AACL,MAAA,aAAA,GAAgB,CAACP,MAAU,KAAA,eAAA,CAAgB,MAAMO,OAAAA,CAAOP,MAAK,CAAC,CAAA;AAAA;AAGhE,IAAA,OAAO,CAACA,MAAa,KAAA;AACnB,MAAS,QAAA,CAAA,EAAE,CAAGA,EAAAA,MAAAA,EAAO,CAAA;AACrB,MAAA,aAAA,CAAcA,MAAK,CAAA;AAAA,KACrB;AAAA,GACF,EAAG,CAAC,UAAA,CAAW,CAAC,OAAA,CAAQ,UAAU,OAAQ,CAAA,QAAQ,CAAC,CAAC,CAAC,CAAA;AAErD,EAAA,OAAO,CAAC,KAAA,GAAQ,KAAM,CAAA,CAAA,GAAI,OAAO,MAAM,CAAA;AACzC;;AClDO,SAAS,UAAa,KAAqB,EAAA;AAChD,EAAA,OAAO,MAAM,OAAQ,CAAA,KAAK,CAAI,GAAA,KAAA,GAAQ,CAAC,KAAK,CAAA;AAC9C;;ACEO,SAAS,gBAAiB,CAAA;AAAA,EAC/B,GAAA;AAAA,EACA,IAAO,GAAA;AACT,CAGS,EAAA;AACP,EAAA,SAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AACxC,MAAM,MAAA,UAAA,GAAa,IAAI,eAAgB,CAAA,GAAA,CAAI,IAAI,CAAE,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA;AAEzD,MAAW,KAAA,MAAA,IAAA,IAAQ,SAAU,CAAA,GAAG,CAAG,EAAA;AACjC,QAAA,UAAA,CAAW,OAAO,IAAI,CAAA;AAAA;AAGxB,MAAI,GAAA,CAAA,IAAI,CAAI,GAAA,UAAA,CAAW,QAAS,EAAA;AAChC,MAAA,MAAA,CAAO,QAAQ,YAAa,CAAA,IAAA,EAAM,EAAI,EAAA,GAAA,CAAI,UAAU,CAAA;AAAA,KACtD;AAAA,IACA,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG,IAAI;AAAA,GACxB;AACF;;;;"}
|
|
@@ -59,12 +59,13 @@ export interface FormDerivedState<TDraft> {
|
|
|
59
59
|
}
|
|
60
60
|
export interface FormContext<TDraft, TOriginal> {
|
|
61
61
|
formState: Store<FormState<TDraft>>;
|
|
62
|
-
derivedState: Store<FormDerivedState<TDraft>>;
|
|
63
62
|
options: FormOptions<TDraft, TOriginal>;
|
|
64
63
|
original: TOriginal | undefined;
|
|
65
64
|
getField: <TPath extends string>(path: TPath) => Field<TDraft, TOriginal, TPath>;
|
|
66
65
|
getDraft: () => TDraft;
|
|
67
66
|
hasTriggeredValidations: () => boolean;
|
|
67
|
+
saveScheduled: () => boolean;
|
|
68
|
+
saveInProgress: () => boolean;
|
|
68
69
|
hasChanges: () => boolean;
|
|
69
70
|
getErrors: () => Map<string, string[]>;
|
|
70
71
|
isValid: () => boolean;
|
|
@@ -73,6 +74,7 @@ export interface FormContext<TDraft, TOriginal> {
|
|
|
73
74
|
}
|
|
74
75
|
export interface FormInstance<TDraft, TOriginal> extends FormDerivedState<TDraft>, Pick<FormContext<TDraft, TOriginal>, 'options' | 'original' | 'getField' | 'validate' | 'reset'> {
|
|
75
76
|
}
|
|
77
|
+
export declare function getDerivedState<TDraft>(instance: FormContext<TDraft, any>): FormDerivedState<TDraft>;
|
|
76
78
|
export declare class Form<TDraft, TOriginal extends TDraft = TDraft> {
|
|
77
79
|
readonly options: FormOptions<TDraft, TOriginal>;
|
|
78
80
|
context: Context<FormContext<TDraft, TOriginal> | null>;
|