@zajno/common 2.8.6 → 2.8.8

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.
Files changed (53) hide show
  1. package/cjs/api/call.config.js +10 -0
  2. package/cjs/api/call.config.js.map +1 -1
  3. package/cjs/api/extensions/formData.js +115 -0
  4. package/cjs/api/extensions/formData.js.map +1 -0
  5. package/cjs/api/extensions/index.js +1 -0
  6. package/cjs/api/extensions/index.js.map +1 -1
  7. package/cjs/structures/promiseCache/cache.js +286 -0
  8. package/cjs/structures/promiseCache/cache.js.map +1 -0
  9. package/cjs/structures/promiseCache/core.js +301 -0
  10. package/cjs/structures/promiseCache/core.js.map +1 -0
  11. package/cjs/structures/promiseCache/index.js +7 -0
  12. package/cjs/structures/promiseCache/index.js.map +1 -0
  13. package/cjs/structures/promiseCache/types.js +15 -0
  14. package/cjs/structures/promiseCache/types.js.map +1 -0
  15. package/cjs/types/index.js +1 -0
  16. package/cjs/types/index.js.map +1 -1
  17. package/cjs/types/isPlainObject.js +15 -0
  18. package/cjs/types/isPlainObject.js.map +1 -0
  19. package/esm/api/call.config.js +10 -0
  20. package/esm/api/call.config.js.map +1 -1
  21. package/esm/api/extensions/formData.js +111 -0
  22. package/esm/api/extensions/formData.js.map +1 -0
  23. package/esm/api/extensions/index.js +1 -0
  24. package/esm/api/extensions/index.js.map +1 -1
  25. package/esm/structures/promiseCache/cache.js +282 -0
  26. package/esm/structures/promiseCache/cache.js.map +1 -0
  27. package/esm/structures/promiseCache/core.js +297 -0
  28. package/esm/structures/promiseCache/core.js.map +1 -0
  29. package/esm/structures/promiseCache/index.js +4 -0
  30. package/esm/structures/promiseCache/index.js.map +1 -0
  31. package/esm/structures/promiseCache/types.js +12 -0
  32. package/esm/structures/promiseCache/types.js.map +1 -0
  33. package/esm/types/index.js +1 -0
  34. package/esm/types/index.js.map +1 -1
  35. package/esm/types/isPlainObject.js +12 -0
  36. package/esm/types/isPlainObject.js.map +1 -0
  37. package/package.json +7 -1
  38. package/tsconfig.cjs.tsbuildinfo +1 -1
  39. package/tsconfig.esm.tsbuildinfo +1 -1
  40. package/tsconfig.types.tsbuildinfo +1 -1
  41. package/types/api/extensions/formData.d.ts +89 -0
  42. package/types/api/extensions/index.d.ts +1 -0
  43. package/types/structures/promiseCache/cache.d.ts +95 -0
  44. package/types/structures/promiseCache/core.d.ts +157 -0
  45. package/types/structures/promiseCache/index.d.ts +3 -0
  46. package/types/structures/promiseCache/types.d.ts +55 -0
  47. package/types/types/index.d.ts +1 -0
  48. package/types/types/isPlainObject.d.ts +5 -0
  49. package/cjs/structures/promiseCache.js +0 -399
  50. package/cjs/structures/promiseCache.js.map +0 -1
  51. package/esm/structures/promiseCache.js +0 -395
  52. package/esm/structures/promiseCache.js.map +0 -1
  53. package/types/structures/promiseCache.d.ts +0 -206
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromiseCacheCore = void 0;
4
+ const loggable_js_1 = require("../../logger/loggable.js");
5
+ const Model_js_1 = require("../../models/Model.js");
6
+ /**
7
+ * Core base class for PromiseCache. Provides basic cache operations, hooks, and `pure_create*` methods.
8
+ *
9
+ * This class handles:
10
+ * - item storage and retrieval
11
+ * - loading state tracking
12
+ * - promise caching
13
+ * - error storage
14
+ * - timestamps for cached items
15
+ * - direct cache manipulation (invalidate, updateValueDirectly, clear)
16
+ * - keys iteration
17
+ *
18
+ * Subclasses are expected to implement fetching logic, invalidation policies, etc.
19
+ */
20
+ class PromiseCacheCore extends loggable_js_1.Loggable {
21
+ keyAdapter;
22
+ keyParser;
23
+ /** Stores resolved items in map by id. */
24
+ _itemsCache;
25
+ /** Stores items loading state (loading or not) in map by id. */
26
+ _itemsStatus;
27
+ /** Stores items loading count. */
28
+ _loadingCount;
29
+ /** Stores items Promises state (if still loading) in map by id. */
30
+ _fetchCache;
31
+ /** Stores last errors by key. Observable-friendly via IMapModel. */
32
+ _errorsMap;
33
+ /** Stores items resolve timestamps (for expiration) in map by id. */
34
+ _timestamps = new Map();
35
+ _version = 0;
36
+ constructor(keyAdapter, keyParser) {
37
+ super();
38
+ this.keyAdapter = keyAdapter;
39
+ this.keyParser = keyParser;
40
+ this._loadingCount = this.pure_createLoadingCount();
41
+ this._itemsCache = this.pure_createItemsCache();
42
+ this._itemsStatus = this.pure_createItemsStatus();
43
+ this._fetchCache = this.pure_createFetchCache();
44
+ this._errorsMap = this.pure_createErrorsMap();
45
+ }
46
+ // ─── Counts ──────────────────────────────────────────────────────────
47
+ /** Returns the number of items currently being fetched. */
48
+ get loadingCount() { return this._loadingCount.value; }
49
+ /** Returns the number of cached items (resolved values). */
50
+ get cachedCount() { return this._itemsCache.size; }
51
+ /** Returns the number of in-flight promises (items currently being fetched). */
52
+ get promisesCount() { return this._fetchCache.size; }
53
+ /** Returns the number of cached items that are currently invalid (expired). */
54
+ get invalidCount() {
55
+ let count = 0;
56
+ for (const key of this._itemsCache.keys()) {
57
+ if (this.getIsInvalidated(key)) {
58
+ count++;
59
+ }
60
+ }
61
+ return count;
62
+ }
63
+ // ─── Pure factory methods (override for observability) ───────────────
64
+ /**
65
+ * @pure @const
66
+ * Creates a model for tracking the loading state. Override to inject own instance, e.g. for observability.
67
+ *
68
+ * Warning: as name indicates, this should be "pure"/"const" function, i.e. should not reference `this`/`super`.
69
+ */
70
+ pure_createLoadingCount() {
71
+ return new Model_js_1.Model(0);
72
+ }
73
+ /**
74
+ * @pure @const
75
+ * Creates a map for caching resolved items by id. Override to inject own instance, e.g. for observability.
76
+ *
77
+ * Warning: as name indicates, this should be "pure"/"const" function, i.e. should not reference `this`/`super`.
78
+ */
79
+ pure_createItemsCache() {
80
+ return new Map();
81
+ }
82
+ /**
83
+ * @pure @const
84
+ * Creates a map for tracking the loading state of items by id. Override to inject own instance, e.g. for observability.
85
+ *
86
+ * Warning: as name indicates, this should be "pure"/"const" function, i.e. should not reference `this`/`super`.
87
+ */
88
+ pure_createItemsStatus() {
89
+ return new Map();
90
+ }
91
+ /**
92
+ * @pure @const
93
+ * Creates a map for caching promises of items by id. Override to inject own instance, e.g. for observability.
94
+ *
95
+ * Warning: as name indicates, this should be "pure"/"const" function, i.e. should not reference `this`/`super`.
96
+ */
97
+ pure_createFetchCache() {
98
+ return new Map();
99
+ }
100
+ /**
101
+ * @pure @const
102
+ * Creates a map for storing last errors by key. Override to inject own instance, e.g. for observability.
103
+ *
104
+ * Warning: as name indicates, this should be "pure"/"const" function, i.e. should not reference `this`/`super`.
105
+ */
106
+ pure_createErrorsMap() {
107
+ return new Map();
108
+ }
109
+ // ─── Key handling ────────────────────────────────────────────────────
110
+ _pk(k) {
111
+ if (k == null) {
112
+ throw new Error('PromiseCache: null keys are not supported');
113
+ }
114
+ if (typeof k === 'string') {
115
+ return k;
116
+ }
117
+ if (!this.keyAdapter) {
118
+ throw new Error('Provide key adapter for non-string keys');
119
+ }
120
+ return this.keyAdapter(k);
121
+ }
122
+ getLoggerName(name) {
123
+ return `[PromiseCache:${name || '?'}]`;
124
+ }
125
+ // ─── Public API: reading ─────────────────────────────────────────────
126
+ /**
127
+ * Returns a {@link DeferredGetter} object for a specified key.
128
+ *
129
+ * This can be used to access the current value, promise, loading state, and last error of the item.
130
+ */
131
+ getDeferred(key) {
132
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
133
+ const self = this;
134
+ return {
135
+ get current() { return self.getCurrent(key); },
136
+ get promise() { return self.get(key); },
137
+ get isLoading() { return self.getIsLoading(key); },
138
+ get error() { return self.getLastError(key); },
139
+ };
140
+ }
141
+ /**
142
+ * Returns the loading state of an item.
143
+ *
144
+ * @returns true if loading, false if loading completed, undefined if loading was not started yet.
145
+ */
146
+ getIsLoading(id) {
147
+ const key = this._pk(id);
148
+ const res = this._itemsStatus.get(key);
149
+ if (res) {
150
+ return res;
151
+ }
152
+ const isInvalid = this.getIsInvalidated(key);
153
+ return isInvalid ? undefined : res;
154
+ }
155
+ /**
156
+ * Returns whether the cached item for the specified key is valid (not expired and not invalidated by callback).
157
+ *
158
+ * @returns `true` if the item is cached and valid, `false` if the item is invalidated or not cached.
159
+ */
160
+ getIsValid(id) {
161
+ const key = this._pk(id);
162
+ if (!this._itemsCache.has(key)) {
163
+ return false;
164
+ }
165
+ return !this.getIsInvalidated(key);
166
+ }
167
+ /**
168
+ * Returns the last error that occurred during fetching for the specified key.
169
+ *
170
+ * @returns The raw error, or null if no error.
171
+ */
172
+ getLastError(id) {
173
+ const key = this._pk(id);
174
+ return this._errorsMap.get(key) ?? null;
175
+ }
176
+ /** Returns the current cached value, optionally triggering a fetch. */
177
+ getCurrent(id, initiateFetch = true) {
178
+ const { item, key } = this._getCurrent(id);
179
+ if (initiateFetch) {
180
+ this.get(id);
181
+ }
182
+ this.logger.log(key, 'getCurrent: returns', item);
183
+ return item;
184
+ }
185
+ /** Returns true if the item is cached or fetching was initiated. Does not initiate fetching. */
186
+ hasKey(id) {
187
+ const key = this._pk(id);
188
+ return this._itemsCache.get(key) !== undefined || this._itemsStatus.get(key) !== undefined;
189
+ }
190
+ keys(iterate = false) {
191
+ const iterator = this._itemsCache.keys();
192
+ return iterate
193
+ ? iterator
194
+ : Array.from(iterator);
195
+ }
196
+ keysParsed(iterate = false) {
197
+ const kp = this.keyParser;
198
+ if (!kp) {
199
+ return null;
200
+ }
201
+ const keysIterator = this.keys(true);
202
+ if (!iterate) {
203
+ return Array.from(keysIterator, key => kp(key));
204
+ }
205
+ return (function* () {
206
+ for (const key of keysIterator) {
207
+ yield kp(key);
208
+ }
209
+ })();
210
+ }
211
+ // ─── Public API: mutation ────────────────────────────────────────────
212
+ /** Instantly invalidates the cached item for the specified id, like it was never fetched/accessed. */
213
+ invalidate(id) {
214
+ const key = this._pk(id);
215
+ this._set(key, undefined, undefined, undefined);
216
+ this._errorsMap.delete(key);
217
+ this._timestamps.delete(key);
218
+ }
219
+ /** Updates the cached value for the specified id directly, like it was fetched already. */
220
+ updateValueDirectly(id, value) {
221
+ const key = this._pk(id);
222
+ this._set(key, value, undefined, undefined);
223
+ }
224
+ /**
225
+ * Iterates over all cached items and removes those that are invalid (expired).
226
+ *
227
+ * @returns The number of items that were removed.
228
+ */
229
+ sanitize() {
230
+ let removed = 0;
231
+ const keysToRemove = [];
232
+ for (const key of this._itemsCache.keys()) {
233
+ if (this.getIsInvalidated(key)) {
234
+ keysToRemove.push(key);
235
+ }
236
+ }
237
+ for (const key of keysToRemove) {
238
+ this._set(key, undefined, undefined, undefined);
239
+ this._errorsMap.delete(key);
240
+ this._timestamps.delete(key);
241
+ removed++;
242
+ }
243
+ return removed;
244
+ }
245
+ /** Clears the cache and resets the loading state. */
246
+ clear() {
247
+ ++this._version;
248
+ this._loadingCount.value = 0;
249
+ this._itemsCache.clear();
250
+ this._itemsStatus.clear();
251
+ this._fetchCache.clear();
252
+ this._errorsMap.clear();
253
+ this._timestamps.clear();
254
+ }
255
+ /** @internal updates all caches states at once. */
256
+ _set(key, item, promise, isLoading) {
257
+ PromiseCacheCore._setMapX(key, this._fetchCache, promise);
258
+ PromiseCacheCore._setMapX(key, this._itemsStatus, isLoading);
259
+ PromiseCacheCore._setMapX(key, this._itemsCache, item);
260
+ }
261
+ /** Updates the loading status for the specified key. Override to add a hook. */
262
+ setStatus(key, status) {
263
+ this.logger.log(key, 'status update:', status);
264
+ this._itemsStatus.set(key, status);
265
+ }
266
+ /** Updates the promise for the specified key. Override to add a hook. */
267
+ setPromise(key, promise) {
268
+ this._fetchCache.set(key, promise);
269
+ }
270
+ /** Stores the result for the specified key. Override to add a hook. */
271
+ storeResult(key, res) {
272
+ this._itemsCache.set(key, res);
273
+ this._timestamps.set(key, Date.now());
274
+ this._errorsMap.delete(key);
275
+ }
276
+ /** Hooks into the fetch process before it starts. */
277
+ onBeforeFetch(_key) {
278
+ this._loadingCount.value = this._loadingCount.value + 1;
279
+ }
280
+ /** Hooks into the fetch process after it completes. */
281
+ onFetchComplete(key) {
282
+ this._loadingCount.value = this._loadingCount.value - 1;
283
+ this._fetchCache.delete(key);
284
+ this._itemsStatus.set(key, false);
285
+ }
286
+ /** Hooks into the result preparation process, before it's stored into the cache. */
287
+ prepareResult(res) {
288
+ return res;
289
+ }
290
+ /** @internal Helper to set or delete a value in a map. */
291
+ static _setMapX(key, map, val) {
292
+ if (val === undefined) {
293
+ map.delete(key);
294
+ }
295
+ else {
296
+ map.set(key, val);
297
+ }
298
+ }
299
+ }
300
+ exports.PromiseCacheCore = PromiseCacheCore;
301
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./core.js"), exports);
5
+ tslib_1.__exportStar(require("./types.js"), exports);
6
+ tslib_1.__exportStar(require("./cache.js"), exports);
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,qDAA2B;AAC3B,qDAA2B"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeferredGetter = void 0;
4
+ var DeferredGetter;
5
+ (function (DeferredGetter) {
6
+ const _resolvedPromise = Promise.resolve(null);
7
+ /** Empty resolved value. */
8
+ DeferredGetter.Empty = {
9
+ get current() { return null; },
10
+ get promise() { return _resolvedPromise; },
11
+ get isLoading() { return false; },
12
+ get error() { return null; },
13
+ };
14
+ })(DeferredGetter || (exports.DeferredGetter = DeferredGetter = {}));
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/structures/promiseCache/types.ts"],"names":[],"mappings":";;;AAgBA,IAAiB,cAAc,CAU9B;AAVD,WAAiB,cAAc;IAC3B,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAO,IAAI,CAAC,CAAC;IAErD,4BAA4B;IACf,oBAAK,GAAG;QACjB,IAAI,OAAO,KAAW,OAAO,IAAI,CAAC,CAAC,CAAC;QACpC,IAAI,OAAO,KAAoB,OAAO,gBAAgB,CAAC,CAAC,CAAC;QACzD,IAAI,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;KACA,CAAC;AACrC,CAAC,EAVgB,cAAc,8BAAd,cAAc,QAU9B"}
@@ -5,4 +5,5 @@ tslib_1.__exportStar(require("./deep.js"), exports);
5
5
  tslib_1.__exportStar(require("./getter.js"), exports);
6
6
  tslib_1.__exportStar(require("./comparator.js"), exports);
7
7
  tslib_1.__exportStar(require("./misc.js"), exports);
8
+ tslib_1.__exportStar(require("./isPlainObject.js"), exports);
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,sDAA4B;AAC5B,0DAAgC;AAChC,oDAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,sDAA4B;AAC5B,0DAAgC;AAChC,oDAA0B;AAC1B,6DAAmC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPlainObject = isPlainObject;
4
+ /**
5
+ * Checks if a value is a plain object (created by `{}`, `Object.create(null)`, or `new Object()`).
6
+ * Returns `false` for class instances like `FormData`, `Blob`, `Buffer`, etc.
7
+ */
8
+ function isPlainObject(value) {
9
+ if (value == null || typeof value !== 'object') {
10
+ return false;
11
+ }
12
+ const proto = Object.getPrototypeOf(value);
13
+ return proto === Object.prototype || proto === null;
14
+ }
15
+ //# sourceMappingURL=isPlainObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isPlainObject.js","sourceRoot":"","sources":["../../../src/types/isPlainObject.ts"],"names":[],"mappings":";;AAKA,sCAMC;AAVD;;;GAGG;AACH,SAAgB,aAAa,CAAC,KAAc;IACxC,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AACxD,CAAC"}
@@ -1,7 +1,17 @@
1
1
  import {} from '../types/misc.js';
2
+ import { isPlainObject } from '../types/isPlainObject.js';
2
3
  import { EndpointsPathsConfig } from './config.js';
3
4
  export function createConfig(endpointsConfig, api, data, extra) {
4
5
  const { headers, log = 'res', noLoader, ...restExtra } = extra || {};
6
+ // Guard against non-plain objects (e.g. FormData, Blob) that would be destroyed by spread.
7
+ // Only plain objects can be spread for path/query extraction.
8
+ if (data != null && typeof data === 'object' && !isPlainObject(data)) {
9
+ const name = data.constructor?.name ?? typeof data;
10
+ throw new TypeError(`API caller received a non-plain object as data (got ${name}). `
11
+ + 'Only plain objects are supported because data is spread for path/query extraction. '
12
+ + 'For FormData/multipart uploads, pass a plain object and use the IEndpointFormData extension '
13
+ + 'with .asFormData(), or use a beforeRequest hook to replace config.data.');
14
+ }
5
15
  const resultInput = data && { ...data };
6
16
  const pathInputs = {};
7
17
  const queryInputs = {};
@@ -1 +1 @@
1
- {"version":3,"file":"call.config.js","sourceRoot":"","sources":["../../../src/api/call.config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"call.config.js","sourceRoot":"","sources":["../../../src/api/call.config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { isPlainObject } from '../../types/isPlainObject.js';
2
+ /**
3
+ * Creates a default FormData serializer.
4
+ *
5
+ * Iterates over own enumerable properties of the data object and appends them to a new FormData instance.
6
+ *
7
+ * - `Blob`/`File` values are appended as-is
8
+ * - `null`/`undefined` values are skipped
9
+ * - Primitive values are converted to strings
10
+ * - Objects/arrays are JSON-stringified by default (configurable via `serializeValue`)
11
+ */
12
+ export function createFormDataSerializer(options) {
13
+ const Ctor = options?.FormData ?? globalThis.FormData;
14
+ if (typeof Ctor !== 'function') {
15
+ throw new TypeError('FormData is not available in this environment. '
16
+ + 'Pass a FormData constructor via options.FormData (e.g., from the `form-data` npm package).');
17
+ }
18
+ const serializeValue = options?.serializeValue ?? 'json';
19
+ return (data) => {
20
+ const fd = new Ctor();
21
+ for (const [key, value] of Object.entries(data)) {
22
+ if (value == null) {
23
+ continue;
24
+ }
25
+ if (typeof Blob !== 'undefined' && value instanceof Blob) {
26
+ fd.append(key, value);
27
+ continue;
28
+ }
29
+ if (typeof value !== 'object') {
30
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
31
+ fd.append(key, String(value));
32
+ continue;
33
+ }
34
+ if (typeof serializeValue === 'function') {
35
+ const serialized = serializeValue(key, value);
36
+ if (typeof Blob !== 'undefined' && serialized instanceof Blob) {
37
+ fd.append(key, serialized);
38
+ }
39
+ else {
40
+ fd.append(key, serialized);
41
+ }
42
+ }
43
+ else {
44
+ fd.append(key, JSON.stringify(value));
45
+ }
46
+ }
47
+ return fd;
48
+ };
49
+ }
50
+ export var IEndpointFormData;
51
+ (function (IEndpointFormData) {
52
+ IEndpointFormData.extender = (base) => {
53
+ const ext = {
54
+ formData: undefined,
55
+ asFormData(serializer) {
56
+ this.formData = serializer ?? true;
57
+ return this;
58
+ },
59
+ };
60
+ return Object.assign(base, ext);
61
+ };
62
+ function guard(api) {
63
+ return 'formData' in api && !!api.formData;
64
+ }
65
+ IEndpointFormData.guard = guard;
66
+ /**
67
+ * Creates caller hooks for FormData serialization.
68
+ *
69
+ * The hook converts `config.data` (plain object) into a FormData instance using the provided serializer.
70
+ *
71
+ * @param serializer - Default serializer used when endpoint has `.asFormData()` without a custom serializer.
72
+ * Use {@link createFormDataSerializer} for the built-in one, or provide a fully custom function.
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * // Simplest setup (global FormData, JSON-stringify objects)
77
+ * IEndpointFormData.createHooks(createFormDataSerializer())
78
+ *
79
+ * // Custom FormData constructor
80
+ * import FormDataNode from 'form-data';
81
+ * IEndpointFormData.createHooks(createFormDataSerializer({ FormData: FormDataNode as any }))
82
+ *
83
+ * // Fully custom serializer
84
+ * IEndpointFormData.createHooks((data) => {
85
+ * const fd = new FormData();
86
+ * // custom logic...
87
+ * return fd;
88
+ * })
89
+ * ```
90
+ */
91
+ function createHooks(serializer) {
92
+ return {
93
+ beforeRequest: (config) => {
94
+ if (!guard(config._meta.api) || !config.data) {
95
+ return;
96
+ }
97
+ // Skip if data was already transformed by a previous hook (e.g., to FormData, Blob, string)
98
+ if (!isPlainObject(config.data)) {
99
+ return;
100
+ }
101
+ const endpoint = config._meta.api;
102
+ const ser = typeof endpoint.formData === 'function'
103
+ ? endpoint.formData
104
+ : serializer;
105
+ config.data = ser(config.data);
106
+ },
107
+ };
108
+ }
109
+ IEndpointFormData.createHooks = createHooks;
110
+ })(IEndpointFormData || (IEndpointFormData = {}));
111
+ //# sourceMappingURL=formData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formData.js","sourceRoot":"","sources":["../../../../src/api/extensions/formData.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export * from './contentType.js';
2
+ export * from './formData.js';
2
3
  export * from './validation.js';
3
4
  export * from './endpointHooks.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/api/extensions/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/api/extensions/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}