@spoosh/plugin-optimistic 0.7.1 → 0.7.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/index.d.mts CHANGED
@@ -55,7 +55,7 @@ declare const COMPLETED_BRAND: unique symbol;
55
55
  * @typeParam TUsed - Tracks which methods have been called to prevent duplicate calls
56
56
  * @typeParam TCompleted - Tracks whether UPDATE_CACHE was called (required for valid builder)
57
57
  */
58
- type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath extends string = string, TResponse = unknown, TTiming extends "immediate" | "onSuccess" = "immediate", TUsed extends string = never, TCompleted extends boolean = false> = (TCompleted extends true ? {
58
+ type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath extends string = string, TResponse = unknown, TError = unknown, TTiming extends "immediate" | "onSuccess" = "immediate", TUsed extends string = never, TCompleted extends boolean = false> = (TCompleted extends true ? {
59
59
  readonly [COMPLETED_BRAND]: true;
60
60
  } : unknown) & {
61
61
  /**
@@ -68,7 +68,7 @@ type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath exten
68
68
  * .WHERE(entry => entry.query.page === 1)
69
69
  * ```
70
70
  */
71
- WHERE: IfNotUsed<"WHERE", TUsed, WhereOptions<TMethodConfig, TUserPath> extends never ? never : (predicate: (entry: Simplify<WhereOptions<TMethodConfig, TUserPath>>) => boolean) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "WHERE", TCompleted>>;
71
+ WHERE: IfNotUsed<"WHERE", TUsed, WhereOptions<TMethodConfig, TUserPath> extends never ? never : (predicate: (entry: Simplify<WhereOptions<TMethodConfig, TUserPath>>) => boolean) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "WHERE", TCompleted>>;
72
72
  /**
73
73
  * Specify how to update the cached data optimistically.
74
74
  * This method is required - an optimistic update must have an updater function.
@@ -78,37 +78,37 @@ type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath exten
78
78
  *
79
79
  * @param updater - Function that receives current data (and response if ON_SUCCESS), returns updated data
80
80
  */
81
- UPDATE_CACHE: IfNotUsed<"UPDATE_CACHE", TUsed, TTiming extends "onSuccess" ? (updater: (data: TData, response: TResponse) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "UPDATE_CACHE", true> : (updater: (data: TData) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "UPDATE_CACHE", true>>;
81
+ UPDATE_CACHE: IfNotUsed<"UPDATE_CACHE", TUsed, TTiming extends "onSuccess" ? (updater: (data: TData, response: TResponse) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "UPDATE_CACHE", true> : (updater: (data: TData) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "UPDATE_CACHE", true>>;
82
82
  /**
83
83
  * Apply optimistic update only after mutation succeeds.
84
84
  * By default, updates are applied immediately before mutation completes.
85
85
  * When using ON_SUCCESS, UPDATE_CACHE receives the mutation response as second argument.
86
86
  */
87
- ON_SUCCESS: IfNotUsed<"ON_SUCCESS", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, "onSuccess", TUsed | "ON_SUCCESS", TCompleted>>;
87
+ ON_SUCCESS: IfNotUsed<"ON_SUCCESS", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, "onSuccess", TUsed | "ON_SUCCESS", TCompleted>>;
88
88
  /**
89
89
  * Disable automatic rollback when mutation fails.
90
90
  * By default, optimistic updates are rolled back on error.
91
91
  */
92
- NO_ROLLBACK: IfNotUsed<"NO_ROLLBACK", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "NO_ROLLBACK", TCompleted>>;
92
+ NO_ROLLBACK: IfNotUsed<"NO_ROLLBACK", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "NO_ROLLBACK", TCompleted>>;
93
93
  /**
94
94
  * Callback when mutation fails.
95
95
  */
96
- ON_ERROR: IfNotUsed<"ON_ERROR", TUsed, (callback: (error: unknown) => void) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "ON_ERROR", TCompleted>>;
96
+ ON_ERROR: IfNotUsed<"ON_ERROR", TUsed, (callback: (error: TError) => void) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "ON_ERROR", TCompleted>>;
97
97
  };
98
98
  /**
99
99
  * Path methods proxy for optimistic API - only GET.
100
100
  * Resolves literal paths (e.g., "posts/1") to schema keys (e.g., "posts/:id") using FindMatchingKey.
101
101
  * Uses TPath for param extraction to preserve user's param names.
102
102
  */
103
- type OptimisticPathMethods<TSchema, TPath extends string, TResponse> = FindMatchingKey<TSchema, TPath> extends infer TKey ? TKey extends keyof TSchema ? TSchema[TKey] extends infer TRoute ? "GET" extends keyof TRoute ? TRoute["GET"] extends infer TGetConfig ? {
104
- GET: () => OptimisticBuilder<ExtractData<TGetConfig>, TGetConfig, TPath, TResponse, "immediate", never, false>;
103
+ type OptimisticPathMethods<TSchema, TPath extends string, TResponse, TError> = FindMatchingKey<TSchema, TPath> extends infer TKey ? TKey extends keyof TSchema ? TSchema[TKey] extends infer TRoute ? "GET" extends keyof TRoute ? TRoute["GET"] extends infer TGetConfig ? {
104
+ GET: () => OptimisticBuilder<ExtractData<TGetConfig>, TGetConfig, TPath, TResponse, TError, "immediate", never, false>;
105
105
  } : never : never : never : never : never;
106
106
  /**
107
107
  * Helper type for creating the optimistic API proxy.
108
108
  * Accepts both schema-defined paths (e.g., "posts/:id") and literal paths (e.g., "posts/1").
109
109
  * Uses union with (string & {}) to allow any string while preserving autocomplete.
110
110
  */
111
- type OptimisticApiHelper<TSchema, TResponse = unknown> = <TPath extends ReadPaths<TSchema> | (string & {})>(path: TPath) => OptimisticPathMethods<TSchema, TPath, TResponse>;
111
+ type OptimisticApiHelper<TSchema, TResponse = unknown, TError = unknown> = <TPath extends ReadPaths<TSchema> | (string & {})>(path: TPath) => OptimisticPathMethods<TSchema, TPath, TResponse, TError>;
112
112
  /**
113
113
  * A generic OptimisticTarget that accepts any data/response types.
114
114
  * Used for the return type of the callback.
@@ -161,10 +161,10 @@ type CompletedOptimisticBuilder = {
161
161
  * ]
162
162
  * ```
163
163
  */
164
- type OptimisticCallbackFn<TSchema = unknown, TResponse = unknown> = (api: OptimisticApiHelper<TSchema, TResponse>) => CompletedOptimisticBuilder | CompletedOptimisticBuilder[];
164
+ type OptimisticCallbackFn<TSchema = unknown, TResponse = unknown, TError = unknown> = (api: OptimisticApiHelper<TSchema, TResponse, TError>) => CompletedOptimisticBuilder | CompletedOptimisticBuilder[];
165
165
  type OptimisticPluginConfig = object;
166
166
  type OptimisticWriteOptions = object;
167
- interface OptimisticWriteTriggerOptions<TSchema = unknown, TResponse = unknown> {
167
+ interface OptimisticWriteTriggerOptions<TSchema = unknown, TResponse = unknown, TError = unknown> {
168
168
  /**
169
169
  * Configure optimistic updates for this mutation.
170
170
  *
@@ -201,7 +201,7 @@ interface OptimisticWriteTriggerOptions<TSchema = unknown, TResponse = unknown>
201
201
  * });
202
202
  * ```
203
203
  */
204
- optimistic?: OptimisticCallbackFn<TSchema, TResponse>;
204
+ optimistic?: OptimisticCallbackFn<TSchema, TResponse, TError>;
205
205
  }
206
206
  type OptimisticReadOptions = object;
207
207
  type OptimisticPagesOptions = object;
@@ -211,7 +211,7 @@ interface OptimisticReadResult {
211
211
  type OptimisticWriteResult = object;
212
212
  declare module "@spoosh/core" {
213
213
  interface PluginResolvers<TContext> {
214
- optimistic: OptimisticCallbackFn<TContext["schema"], TContext["data"]> | undefined;
214
+ optimistic: OptimisticCallbackFn<TContext["schema"], TContext["data"], TContext["error"]> | undefined;
215
215
  }
216
216
  }
217
217
 
package/dist/index.d.ts CHANGED
@@ -55,7 +55,7 @@ declare const COMPLETED_BRAND: unique symbol;
55
55
  * @typeParam TUsed - Tracks which methods have been called to prevent duplicate calls
56
56
  * @typeParam TCompleted - Tracks whether UPDATE_CACHE was called (required for valid builder)
57
57
  */
58
- type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath extends string = string, TResponse = unknown, TTiming extends "immediate" | "onSuccess" = "immediate", TUsed extends string = never, TCompleted extends boolean = false> = (TCompleted extends true ? {
58
+ type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath extends string = string, TResponse = unknown, TError = unknown, TTiming extends "immediate" | "onSuccess" = "immediate", TUsed extends string = never, TCompleted extends boolean = false> = (TCompleted extends true ? {
59
59
  readonly [COMPLETED_BRAND]: true;
60
60
  } : unknown) & {
61
61
  /**
@@ -68,7 +68,7 @@ type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath exten
68
68
  * .WHERE(entry => entry.query.page === 1)
69
69
  * ```
70
70
  */
71
- WHERE: IfNotUsed<"WHERE", TUsed, WhereOptions<TMethodConfig, TUserPath> extends never ? never : (predicate: (entry: Simplify<WhereOptions<TMethodConfig, TUserPath>>) => boolean) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "WHERE", TCompleted>>;
71
+ WHERE: IfNotUsed<"WHERE", TUsed, WhereOptions<TMethodConfig, TUserPath> extends never ? never : (predicate: (entry: Simplify<WhereOptions<TMethodConfig, TUserPath>>) => boolean) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "WHERE", TCompleted>>;
72
72
  /**
73
73
  * Specify how to update the cached data optimistically.
74
74
  * This method is required - an optimistic update must have an updater function.
@@ -78,37 +78,37 @@ type OptimisticBuilder<TData = unknown, TMethodConfig = unknown, TUserPath exten
78
78
  *
79
79
  * @param updater - Function that receives current data (and response if ON_SUCCESS), returns updated data
80
80
  */
81
- UPDATE_CACHE: IfNotUsed<"UPDATE_CACHE", TUsed, TTiming extends "onSuccess" ? (updater: (data: TData, response: TResponse) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "UPDATE_CACHE", true> : (updater: (data: TData) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "UPDATE_CACHE", true>>;
81
+ UPDATE_CACHE: IfNotUsed<"UPDATE_CACHE", TUsed, TTiming extends "onSuccess" ? (updater: (data: TData, response: TResponse) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "UPDATE_CACHE", true> : (updater: (data: TData) => TData) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "UPDATE_CACHE", true>>;
82
82
  /**
83
83
  * Apply optimistic update only after mutation succeeds.
84
84
  * By default, updates are applied immediately before mutation completes.
85
85
  * When using ON_SUCCESS, UPDATE_CACHE receives the mutation response as second argument.
86
86
  */
87
- ON_SUCCESS: IfNotUsed<"ON_SUCCESS", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, "onSuccess", TUsed | "ON_SUCCESS", TCompleted>>;
87
+ ON_SUCCESS: IfNotUsed<"ON_SUCCESS", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, "onSuccess", TUsed | "ON_SUCCESS", TCompleted>>;
88
88
  /**
89
89
  * Disable automatic rollback when mutation fails.
90
90
  * By default, optimistic updates are rolled back on error.
91
91
  */
92
- NO_ROLLBACK: IfNotUsed<"NO_ROLLBACK", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "NO_ROLLBACK", TCompleted>>;
92
+ NO_ROLLBACK: IfNotUsed<"NO_ROLLBACK", TUsed, () => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "NO_ROLLBACK", TCompleted>>;
93
93
  /**
94
94
  * Callback when mutation fails.
95
95
  */
96
- ON_ERROR: IfNotUsed<"ON_ERROR", TUsed, (callback: (error: unknown) => void) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TTiming, TUsed | "ON_ERROR", TCompleted>>;
96
+ ON_ERROR: IfNotUsed<"ON_ERROR", TUsed, (callback: (error: TError) => void) => OptimisticBuilder<TData, TMethodConfig, TUserPath, TResponse, TError, TTiming, TUsed | "ON_ERROR", TCompleted>>;
97
97
  };
98
98
  /**
99
99
  * Path methods proxy for optimistic API - only GET.
100
100
  * Resolves literal paths (e.g., "posts/1") to schema keys (e.g., "posts/:id") using FindMatchingKey.
101
101
  * Uses TPath for param extraction to preserve user's param names.
102
102
  */
103
- type OptimisticPathMethods<TSchema, TPath extends string, TResponse> = FindMatchingKey<TSchema, TPath> extends infer TKey ? TKey extends keyof TSchema ? TSchema[TKey] extends infer TRoute ? "GET" extends keyof TRoute ? TRoute["GET"] extends infer TGetConfig ? {
104
- GET: () => OptimisticBuilder<ExtractData<TGetConfig>, TGetConfig, TPath, TResponse, "immediate", never, false>;
103
+ type OptimisticPathMethods<TSchema, TPath extends string, TResponse, TError> = FindMatchingKey<TSchema, TPath> extends infer TKey ? TKey extends keyof TSchema ? TSchema[TKey] extends infer TRoute ? "GET" extends keyof TRoute ? TRoute["GET"] extends infer TGetConfig ? {
104
+ GET: () => OptimisticBuilder<ExtractData<TGetConfig>, TGetConfig, TPath, TResponse, TError, "immediate", never, false>;
105
105
  } : never : never : never : never : never;
106
106
  /**
107
107
  * Helper type for creating the optimistic API proxy.
108
108
  * Accepts both schema-defined paths (e.g., "posts/:id") and literal paths (e.g., "posts/1").
109
109
  * Uses union with (string & {}) to allow any string while preserving autocomplete.
110
110
  */
111
- type OptimisticApiHelper<TSchema, TResponse = unknown> = <TPath extends ReadPaths<TSchema> | (string & {})>(path: TPath) => OptimisticPathMethods<TSchema, TPath, TResponse>;
111
+ type OptimisticApiHelper<TSchema, TResponse = unknown, TError = unknown> = <TPath extends ReadPaths<TSchema> | (string & {})>(path: TPath) => OptimisticPathMethods<TSchema, TPath, TResponse, TError>;
112
112
  /**
113
113
  * A generic OptimisticTarget that accepts any data/response types.
114
114
  * Used for the return type of the callback.
@@ -161,10 +161,10 @@ type CompletedOptimisticBuilder = {
161
161
  * ]
162
162
  * ```
163
163
  */
164
- type OptimisticCallbackFn<TSchema = unknown, TResponse = unknown> = (api: OptimisticApiHelper<TSchema, TResponse>) => CompletedOptimisticBuilder | CompletedOptimisticBuilder[];
164
+ type OptimisticCallbackFn<TSchema = unknown, TResponse = unknown, TError = unknown> = (api: OptimisticApiHelper<TSchema, TResponse, TError>) => CompletedOptimisticBuilder | CompletedOptimisticBuilder[];
165
165
  type OptimisticPluginConfig = object;
166
166
  type OptimisticWriteOptions = object;
167
- interface OptimisticWriteTriggerOptions<TSchema = unknown, TResponse = unknown> {
167
+ interface OptimisticWriteTriggerOptions<TSchema = unknown, TResponse = unknown, TError = unknown> {
168
168
  /**
169
169
  * Configure optimistic updates for this mutation.
170
170
  *
@@ -201,7 +201,7 @@ interface OptimisticWriteTriggerOptions<TSchema = unknown, TResponse = unknown>
201
201
  * });
202
202
  * ```
203
203
  */
204
- optimistic?: OptimisticCallbackFn<TSchema, TResponse>;
204
+ optimistic?: OptimisticCallbackFn<TSchema, TResponse, TError>;
205
205
  }
206
206
  type OptimisticReadOptions = object;
207
207
  type OptimisticPagesOptions = object;
@@ -211,7 +211,7 @@ interface OptimisticReadResult {
211
211
  type OptimisticWriteResult = object;
212
212
  declare module "@spoosh/core" {
213
213
  interface PluginResolvers<TContext> {
214
- optimistic: OptimisticCallbackFn<TContext["schema"], TContext["data"]> | undefined;
214
+ optimistic: OptimisticCallbackFn<TContext["schema"], TContext["data"], TContext["error"]> | undefined;
215
215
  }
216
216
  }
217
217
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spoosh/plugin-optimistic",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Optimistic updates plugin for Spoosh - instant UI updates with automatic rollback",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -37,7 +37,7 @@
37
37
  "@spoosh/plugin-invalidation": ">=0.7.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@spoosh/core": "0.15.1",
40
+ "@spoosh/core": "0.16.0",
41
41
  "@spoosh/plugin-invalidation": "0.9.1",
42
42
  "@spoosh/test-utils": "0.3.0"
43
43
  },
@@ -46,6 +46,6 @@
46
46
  "build": "tsup",
47
47
  "typecheck": "tsc --noEmit",
48
48
  "lint": "eslint src --max-warnings 0",
49
- "format": "prettier --write 'src/**/*.ts'"
49
+ "format": "prettier --write 'src/**/*.ts' '*.md'"
50
50
  }
51
51
  }