cogsbox-state 0.5.449 → 0.5.450

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.449",
3
+ "version": "0.5.450",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/CogsState.tsx CHANGED
@@ -683,6 +683,47 @@ export const createCogsState = <State extends Record<StateKeys, unknown>>(
683
683
 
684
684
  return { useCogsState, setCogsOptions } as CogsApi<State>;
685
685
  };
686
+
687
+ // First, let's create a proper type to extract API params from the sync schema
688
+ type ExtractApiParamsFromSchema<T> = T extends {
689
+ apiParamsSchema: z.ZodObject<infer U>;
690
+ }
691
+ ? { [K in keyof U]: z.infer<U[K]> }
692
+ : never;
693
+
694
+ // Type to check if a schema has API params
695
+ type HasApiParams<T> = T extends { apiParamsSchema: z.ZodObject<any> }
696
+ ? true
697
+ : false;
698
+
699
+ // Create the proper return type for useCogsState
700
+ type UseCogsStateFromSync<
701
+ TSyncSchema extends {
702
+ schemas: Record<
703
+ string,
704
+ { schemas: { defaultValues: any }; apiParamsSchema?: z.ZodObject<any> }
705
+ >;
706
+ },
707
+ > = {
708
+ // For schemas WITH API params - require apiParams
709
+ <K extends keyof TSyncSchema['schemas']>(
710
+ stateKey: K,
711
+ options: HasApiParams<TSyncSchema['schemas'][K]> extends true
712
+ ? OptionsType<TSyncSchema['schemas'][K]['schemas']['defaultValues']> & {
713
+ apiParams: ExtractApiParamsFromSchema<TSyncSchema['schemas'][K]>;
714
+ }
715
+ : never
716
+ ): StateObject<TSyncSchema['schemas'][K]['schemas']['defaultValues']>;
717
+
718
+ // For schemas WITHOUT API params - apiParams is optional
719
+ <K extends keyof TSyncSchema['schemas']>(
720
+ stateKey: K,
721
+ options?: HasApiParams<TSyncSchema['schemas'][K]> extends true
722
+ ? never
723
+ : OptionsType<TSyncSchema['schemas'][K]['schemas']['defaultValues']>
724
+ ): StateObject<TSyncSchema['schemas'][K]['schemas']['defaultValues']>;
725
+ };
726
+ // Simplified approach that actually works
686
727
  export function createCogsStateFromSync<
687
728
  TSyncSchema extends {
688
729
  schemas: Record<
@@ -711,12 +752,31 @@ export function createCogsStateFromSync<
711
752
  __syncNotifications: syncSchema.notifications,
712
753
  });
713
754
 
714
- // Override the useCogsState function to handle apiParams properly
755
+ // Create a wrapper that validates API params at runtime
715
756
  const useCogsState = <K extends keyof TSyncSchema['schemas']>(
716
757
  stateKey: K,
717
- options?: any // Just make this flexible
718
- ) => {
719
- return baseApi.useCogsState(stateKey as any, options);
758
+ options?: OptionsType<
759
+ TSyncSchema['schemas'][K]['schemas']['defaultValues']
760
+ > & {
761
+ apiParams?: any; // We'll validate this at runtime
762
+ }
763
+ ): StateObject<TSyncSchema['schemas'][K]['schemas']['defaultValues']> => {
764
+ // Runtime validation of API params
765
+ const schemaEntry = schemas[stateKey as keyof typeof schemas];
766
+ if (schemaEntry?.apiParamsSchema && options?.apiParams) {
767
+ // Validate the API params at runtime
768
+ const result = schemaEntry.apiParamsSchema.safeParse(options.apiParams);
769
+ if (!result.success) {
770
+ throw new Error(
771
+ `Invalid API params for ${String(stateKey)}: ${result.error.message}`
772
+ );
773
+ }
774
+ }
775
+
776
+ // Cast to the correct type since we know it's properly typed
777
+ return baseApi.useCogsState(stateKey as any, options as any) as StateObject<
778
+ TSyncSchema['schemas'][K]['schemas']['defaultValues']
779
+ >;
720
780
  };
721
781
 
722
782
  return {
@@ -724,7 +784,6 @@ export function createCogsStateFromSync<
724
784
  setCogsOptions: baseApi.setCogsOptions,
725
785
  };
726
786
  }
727
-
728
787
  const {
729
788
  getInitialOptions,
730
789
  getValidationErrors,