cogsbox-state 0.5.476 → 0.5.479

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/src/plugins.ts CHANGED
@@ -1,14 +1,71 @@
1
1
  import { z } from 'zod';
2
2
  import type React from 'react';
3
3
  import { StateObject, UpdateTypeDetail } from './CogsState';
4
- import { getGlobalStore } from './store';
4
+ import {
5
+ getGlobalStore,
6
+ getAllFieldElements,
7
+ setAllFieldsDisabled,
8
+ } from './store';
5
9
  import { ClientActivityEvent } from './pluginStore';
10
+ import { RefObject } from 'react';
6
11
 
7
12
  type Prettify<T> = { [K in keyof T]: T[K] } & {};
8
13
 
14
+ export type ChainMethodTarget =
15
+ | 'any'
16
+ | 'array'
17
+ | 'object'
18
+ | 'primitive'
19
+ | 'boolean';
20
+
21
+ export type ChainMethodContext<TOptions = any, THookReturn = any> = {
22
+ stateKey: string;
23
+ path: string[];
24
+ pluginName: string;
25
+ options: TOptions | undefined;
26
+ hookData?: THookReturn;
27
+ $get: () => any;
28
+ $update: (payload: any) => { synced: () => void };
29
+ $applyOperation: (operation: any, metaData?: Record<string, any>) => void;
30
+ getFieldMetaData: () => any;
31
+ setFieldMetaData: (data: Record<string, any>) => void;
32
+ removeFieldMetaData: () => void;
33
+ getFieldRefs: () => RefObject<any>[];
34
+ getFieldElements: () => HTMLElement[];
35
+ setFieldDisabled: (disabled: boolean) => void;
36
+ };
37
+
38
+ export type ChainMethodHandler = (
39
+ ctx: ChainMethodContext<any, any>,
40
+ ...args: any[]
41
+ ) => any;
42
+
43
+ export type ChainMethodDefinition<
44
+ THandler extends ChainMethodHandler = ChainMethodHandler,
45
+ > = {
46
+ target: ChainMethodTarget;
47
+ pathPattern?: string[];
48
+ handler: THandler;
49
+ };
50
+
51
+ export type ChainMethodDefinitions = Record<string, ChainMethodDefinition<any>>;
52
+
53
+ type ChainMethodCallable<THandler> = THandler extends (
54
+ ctx: any,
55
+ ...args: infer TArgs
56
+ ) => infer TReturn
57
+ ? (...args: TArgs) => TReturn
58
+ : never;
59
+
60
+ export type ChainMethodCallables<TMethods> = {
61
+ [K in keyof TMethods]: TMethods[K] extends ChainMethodDefinition<infer TFn>
62
+ ? ChainMethodCallable<TFn>
63
+ : never;
64
+ };
65
+
9
66
  export type KeyedTypes<TMap extends Record<string, any>> = {
10
67
  __key: 'keyed';
11
- map: { [K in keyof TMap]: TMap[K] };
68
+ map: TMap;
12
69
  };
13
70
 
14
71
  export const keyedSchema = <TMap extends Record<string, any>>() =>
@@ -58,6 +115,9 @@ type ScopedMetadataMethods<TFieldMetaData> = {
58
115
  getFieldMetaData: () => TFieldMetaData | undefined;
59
116
  setFieldMetaData: (data: Partial<TFieldMetaData>) => void;
60
117
  removeFieldMetaData: () => void;
118
+ getFieldRefs: () => RefObject<any>[];
119
+ getFieldElements: () => HTMLElement[];
120
+ setFieldDisabled: (disabled: boolean) => void;
61
121
  };
62
122
 
63
123
  // These are the existing global methods that still require a path.
@@ -65,6 +125,11 @@ type GlobalMetadataMethods<TFieldMetaData> = {
65
125
  getFieldMetaData: (path: string[]) => TFieldMetaData | undefined;
66
126
  setFieldMetaData: (path: string[], data: Partial<TFieldMetaData>) => void;
67
127
  removeFieldMetaData: (path: string[]) => void;
128
+ getFieldRefs: (path: string[]) => RefObject<any>[];
129
+ getFieldElements: (path: string[]) => HTMLElement[];
130
+ setFieldDisabled: (path: string[], disabled: boolean) => void;
131
+ getAllFieldElements: () => HTMLElement[];
132
+ setAllFieldsDisabled: (disabled: boolean) => void;
68
133
  };
69
134
  // Simplified: All params use the same TFieldMetaData type
70
135
  export type UseHookParams<
@@ -193,9 +258,13 @@ export type CogsPlugin<
193
258
  THookReturn,
194
259
  TPluginMetaData,
195
260
  TFieldMetaData,
261
+ TChainMethods extends ChainMethodDefinitions = {},
262
+ TInitialState extends Record<string, unknown> = {},
196
263
  > = {
197
264
  name: TName;
198
265
 
266
+ initialState?: () => TInitialState;
267
+
199
268
  useHook?: (
200
269
  params: UseHookParams<TOptions, TPluginMetaData, TFieldMetaData, any>
201
270
  ) => THookReturn;
@@ -239,6 +308,8 @@ export type CogsPlugin<
239
308
  any
240
309
  >
241
310
  ) => React.ReactNode;
311
+
312
+ chainMethods?: TChainMethods;
242
313
  };
243
314
 
244
315
  // Metadata helpers
@@ -276,6 +347,45 @@ export function createMetadataContext<TPluginMetaData, TFieldMetaData>(
276
347
  getGlobalStore
277
348
  .getState()
278
349
  .removePluginMetaData(stateKey, path, pluginName),
350
+ getFieldRefs: (path: string[]): RefObject<any>[] => {
351
+ const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);
352
+ if (!meta?.clientActivityState?.elements) return [];
353
+ const refs: RefObject<any>[] = [];
354
+ meta.clientActivityState.elements.forEach((entry: any) => {
355
+ if (entry.domRef?.current) refs.push(entry.domRef);
356
+ });
357
+ return refs;
358
+ },
359
+
360
+ getFieldElements: (path: string[]): HTMLElement[] => {
361
+ const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);
362
+ if (!meta?.clientActivityState?.elements) return [];
363
+ const elements: HTMLElement[] = [];
364
+ meta.clientActivityState.elements.forEach((entry: any) => {
365
+ if (entry.domRef?.current) elements.push(entry.domRef.current);
366
+ });
367
+ return elements;
368
+ },
369
+
370
+ setFieldDisabled: (path: string[], disabled: boolean) => {
371
+ const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);
372
+ if (!meta?.clientActivityState?.elements) return;
373
+ meta.clientActivityState.elements.forEach((entry: any) => {
374
+ const el = entry.domRef?.current;
375
+ if (!el) return;
376
+ if ('disabled' in el) el.disabled = disabled;
377
+ else {
378
+ el.style.pointerEvents = disabled ? 'none' : '';
379
+ el.setAttribute('aria-disabled', String(disabled));
380
+ }
381
+ });
382
+ },
383
+ getAllFieldElements: (): HTMLElement[] => {
384
+ return getAllFieldElements(stateKey);
385
+ },
386
+
387
+ setAllFieldsDisabled: (disabled: boolean): void =>
388
+ setAllFieldsDisabled(stateKey, disabled),
279
389
  };
280
390
  }
281
391
 
@@ -290,19 +400,54 @@ export function createScopedMetadataContext<TPluginMetaData, TFieldMetaData>(
290
400
  );
291
401
 
292
402
  return {
293
- // Return the global methods for plugin metadata
294
403
  ...globalContext,
295
- // Override the field methods with new, path-scoped versions
296
404
  getFieldMetaData: (): TFieldMetaData | undefined =>
297
405
  globalContext.getFieldMetaData(path),
298
-
299
406
  setFieldMetaData: (data: Partial<TFieldMetaData>) =>
300
407
  globalContext.setFieldMetaData(path, data),
301
-
302
408
  removeFieldMetaData: () => globalContext.removeFieldMetaData(path),
409
+
410
+ // NEW: Direct access to the DOM refs for this field
411
+ getFieldRefs: (): RefObject<any>[] => {
412
+ const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);
413
+ if (!meta?.clientActivityState?.elements) return [];
414
+ const refs: RefObject<any>[] = [];
415
+ meta.clientActivityState.elements.forEach((entry: any) => {
416
+ if (entry.domRef?.current) {
417
+ refs.push(entry.domRef);
418
+ }
419
+ });
420
+ return refs;
421
+ },
422
+
423
+ getFieldElements: (): HTMLElement[] => {
424
+ const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);
425
+ if (!meta?.clientActivityState?.elements) return [];
426
+ const elements: HTMLElement[] = [];
427
+ meta.clientActivityState.elements.forEach((entry: any) => {
428
+ if (entry.domRef?.current) {
429
+ elements.push(entry.domRef.current);
430
+ }
431
+ });
432
+ return elements;
433
+ },
434
+
435
+ setFieldDisabled: (disabled: boolean) => {
436
+ const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);
437
+ if (!meta?.clientActivityState?.elements) return;
438
+ meta.clientActivityState.elements.forEach((entry: any) => {
439
+ const el = entry.domRef?.current;
440
+ if (!el) return;
441
+ if ('disabled' in el) {
442
+ el.disabled = disabled;
443
+ } else {
444
+ el.style.pointerEvents = disabled ? 'none' : '';
445
+ el.setAttribute('aria-disabled', String(disabled));
446
+ }
447
+ });
448
+ },
303
449
  };
304
450
  }
305
-
306
451
  // Add this type export - derives from what createScopedMetadataContext returns
307
452
  export type ScopedMetadataContext<TFieldMetaData = any> = {
308
453
  getFieldMetaData: () => TFieldMetaData | undefined;
@@ -323,200 +468,769 @@ type ZodObjOutput<T extends z.ZodObject<any>> = {
323
468
  type OutputOf<T extends z.ZodTypeAny> =
324
469
  T extends z.ZodObject<any> ? Prettify<ZodObjOutput<T>> : z.output<T>;
325
470
 
471
+ type MethodFactory = <THandler extends ChainMethodHandler>(
472
+ handler: THandler
473
+ ) => ChainMethodDefinition<THandler>;
474
+
475
+ type PathMethodFactory = MethodFactory & {
476
+ array: MethodFactory;
477
+ object: MethodFactory;
478
+ primitive: MethodFactory;
479
+ boolean: MethodFactory;
480
+ field: MethodFactory;
481
+ };
482
+
483
+ type MethodsBuilderParams = {
484
+ path: (selector: (state: any) => any) => PathMethodFactory;
485
+ array: MethodFactory;
486
+ object: MethodFactory;
487
+ primitive: MethodFactory;
488
+ boolean: MethodFactory;
489
+ field: MethodFactory;
490
+ };
491
+
492
+ const createMethodDefinition =
493
+ (target: ChainMethodTarget, pathPattern?: string[]): MethodFactory =>
494
+ (handler) => ({
495
+ target,
496
+ pathPattern,
497
+ handler,
498
+ });
499
+
500
+ const createPathRecorder = () => {
501
+ const path: string[] = [];
502
+
503
+ const recorder = new Proxy(
504
+ {},
505
+ {
506
+ get(_target, prop) {
507
+ if (typeof prop !== 'string') return recorder;
508
+ if (prop === 'then') return undefined;
509
+ path.push(prop === '$' ? '*' : prop);
510
+ return recorder;
511
+ },
512
+ }
513
+ );
514
+
515
+ return { recorder, path };
516
+ };
517
+
518
+ const createMethodsBuilderParams = (): MethodsBuilderParams => {
519
+ const path = (selector: (state: any) => any): PathMethodFactory => {
520
+ const { recorder, path: pathPattern } = createPathRecorder();
521
+ selector(recorder);
522
+
523
+ const base = createMethodDefinition(
524
+ 'any',
525
+ pathPattern
526
+ ) as PathMethodFactory;
527
+ base.array = createMethodDefinition('array', pathPattern);
528
+ base.object = createMethodDefinition('object', pathPattern);
529
+ base.primitive = createMethodDefinition('primitive', pathPattern);
530
+ base.boolean = createMethodDefinition('boolean', pathPattern);
531
+ base.field = createMethodDefinition('any', pathPattern);
532
+
533
+ return base;
534
+ };
535
+
536
+ return {
537
+ path,
538
+ array: createMethodDefinition('array'),
539
+ object: createMethodDefinition('object'),
540
+ primitive: createMethodDefinition('primitive'),
541
+ boolean: createMethodDefinition('boolean'),
542
+ field: createMethodDefinition('any'),
543
+ };
544
+ };
545
+ // --- EXTRACTED BUILDER TYPES (Solves TS7056 Serialization Error) ---
546
+
547
+ export type PluginTransformFn<
548
+ TOptions,
549
+ THookReturn,
550
+ TPluginMetaData,
551
+ TFieldMetaData,
552
+ > = (
553
+ params: TransformStateParams<
554
+ TOptions,
555
+ THookReturn,
556
+ TPluginMetaData,
557
+ TFieldMetaData,
558
+ any
559
+ >
560
+ ) => void;
561
+
562
+ export type PluginUpdateFn<
563
+ TOptions,
564
+ THookReturn,
565
+ TPluginMetaData,
566
+ TFieldMetaData,
567
+ > = (
568
+ params: OnUpdateParams<
569
+ TOptions,
570
+ THookReturn,
571
+ TPluginMetaData,
572
+ TFieldMetaData,
573
+ any
574
+ >
575
+ ) => void;
576
+
577
+ export type PluginFormUpdateFn<
578
+ TOptions,
579
+ THookReturn,
580
+ TPluginMetaData,
581
+ TFieldMetaData,
582
+ > = (
583
+ params: OnFormUpdateParams<
584
+ TOptions,
585
+ THookReturn,
586
+ TPluginMetaData,
587
+ TFieldMetaData,
588
+ any
589
+ >
590
+ ) => void;
591
+
592
+ export type PluginFormWrapperFn<
593
+ TOptions,
594
+ THookReturn,
595
+ TPluginMetaData,
596
+ TFieldMetaData,
597
+ > = (
598
+ params: FormWrapperParams<
599
+ TOptions,
600
+ THookReturn,
601
+ TPluginMetaData,
602
+ TFieldMetaData,
603
+ any
604
+ >
605
+ ) => React.ReactNode;
606
+
607
+ export type CogsPluginBuilder<
608
+ TName extends string,
609
+ TOptions,
610
+ TPluginMetaData,
611
+ TFieldMetaData,
612
+ THookReturn,
613
+ TChainMethods extends ChainMethodDefinitions,
614
+ HasTransform extends boolean,
615
+ HasUpdate extends boolean,
616
+ HasFormUpdate extends boolean,
617
+ HasMethods extends boolean,
618
+ HasWrapper extends boolean,
619
+ HasInitialState extends boolean,
620
+ TInitialState extends Record<string, unknown> = {},
621
+ > = Prettify<
622
+ CogsPlugin<
623
+ TName,
624
+ TOptions,
625
+ THookReturn,
626
+ TPluginMetaData,
627
+ TFieldMetaData,
628
+ TChainMethods,
629
+ TInitialState
630
+ >
631
+ > &
632
+ (HasTransform extends true
633
+ ? {}
634
+ : {
635
+ transformState(
636
+ fn: PluginTransformFn<
637
+ TOptions,
638
+ THookReturn,
639
+ TPluginMetaData,
640
+ TFieldMetaData
641
+ >
642
+ ): CogsPluginBuilder<
643
+ TName,
644
+ TOptions,
645
+ TPluginMetaData,
646
+ TFieldMetaData,
647
+ THookReturn,
648
+ TChainMethods,
649
+ true,
650
+ HasUpdate,
651
+ HasFormUpdate,
652
+ HasMethods,
653
+ HasWrapper,
654
+ HasInitialState,
655
+ TInitialState
656
+ >;
657
+ }) &
658
+ (HasUpdate extends true
659
+ ? {}
660
+ : {
661
+ onUpdate(
662
+ fn: PluginUpdateFn<
663
+ TOptions,
664
+ THookReturn,
665
+ TPluginMetaData,
666
+ TFieldMetaData
667
+ >
668
+ ): CogsPluginBuilder<
669
+ TName,
670
+ TOptions,
671
+ TPluginMetaData,
672
+ TFieldMetaData,
673
+ THookReturn,
674
+ TChainMethods,
675
+ HasTransform,
676
+ true,
677
+ HasFormUpdate,
678
+ HasMethods,
679
+ HasWrapper,
680
+ HasInitialState,
681
+ TInitialState
682
+ >;
683
+ }) &
684
+ (HasFormUpdate extends true
685
+ ? {}
686
+ : {
687
+ onFormUpdate(
688
+ fn: PluginFormUpdateFn<
689
+ TOptions,
690
+ THookReturn,
691
+ TPluginMetaData,
692
+ TFieldMetaData
693
+ >
694
+ ): CogsPluginBuilder<
695
+ TName,
696
+ TOptions,
697
+ TPluginMetaData,
698
+ TFieldMetaData,
699
+ THookReturn,
700
+ TChainMethods,
701
+ HasTransform,
702
+ HasUpdate,
703
+ true,
704
+ HasMethods,
705
+ HasWrapper,
706
+ HasInitialState,
707
+ TInitialState
708
+ >;
709
+ }) &
710
+ (HasMethods extends true
711
+ ? {}
712
+ : {
713
+ methods<TNextMethods extends ChainMethodDefinitions>(
714
+ fn: (helpers: MethodsBuilderParams) => TNextMethods
715
+ ): CogsPluginBuilder<
716
+ TName,
717
+ TOptions,
718
+ TPluginMetaData,
719
+ TFieldMetaData,
720
+ THookReturn,
721
+ TNextMethods,
722
+ HasTransform,
723
+ HasUpdate,
724
+ HasFormUpdate,
725
+ true,
726
+ HasWrapper,
727
+ HasInitialState,
728
+ TInitialState
729
+ >;
730
+ }) &
731
+ (HasWrapper extends true
732
+ ? {}
733
+ : {
734
+ formWrapper(
735
+ fn: PluginFormWrapperFn<
736
+ TOptions,
737
+ THookReturn,
738
+ TPluginMetaData,
739
+ TFieldMetaData
740
+ >
741
+ ): CogsPluginBuilder<
742
+ TName,
743
+ TOptions,
744
+ TPluginMetaData,
745
+ TFieldMetaData,
746
+ THookReturn,
747
+ TChainMethods,
748
+ HasTransform,
749
+ HasUpdate,
750
+ HasFormUpdate,
751
+ HasMethods,
752
+ true,
753
+ HasInitialState,
754
+ TInitialState
755
+ >;
756
+ }) &
757
+ (HasInitialState extends true
758
+ ? {}
759
+ : {
760
+ initialState<TNewState extends Record<string, unknown>>(
761
+ fn: () => TNewState
762
+ ): CogsPluginBuilder<
763
+ TName,
764
+ TOptions,
765
+ TPluginMetaData,
766
+ TFieldMetaData,
767
+ THookReturn,
768
+ TChainMethods,
769
+ HasTransform,
770
+ HasUpdate,
771
+ HasFormUpdate,
772
+ HasMethods,
773
+ HasWrapper,
774
+ true,
775
+ TNewState
776
+ >;
777
+ });
778
+
779
+ export type CreatePluginStart<
780
+ TName extends string,
781
+ TOptions,
782
+ TPluginMetaData,
783
+ TFieldMetaData,
784
+ > = CogsPluginBuilder<
785
+ TName,
786
+ TOptions,
787
+ TPluginMetaData,
788
+ TFieldMetaData,
789
+ never,
790
+ {},
791
+ false,
792
+ false,
793
+ false,
794
+ false,
795
+ false,
796
+ false,
797
+ {}
798
+ > & {
799
+ useHook<THookReturn>(
800
+ hookFn: (
801
+ params: UseHookParams<TOptions, TPluginMetaData, TFieldMetaData, any>
802
+ ) => THookReturn
803
+ ): CogsPluginBuilder<
804
+ TName,
805
+ TOptions,
806
+ TPluginMetaData,
807
+ TFieldMetaData,
808
+ THookReturn,
809
+ {},
810
+ false,
811
+ false,
812
+ false,
813
+ false,
814
+ false,
815
+ false,
816
+ {}
817
+ >;
818
+ initialState<TNewState extends Record<string, unknown>>(
819
+ fn: () => TNewState
820
+ ): CogsPluginBuilder<
821
+ TName,
822
+ TOptions,
823
+ TPluginMetaData,
824
+ TFieldMetaData,
825
+ never,
826
+ {},
827
+ false,
828
+ false,
829
+ false,
830
+ false,
831
+ false,
832
+ true,
833
+ TNewState
834
+ >;
835
+ };
836
+
837
+ // --- UPDATED EXPLICIT CONTEXT ---
838
+
326
839
  export function createPluginContext<
327
- O extends z.ZodTypeAny,
840
+ O extends z.ZodTypeAny | undefined = undefined,
328
841
  PM extends z.ZodTypeAny | undefined = undefined,
329
842
  FM extends z.ZodTypeAny | undefined = undefined,
330
- >(schemas: { options: O; pluginMetaData?: PM; fieldMetaData?: FM }) {
331
- // Crucial: compute from the generic params, not from an object-indexed optional type
332
- type Options = OutputOf<O>;
843
+ >(schemas?: {
844
+ options?: O;
845
+ pluginMetaData?: PM;
846
+ fieldMetaData?: FM;
847
+ }): {
848
+ // EXPLICIT RETURN ANNOTATION STOPS TS FROM SERIALIZING
849
+ createPlugin: <TName extends string>(
850
+ name: TName
851
+ ) => CreatePluginStart<
852
+ TName,
853
+ O extends z.ZodTypeAny ? OutputOf<O> : undefined,
854
+ PM extends z.ZodTypeAny ? OutputOf<PM> : unknown,
855
+ FM extends z.ZodTypeAny ? OutputOf<FM> : unknown
856
+ >;
857
+ } {
858
+ type Options = O extends z.ZodTypeAny ? OutputOf<O> : undefined;
333
859
  type PluginMetaData = PM extends z.ZodTypeAny ? OutputOf<PM> : unknown;
334
860
  type FieldMetaData = FM extends z.ZodTypeAny ? OutputOf<FM> : unknown;
335
861
 
336
862
  function createPlugin<TName extends string>(name: TName) {
337
- type TransformFn<THookReturn> = (
338
- params: TransformStateParams<
863
+ type Builder<
864
+ THookReturn,
865
+ TChainMethods extends ChainMethodDefinitions,
866
+ HT extends boolean,
867
+ HU extends boolean,
868
+ HFU extends boolean,
869
+ HM extends boolean,
870
+ HW extends boolean,
871
+ HI extends boolean,
872
+ TInitialState extends Record<string, unknown> = {},
873
+ > = CogsPluginBuilder<
874
+ TName,
875
+ Options,
876
+ PluginMetaData,
877
+ FieldMetaData,
878
+ THookReturn,
879
+ TChainMethods,
880
+ HT,
881
+ HU,
882
+ HFU,
883
+ HM,
884
+ HW,
885
+ HI,
886
+ TInitialState
887
+ >;
888
+
889
+ const createPluginObject = <
890
+ THookReturn = never,
891
+ TChainMethods extends ChainMethodDefinitions = {},
892
+ TInitialState extends Record<string, unknown> = {},
893
+ >(
894
+ hookFn?: (
895
+ params: UseHookParams<Options, PluginMetaData, FieldMetaData, any>
896
+ ) => THookReturn,
897
+ transformFn?: PluginTransformFn<
339
898
  Options,
340
899
  THookReturn,
341
900
  PluginMetaData,
342
901
  FieldMetaData
343
- >
344
- ) => void;
345
-
346
- type UpdateFn<THookReturn> = (
347
- params: OnUpdateParams<
902
+ >,
903
+ updateHandler?: PluginUpdateFn<
348
904
  Options,
349
905
  THookReturn,
350
906
  PluginMetaData,
351
907
  FieldMetaData
352
- >
353
- ) => void;
354
-
355
- type FormUpdateFn<THookReturn> = (
356
- params: OnFormUpdateParams<
908
+ >,
909
+ formUpdateHandler?: PluginFormUpdateFn<
910
+ Options,
911
+ THookReturn,
912
+ PluginMetaData,
913
+ FieldMetaData
914
+ >,
915
+ chainMethods?: TChainMethods,
916
+ initialStateFn?: () => TInitialState,
917
+ wrapperFn?: PluginFormWrapperFn<
357
918
  Options,
358
919
  THookReturn,
359
920
  PluginMetaData,
360
921
  FieldMetaData
361
922
  >
362
- ) => void;
363
-
364
- type Plugin<THookReturn> = Prettify<
365
- CogsPlugin<TName, Options, THookReturn, PluginMetaData, FieldMetaData>
366
- >;
367
-
368
- const createPluginObject = <THookReturn = never>(
369
- hookFn?: (
370
- params: UseHookParams<Options, PluginMetaData, FieldMetaData>
371
- ) => THookReturn,
372
- transformFn?: TransformFn<THookReturn>,
373
- updateHandler?: UpdateFn<THookReturn>,
374
- formUpdateHandler?: FormUpdateFn<THookReturn>
375
- ): Plugin<THookReturn> => {
923
+ ): Prettify<
924
+ CogsPlugin<
925
+ TName,
926
+ Options,
927
+ THookReturn,
928
+ PluginMetaData,
929
+ FieldMetaData,
930
+ TChainMethods,
931
+ TInitialState
932
+ >
933
+ > => {
376
934
  return {
377
935
  name,
936
+ initialState: initialStateFn,
378
937
  useHook: hookFn as any,
379
938
  transformState: transformFn as any,
380
939
  onUpdate: updateHandler as any,
381
940
  onFormUpdate: formUpdateHandler as any,
941
+ formWrapper: wrapperFn as any,
942
+ chainMethods,
382
943
  };
383
944
  };
384
945
 
385
- type BuildRet<
386
- THookReturn,
387
- HasTransform extends boolean,
388
- HasUpdate extends boolean,
389
- HasFormUpdate extends boolean,
390
- HasWrapper extends boolean,
391
- > = Plugin<THookReturn> &
392
- (HasTransform extends true
393
- ? {}
394
- : {
395
- transformState(
396
- fn: TransformFn<THookReturn>
397
- ): BuildRet<
398
- THookReturn,
399
- true,
400
- HasUpdate,
401
- HasFormUpdate,
402
- HasWrapper
403
- >;
404
- }) &
405
- (HasUpdate extends true
406
- ? {}
407
- : {
408
- onUpdate(
409
- fn: UpdateFn<THookReturn>
410
- ): BuildRet<
411
- THookReturn,
412
- HasTransform,
413
- true,
414
- HasFormUpdate,
415
- HasWrapper
416
- >;
417
- }) &
418
- (HasFormUpdate extends true
419
- ? {}
420
- : {
421
- onFormUpdate(
422
- fn: FormUpdateFn<THookReturn>
423
- ): BuildRet<THookReturn, HasTransform, HasUpdate, true, HasWrapper>;
424
- });
425
-
426
946
  function createBuilder<
427
947
  THookReturn = never,
948
+ TChainMethods extends ChainMethodDefinitions = {},
428
949
  HasTransform extends boolean = false,
429
950
  HasUpdate extends boolean = false,
430
951
  HasFormUpdate extends boolean = false,
952
+ HasMethods extends boolean = false,
431
953
  HasWrapper extends boolean = false,
954
+ HasInitialState extends boolean = false,
955
+ TInitialState extends Record<string, unknown> = {},
432
956
  >(
433
957
  hookFn?: (
434
- params: UseHookParams<Options, PluginMetaData, FieldMetaData>
958
+ params: UseHookParams<Options, PluginMetaData, FieldMetaData, any>
435
959
  ) => THookReturn,
436
- transformFn?: TransformFn<THookReturn>,
437
- updateHandler?: UpdateFn<THookReturn>,
438
- formUpdateHandler?: FormUpdateFn<THookReturn>
439
- ): BuildRet<
960
+ transformFn?: PluginTransformFn<
961
+ Options,
962
+ THookReturn,
963
+ PluginMetaData,
964
+ FieldMetaData
965
+ >,
966
+ updateHandler?: PluginUpdateFn<
967
+ Options,
968
+ THookReturn,
969
+ PluginMetaData,
970
+ FieldMetaData
971
+ >,
972
+ formUpdateHandler?: PluginFormUpdateFn<
973
+ Options,
974
+ THookReturn,
975
+ PluginMetaData,
976
+ FieldMetaData
977
+ >,
978
+ chainMethods?: TChainMethods,
979
+ initialStateFn?: () => TInitialState,
980
+ wrapperFn?: PluginFormWrapperFn<
981
+ Options,
982
+ THookReturn,
983
+ PluginMetaData,
984
+ FieldMetaData
985
+ >
986
+ ): Builder<
440
987
  THookReturn,
988
+ TChainMethods,
441
989
  HasTransform,
442
990
  HasUpdate,
443
991
  HasFormUpdate,
444
- HasWrapper
992
+ HasMethods,
993
+ HasWrapper,
994
+ HasInitialState,
995
+ TInitialState
445
996
  > {
446
- const plugin = createPluginObject<THookReturn>(
997
+ const plugin = createPluginObject<THookReturn, TChainMethods, TInitialState>(
447
998
  hookFn,
448
999
  transformFn,
449
1000
  updateHandler,
450
- formUpdateHandler
1001
+ formUpdateHandler,
1002
+ chainMethods,
1003
+ initialStateFn,
1004
+ wrapperFn
451
1005
  );
452
1006
 
453
1007
  const methods = {} as Partial<
454
- BuildRet<
1008
+ Builder<
455
1009
  THookReturn,
1010
+ TChainMethods,
456
1011
  HasTransform,
457
1012
  HasUpdate,
458
1013
  HasFormUpdate,
459
- HasWrapper
1014
+ HasMethods,
1015
+ HasWrapper,
1016
+ HasInitialState,
1017
+ TInitialState
460
1018
  >
461
1019
  >;
462
1020
 
463
1021
  if (!transformFn) {
464
- (methods as any).transformState = (fn: TransformFn<THookReturn>) =>
1022
+ (methods as any).transformState = (
1023
+ fn: PluginTransformFn<
1024
+ Options,
1025
+ THookReturn,
1026
+ PluginMetaData,
1027
+ FieldMetaData
1028
+ >
1029
+ ) =>
465
1030
  createBuilder<
466
1031
  THookReturn,
1032
+ TChainMethods,
467
1033
  true,
468
1034
  HasUpdate,
469
1035
  HasFormUpdate,
470
- HasWrapper
471
- >(hookFn, fn, updateHandler, formUpdateHandler);
1036
+ HasMethods,
1037
+ HasWrapper,
1038
+ HasInitialState,
1039
+ TInitialState
1040
+ >(
1041
+ hookFn,
1042
+ fn,
1043
+ updateHandler,
1044
+ formUpdateHandler,
1045
+ chainMethods,
1046
+ initialStateFn,
1047
+ wrapperFn
1048
+ );
472
1049
  }
473
1050
  if (!updateHandler) {
474
- (methods as any).onUpdate = (fn: UpdateFn<THookReturn>) =>
1051
+ (methods as any).onUpdate = (
1052
+ fn: PluginUpdateFn<
1053
+ Options,
1054
+ THookReturn,
1055
+ PluginMetaData,
1056
+ FieldMetaData
1057
+ >
1058
+ ) =>
475
1059
  createBuilder<
476
1060
  THookReturn,
1061
+ TChainMethods,
477
1062
  HasTransform,
478
1063
  true,
479
1064
  HasFormUpdate,
480
- HasWrapper
481
- >(hookFn, transformFn, fn, formUpdateHandler);
1065
+ HasMethods,
1066
+ HasWrapper,
1067
+ HasInitialState,
1068
+ TInitialState
1069
+ >(
1070
+ hookFn,
1071
+ transformFn,
1072
+ fn,
1073
+ formUpdateHandler,
1074
+ chainMethods,
1075
+ initialStateFn,
1076
+ wrapperFn
1077
+ );
482
1078
  }
483
1079
  if (!formUpdateHandler) {
484
- (methods as any).onFormUpdate = (fn: FormUpdateFn<THookReturn>) =>
485
- createBuilder<THookReturn, HasTransform, HasUpdate, true, HasWrapper>(
1080
+ (methods as any).onFormUpdate = (
1081
+ fn: PluginFormUpdateFn<
1082
+ Options,
1083
+ THookReturn,
1084
+ PluginMetaData,
1085
+ FieldMetaData
1086
+ >
1087
+ ) =>
1088
+ createBuilder<
1089
+ THookReturn,
1090
+ TChainMethods,
1091
+ HasTransform,
1092
+ HasUpdate,
1093
+ true,
1094
+ HasMethods,
1095
+ HasWrapper,
1096
+ HasInitialState,
1097
+ TInitialState
1098
+ >(
1099
+ hookFn,
1100
+ transformFn,
1101
+ updateHandler,
1102
+ fn,
1103
+ chainMethods,
1104
+ initialStateFn,
1105
+ wrapperFn
1106
+ );
1107
+ }
1108
+ if (!chainMethods) {
1109
+ (methods as any).methods = <
1110
+ TNextMethods extends ChainMethodDefinitions,
1111
+ >(
1112
+ fn: (helpers: MethodsBuilderParams) => TNextMethods
1113
+ ) =>
1114
+ createBuilder<
1115
+ THookReturn,
1116
+ TNextMethods,
1117
+ HasTransform,
1118
+ HasUpdate,
1119
+ HasFormUpdate,
1120
+ true,
1121
+ HasWrapper,
1122
+ HasInitialState,
1123
+ TInitialState
1124
+ >(
1125
+ hookFn,
1126
+ transformFn,
1127
+ updateHandler,
1128
+ formUpdateHandler,
1129
+ fn(createMethodsBuilderParams()),
1130
+ initialStateFn,
1131
+ wrapperFn
1132
+ );
1133
+ }
1134
+ if (!initialStateFn) {
1135
+ (methods as any).initialState = <TNewState extends Record<string, unknown>>(fn: () => TNewState) =>
1136
+ createBuilder<
1137
+ THookReturn,
1138
+ TChainMethods,
1139
+ HasTransform,
1140
+ HasUpdate,
1141
+ HasFormUpdate,
1142
+ HasMethods,
1143
+ HasWrapper,
1144
+ true,
1145
+ TNewState
1146
+ >(
1147
+ hookFn,
1148
+ transformFn,
1149
+ updateHandler,
1150
+ formUpdateHandler,
1151
+ chainMethods,
1152
+ fn,
1153
+ wrapperFn
1154
+ );
1155
+ }
1156
+ if (!wrapperFn) {
1157
+ (methods as any).formWrapper = (
1158
+ fn: PluginFormWrapperFn<
1159
+ Options,
1160
+ THookReturn,
1161
+ PluginMetaData,
1162
+ FieldMetaData
1163
+ >
1164
+ ) =>
1165
+ createBuilder<
1166
+ THookReturn,
1167
+ TChainMethods,
1168
+ HasTransform,
1169
+ HasUpdate,
1170
+ HasFormUpdate,
1171
+ HasMethods,
1172
+ true,
1173
+ HasInitialState,
1174
+ TInitialState
1175
+ >(
486
1176
  hookFn,
487
1177
  transformFn,
488
1178
  updateHandler,
1179
+ formUpdateHandler,
1180
+ chainMethods,
1181
+ initialStateFn,
489
1182
  fn
490
1183
  );
491
1184
  }
492
1185
 
493
- return Object.assign(plugin, methods) as BuildRet<
1186
+ return Object.assign(plugin, methods) as Builder<
494
1187
  THookReturn,
1188
+ TChainMethods,
495
1189
  HasTransform,
496
1190
  HasUpdate,
497
1191
  HasFormUpdate,
498
- HasWrapper
1192
+ HasMethods,
1193
+ HasWrapper,
1194
+ HasInitialState,
1195
+ TInitialState
499
1196
  >;
500
1197
  }
501
1198
 
502
1199
  const start = Object.assign(
503
- createBuilder<never, false, false, false, false>(),
1200
+ createBuilder<never, {}, false, false, false, false, false, false, {}>(),
504
1201
  {
505
1202
  useHook<THookReturn>(
506
1203
  hookFn: (
507
- params: UseHookParams<Options, PluginMetaData, FieldMetaData>
1204
+ params: UseHookParams<Options, PluginMetaData, FieldMetaData, any>
508
1205
  ) => THookReturn
509
1206
  ) {
510
- return createBuilder<THookReturn, false, false, false, false>(hookFn);
1207
+ return createBuilder<
1208
+ THookReturn,
1209
+ {},
1210
+ false,
1211
+ false,
1212
+ false,
1213
+ false,
1214
+ false,
1215
+ false,
1216
+ {}
1217
+ >(hookFn);
1218
+ },
1219
+ initialState<TNewState extends Record<string, unknown>>(fn: () => TNewState) {
1220
+ return createBuilder<
1221
+ never,
1222
+ {},
1223
+ false,
1224
+ false,
1225
+ false,
1226
+ false,
1227
+ false,
1228
+ true,
1229
+ TNewState
1230
+ >(undefined, undefined, undefined, undefined, undefined, fn);
511
1231
  },
512
1232
  }
513
- ) as BuildRet<never, false, false, false, false> & {
514
- useHook<THookReturn>(
515
- hookFn: (
516
- params: UseHookParams<Options, PluginMetaData, FieldMetaData>
517
- ) => THookReturn
518
- ): BuildRet<THookReturn, false, false, false, false>;
519
- };
1233
+ ) as CreatePluginStart<TName, Options, PluginMetaData, FieldMetaData>;
520
1234
 
521
1235
  return start;
522
1236
  }