@spoosh/core 0.4.2 → 0.5.0

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
@@ -76,16 +76,24 @@ type BaseRequestOptions = {
76
76
  cache?: RequestCache;
77
77
  signal?: AbortSignal;
78
78
  };
79
- type BodyOption<TBody> = [TBody] extends [never] ? object : {
79
+ type BodyOption<TBody> = [TBody] extends [never] ? object : undefined extends TBody ? {
80
+ body?: Exclude<TBody, undefined>;
81
+ } : {
80
82
  body: TBody;
81
83
  };
82
- type QueryOption<TQuery> = [TQuery] extends [never] ? object : {
84
+ type QueryOption<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
85
+ query?: Exclude<TQuery, undefined>;
86
+ } : {
83
87
  query: TQuery;
84
88
  };
85
- type FormDataOption<TFormData> = [TFormData] extends [never] ? object : {
89
+ type FormDataOption<TFormData> = [TFormData] extends [never] ? object : undefined extends TFormData ? {
90
+ formData?: Exclude<TFormData, undefined>;
91
+ } : {
86
92
  formData: TFormData;
87
93
  };
88
- type UrlEncodedOption<TUrlEncoded> = [TUrlEncoded] extends [never] ? object : {
94
+ type UrlEncodedOption<TUrlEncoded> = [TUrlEncoded] extends [never] ? object : undefined extends TUrlEncoded ? {
95
+ urlEncoded?: Exclude<TUrlEncoded, undefined>;
96
+ } : {
89
97
  urlEncoded: TUrlEncoded;
90
98
  };
91
99
  type RequestOptions<TBody = never, TQuery = never, TFormData = never, TUrlEncoded = never> = BaseRequestOptions & BodyOption<TBody> & QueryOption<TQuery> & FormDataOption<TFormData> & UrlEncodedOption<TUrlEncoded>;
@@ -197,7 +205,7 @@ type StateManager = {
197
205
  getCacheByTags: <TData>(tags: string[]) => CacheEntry<TData> | undefined;
198
206
  getCacheEntriesByTags: <TData, TError>(tags: string[]) => CacheEntryWithKey<TData, TError>[];
199
207
  getCacheEntriesBySelfTag: <TData, TError>(selfTag: string) => CacheEntryWithKey<TData, TError>[];
200
- setPluginResult: (key: string, data: Record<string, unknown>) => void;
208
+ setMeta: (key: string, data: Record<string, unknown>) => void;
201
209
  /** Mark all cache entries with matching tags as stale */
202
210
  markStale: (tags: string[]) => void;
203
211
  /** Get all cache entries */
@@ -223,7 +231,7 @@ type CacheEntry<TData = unknown, TError = unknown> = {
223
231
  state: OperationState<TData, TError>;
224
232
  tags: string[];
225
233
  /** Plugin-contributed result data (e.g., isOptimistic, isStale). Merged into hook result. */
226
- pluginResult: Map<string, unknown>;
234
+ meta: Map<string, unknown>;
227
235
  /** The original path-derived tag (e.g., "posts/1/comments"). Used for exact matching in cache */
228
236
  selfTag?: string;
229
237
  previousData?: TData;
@@ -734,27 +742,16 @@ type Endpoint<T extends {
734
742
  }> = {
735
743
  [EndpointBrand]: true;
736
744
  } & T;
745
+ type ExtractProperty<T, K extends string, TDefault = never> = K extends keyof T ? T[K] : TDefault;
737
746
  type NormalizeEndpoint<T, TDefaultError> = T extends {
738
747
  [EndpointBrand]: true;
739
748
  } ? {
740
- data: T extends {
741
- data: infer D;
742
- } ? D : never;
743
- error: T extends {
744
- error: infer E;
745
- } ? E : TDefaultError;
746
- body: T extends {
747
- body: infer B;
748
- } ? B : never;
749
- query: T extends {
750
- query: infer Q;
751
- } ? Q : never;
752
- formData: T extends {
753
- formData: infer F;
754
- } ? F : never;
755
- urlEncoded: T extends {
756
- urlEncoded: infer U;
757
- } ? U : never;
749
+ data: ExtractProperty<T, "data">;
750
+ error: ExtractProperty<T, "error", TDefaultError>;
751
+ body: ExtractProperty<T, "body">;
752
+ query: ExtractProperty<T, "query">;
753
+ formData: ExtractProperty<T, "formData">;
754
+ urlEncoded: ExtractProperty<T, "urlEncoded">;
758
755
  } : {
759
756
  data: T;
760
757
  error: TDefaultError;
package/dist/index.d.ts CHANGED
@@ -76,16 +76,24 @@ type BaseRequestOptions = {
76
76
  cache?: RequestCache;
77
77
  signal?: AbortSignal;
78
78
  };
79
- type BodyOption<TBody> = [TBody] extends [never] ? object : {
79
+ type BodyOption<TBody> = [TBody] extends [never] ? object : undefined extends TBody ? {
80
+ body?: Exclude<TBody, undefined>;
81
+ } : {
80
82
  body: TBody;
81
83
  };
82
- type QueryOption<TQuery> = [TQuery] extends [never] ? object : {
84
+ type QueryOption<TQuery> = [TQuery] extends [never] ? object : undefined extends TQuery ? {
85
+ query?: Exclude<TQuery, undefined>;
86
+ } : {
83
87
  query: TQuery;
84
88
  };
85
- type FormDataOption<TFormData> = [TFormData] extends [never] ? object : {
89
+ type FormDataOption<TFormData> = [TFormData] extends [never] ? object : undefined extends TFormData ? {
90
+ formData?: Exclude<TFormData, undefined>;
91
+ } : {
86
92
  formData: TFormData;
87
93
  };
88
- type UrlEncodedOption<TUrlEncoded> = [TUrlEncoded] extends [never] ? object : {
94
+ type UrlEncodedOption<TUrlEncoded> = [TUrlEncoded] extends [never] ? object : undefined extends TUrlEncoded ? {
95
+ urlEncoded?: Exclude<TUrlEncoded, undefined>;
96
+ } : {
89
97
  urlEncoded: TUrlEncoded;
90
98
  };
91
99
  type RequestOptions<TBody = never, TQuery = never, TFormData = never, TUrlEncoded = never> = BaseRequestOptions & BodyOption<TBody> & QueryOption<TQuery> & FormDataOption<TFormData> & UrlEncodedOption<TUrlEncoded>;
@@ -197,7 +205,7 @@ type StateManager = {
197
205
  getCacheByTags: <TData>(tags: string[]) => CacheEntry<TData> | undefined;
198
206
  getCacheEntriesByTags: <TData, TError>(tags: string[]) => CacheEntryWithKey<TData, TError>[];
199
207
  getCacheEntriesBySelfTag: <TData, TError>(selfTag: string) => CacheEntryWithKey<TData, TError>[];
200
- setPluginResult: (key: string, data: Record<string, unknown>) => void;
208
+ setMeta: (key: string, data: Record<string, unknown>) => void;
201
209
  /** Mark all cache entries with matching tags as stale */
202
210
  markStale: (tags: string[]) => void;
203
211
  /** Get all cache entries */
@@ -223,7 +231,7 @@ type CacheEntry<TData = unknown, TError = unknown> = {
223
231
  state: OperationState<TData, TError>;
224
232
  tags: string[];
225
233
  /** Plugin-contributed result data (e.g., isOptimistic, isStale). Merged into hook result. */
226
- pluginResult: Map<string, unknown>;
234
+ meta: Map<string, unknown>;
227
235
  /** The original path-derived tag (e.g., "posts/1/comments"). Used for exact matching in cache */
228
236
  selfTag?: string;
229
237
  previousData?: TData;
@@ -734,27 +742,16 @@ type Endpoint<T extends {
734
742
  }> = {
735
743
  [EndpointBrand]: true;
736
744
  } & T;
745
+ type ExtractProperty<T, K extends string, TDefault = never> = K extends keyof T ? T[K] : TDefault;
737
746
  type NormalizeEndpoint<T, TDefaultError> = T extends {
738
747
  [EndpointBrand]: true;
739
748
  } ? {
740
- data: T extends {
741
- data: infer D;
742
- } ? D : never;
743
- error: T extends {
744
- error: infer E;
745
- } ? E : TDefaultError;
746
- body: T extends {
747
- body: infer B;
748
- } ? B : never;
749
- query: T extends {
750
- query: infer Q;
751
- } ? Q : never;
752
- formData: T extends {
753
- formData: infer F;
754
- } ? F : never;
755
- urlEncoded: T extends {
756
- urlEncoded: infer U;
757
- } ? U : never;
749
+ data: ExtractProperty<T, "data">;
750
+ error: ExtractProperty<T, "error", TDefaultError>;
751
+ body: ExtractProperty<T, "body">;
752
+ query: ExtractProperty<T, "query">;
753
+ formData: ExtractProperty<T, "formData">;
754
+ urlEncoded: ExtractProperty<T, "urlEncoded">;
758
755
  } : {
759
756
  data: T;
760
757
  error: TDefaultError;
package/dist/index.js CHANGED
@@ -598,7 +598,7 @@ function createStateManager() {
598
598
  const newEntry = {
599
599
  state: entry.state ?? createInitialState(),
600
600
  tags: entry.tags ?? [],
601
- pluginResult: /* @__PURE__ */ new Map(),
601
+ meta: /* @__PURE__ */ new Map(),
602
602
  selfTag: generateSelfTagFromKey(key),
603
603
  previousData: entry.previousData,
604
604
  stale: entry.stale
@@ -658,11 +658,11 @@ function createStateManager() {
658
658
  });
659
659
  return entries;
660
660
  },
661
- setPluginResult(key, data) {
661
+ setMeta(key, data) {
662
662
  const entry = cache.get(key);
663
663
  if (entry) {
664
664
  for (const [name, value] of Object.entries(data)) {
665
- entry.pluginResult.set(name, value);
665
+ entry.meta.set(name, value);
666
666
  }
667
667
  notifySubscribers(key);
668
668
  }
package/dist/index.mjs CHANGED
@@ -543,7 +543,7 @@ function createStateManager() {
543
543
  const newEntry = {
544
544
  state: entry.state ?? createInitialState(),
545
545
  tags: entry.tags ?? [],
546
- pluginResult: /* @__PURE__ */ new Map(),
546
+ meta: /* @__PURE__ */ new Map(),
547
547
  selfTag: generateSelfTagFromKey(key),
548
548
  previousData: entry.previousData,
549
549
  stale: entry.stale
@@ -603,11 +603,11 @@ function createStateManager() {
603
603
  });
604
604
  return entries;
605
605
  },
606
- setPluginResult(key, data) {
606
+ setMeta(key, data) {
607
607
  const entry = cache.get(key);
608
608
  if (entry) {
609
609
  for (const [name, value] of Object.entries(data)) {
610
- entry.pluginResult.set(name, value);
610
+ entry.meta.set(name, value);
611
611
  }
612
612
  notifySubscribers(key);
613
613
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spoosh/core",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "license": "MIT",
5
5
  "description": "Type-safe API client with plugin middleware system",
6
6
  "keywords": [