@spoosh/core 0.13.1 → 0.13.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 +16 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +71 -53
- package/dist/index.mjs +71 -53
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1748,6 +1748,21 @@ type TagOptions = {
|
|
|
1748
1748
|
};
|
|
1749
1749
|
declare function resolveTags(options: TagOptions | undefined, resolvedPath: string[]): string[];
|
|
1750
1750
|
declare function resolvePath(path: string[], params: Record<string, string | number> | undefined): string[];
|
|
1751
|
+
/**
|
|
1752
|
+
* Resolves dynamic path parameters in a string path.
|
|
1753
|
+
* Unlike `resolvePath`, this works with string paths and doesn't throw on missing params.
|
|
1754
|
+
*
|
|
1755
|
+
* @param path - The path string with dynamic segments (e.g., "products/:id/comments")
|
|
1756
|
+
* @param params - The params object containing values to substitute
|
|
1757
|
+
* @returns The resolved path string (e.g., "products/1/comments")
|
|
1758
|
+
*
|
|
1759
|
+
* @example
|
|
1760
|
+
* ```ts
|
|
1761
|
+
* resolvePathString("products/:id/comments", { id: 1 })
|
|
1762
|
+
* // => "products/1/comments"
|
|
1763
|
+
* ```
|
|
1764
|
+
*/
|
|
1765
|
+
declare function resolvePathString(path: string, params: Record<string, string | number> | undefined): string;
|
|
1751
1766
|
|
|
1752
1767
|
declare const isNetworkError: (err: unknown) => boolean;
|
|
1753
1768
|
declare const isAbortError: (err: unknown) => boolean;
|
|
@@ -2002,4 +2017,4 @@ type CreateInfiniteReadOptions<TData, TItem, TError, TRequest> = {
|
|
|
2002
2017
|
};
|
|
2003
2018
|
declare function createInfiniteReadController<TData, TItem, TError, TRequest extends InfiniteRequestOptions = InfiniteRequestOptions>(options: CreateInfiniteReadOptions<TData, TItem, TError, TRequest>): InfiniteReadController<TData, TItem, TError>;
|
|
2004
2019
|
|
|
2005
|
-
export { type AnyRequestOptions, type ApiSchema, type BuiltInEvents, type CacheEntry, type CacheEntryWithKey, type CapturedCall, type ComputeRequestOptions, type CoreRequestOptionsBase, type CreateInfiniteReadOptions, type CreateOperationOptions, type DataAwareCallback, type DataAwareTransform, type DevtoolEvents, type EventEmitter, type EventListener, type EventOptions, type EventTracer, type ExtractBody$1 as ExtractBody, type ExtractData, type ExtractError, type ExtractMethodOptions, type ExtractParamNames, type ExtractQuery$1 as ExtractQuery, type FetchDirection, type FetchExecutor, type FindMatchingKey, HTTP_METHODS, type HasParams, type HasReadMethod, type HasWriteMethod, type HeadersInitOrGetter, type HttpMethod, type HttpMethodKey, type InfiniteReadController, type InfiniteReadState, type InfiniteRequestOptions, type InstanceApiContext, type InstanceApiResolvers, type InstancePluginExecutor, type LifecyclePhase, type MergePluginInstanceApi, type MergePluginOptions, type MergePluginResults, type MethodOptionsMap, type OperationController, type OperationState, type OperationType, type PageContext, type PluginAccessor, type PluginArray, type PluginContext, type PluginContextBase, type PluginContextExtensions, type PluginContextInput, type PluginExecutor, type PluginExportsRegistry, type PluginFactory, type PluginHandler, type PluginLifecycle, type PluginMiddleware, type PluginRegistry, type PluginRequestOptions, type PluginResolvers, type PluginResponseHandler, type PluginResultResolvers, type PluginTypeConfig, type PluginUpdateHandler, type ReadClient, type ReadPaths, type ReadSchemaHelper, type RefetchEvent, type RequestCompleteEvent, type RequestOptions$1 as RequestOptions, type RequestTracer, type ResolveInstanceApi, type ResolveResultTypes, type ResolveSchemaTypes, type ResolveTypes, type ResolverContext, type SchemaPaths, type SelectedEndpoint, type SelectorFunction, type SelectorResult, type SetupContext, type Simplify, Spoosh, type SpooshBody, type SpooshClient, type SpooshConfig, type SpooshInstance, type SpooshOptions, type SpooshOptionsInput, type SpooshPlugin, type SpooshResponse, type SpooshSchema, type StandaloneEvent, type StateManager, type StripPrefix, type TagMode, type TagOptions, type Trace, type TraceColor, type TraceEvent, type TraceInfo, type TraceListener, type TraceOptions, type TraceStage, type Transport, type TransportOption, type TransportOptionsMap, type TransportResponse, type WriteClient, type WriteMethod, type WritePaths, type WriteSchemaHelper, type WriteSelectorClient, __DEV__, buildUrl, clone, containsFile, createClient, createEventEmitter, createInfiniteReadController, createInitialState, createOperationController, createPluginExecutor, createPluginRegistry, createProxyHandler, createSelectorProxy, createStateManager, createTracer, executeFetch, extractMethodFromSelector, extractPathFromSelector, fetchTransport, form, generateTags, getContentType, isAbortError, isJsonBody, isNetworkError, isSpooshBody, json, mergeHeaders, objectToFormData, objectToUrlEncoded, resolveHeadersToRecord, resolvePath, resolveRequestBody, resolveTags, setHeaders, sortObjectKeys, urlencoded, xhrTransport };
|
|
2020
|
+
export { type AnyRequestOptions, type ApiSchema, type BuiltInEvents, type CacheEntry, type CacheEntryWithKey, type CapturedCall, type ComputeRequestOptions, type CoreRequestOptionsBase, type CreateInfiniteReadOptions, type CreateOperationOptions, type DataAwareCallback, type DataAwareTransform, type DevtoolEvents, type EventEmitter, type EventListener, type EventOptions, type EventTracer, type ExtractBody$1 as ExtractBody, type ExtractData, type ExtractError, type ExtractMethodOptions, type ExtractParamNames, type ExtractQuery$1 as ExtractQuery, type FetchDirection, type FetchExecutor, type FindMatchingKey, HTTP_METHODS, type HasParams, type HasReadMethod, type HasWriteMethod, type HeadersInitOrGetter, type HttpMethod, type HttpMethodKey, type InfiniteReadController, type InfiniteReadState, type InfiniteRequestOptions, type InstanceApiContext, type InstanceApiResolvers, type InstancePluginExecutor, type LifecyclePhase, type MergePluginInstanceApi, type MergePluginOptions, type MergePluginResults, type MethodOptionsMap, type OperationController, type OperationState, type OperationType, type PageContext, type PluginAccessor, type PluginArray, type PluginContext, type PluginContextBase, type PluginContextExtensions, type PluginContextInput, type PluginExecutor, type PluginExportsRegistry, type PluginFactory, type PluginHandler, type PluginLifecycle, type PluginMiddleware, type PluginRegistry, type PluginRequestOptions, type PluginResolvers, type PluginResponseHandler, type PluginResultResolvers, type PluginTypeConfig, type PluginUpdateHandler, type ReadClient, type ReadPaths, type ReadSchemaHelper, type RefetchEvent, type RequestCompleteEvent, type RequestOptions$1 as RequestOptions, type RequestTracer, type ResolveInstanceApi, type ResolveResultTypes, type ResolveSchemaTypes, type ResolveTypes, type ResolverContext, type SchemaPaths, type SelectedEndpoint, type SelectorFunction, type SelectorResult, type SetupContext, type Simplify, Spoosh, type SpooshBody, type SpooshClient, type SpooshConfig, type SpooshInstance, type SpooshOptions, type SpooshOptionsInput, type SpooshPlugin, type SpooshResponse, type SpooshSchema, type StandaloneEvent, type StateManager, type StripPrefix, type TagMode, type TagOptions, type Trace, type TraceColor, type TraceEvent, type TraceInfo, type TraceListener, type TraceOptions, type TraceStage, type Transport, type TransportOption, type TransportOptionsMap, type TransportResponse, type WriteClient, type WriteMethod, type WritePaths, type WriteSchemaHelper, type WriteSelectorClient, __DEV__, buildUrl, clone, containsFile, createClient, createEventEmitter, createInfiniteReadController, createInitialState, createOperationController, createPluginExecutor, createPluginRegistry, createProxyHandler, createSelectorProxy, createStateManager, createTracer, executeFetch, extractMethodFromSelector, extractPathFromSelector, fetchTransport, form, generateTags, getContentType, isAbortError, isJsonBody, isNetworkError, isSpooshBody, json, mergeHeaders, objectToFormData, objectToUrlEncoded, resolveHeadersToRecord, resolvePath, resolvePathString, resolveRequestBody, resolveTags, setHeaders, sortObjectKeys, urlencoded, xhrTransport };
|
package/dist/index.d.ts
CHANGED
|
@@ -1748,6 +1748,21 @@ type TagOptions = {
|
|
|
1748
1748
|
};
|
|
1749
1749
|
declare function resolveTags(options: TagOptions | undefined, resolvedPath: string[]): string[];
|
|
1750
1750
|
declare function resolvePath(path: string[], params: Record<string, string | number> | undefined): string[];
|
|
1751
|
+
/**
|
|
1752
|
+
* Resolves dynamic path parameters in a string path.
|
|
1753
|
+
* Unlike `resolvePath`, this works with string paths and doesn't throw on missing params.
|
|
1754
|
+
*
|
|
1755
|
+
* @param path - The path string with dynamic segments (e.g., "products/:id/comments")
|
|
1756
|
+
* @param params - The params object containing values to substitute
|
|
1757
|
+
* @returns The resolved path string (e.g., "products/1/comments")
|
|
1758
|
+
*
|
|
1759
|
+
* @example
|
|
1760
|
+
* ```ts
|
|
1761
|
+
* resolvePathString("products/:id/comments", { id: 1 })
|
|
1762
|
+
* // => "products/1/comments"
|
|
1763
|
+
* ```
|
|
1764
|
+
*/
|
|
1765
|
+
declare function resolvePathString(path: string, params: Record<string, string | number> | undefined): string;
|
|
1751
1766
|
|
|
1752
1767
|
declare const isNetworkError: (err: unknown) => boolean;
|
|
1753
1768
|
declare const isAbortError: (err: unknown) => boolean;
|
|
@@ -2002,4 +2017,4 @@ type CreateInfiniteReadOptions<TData, TItem, TError, TRequest> = {
|
|
|
2002
2017
|
};
|
|
2003
2018
|
declare function createInfiniteReadController<TData, TItem, TError, TRequest extends InfiniteRequestOptions = InfiniteRequestOptions>(options: CreateInfiniteReadOptions<TData, TItem, TError, TRequest>): InfiniteReadController<TData, TItem, TError>;
|
|
2004
2019
|
|
|
2005
|
-
export { type AnyRequestOptions, type ApiSchema, type BuiltInEvents, type CacheEntry, type CacheEntryWithKey, type CapturedCall, type ComputeRequestOptions, type CoreRequestOptionsBase, type CreateInfiniteReadOptions, type CreateOperationOptions, type DataAwareCallback, type DataAwareTransform, type DevtoolEvents, type EventEmitter, type EventListener, type EventOptions, type EventTracer, type ExtractBody$1 as ExtractBody, type ExtractData, type ExtractError, type ExtractMethodOptions, type ExtractParamNames, type ExtractQuery$1 as ExtractQuery, type FetchDirection, type FetchExecutor, type FindMatchingKey, HTTP_METHODS, type HasParams, type HasReadMethod, type HasWriteMethod, type HeadersInitOrGetter, type HttpMethod, type HttpMethodKey, type InfiniteReadController, type InfiniteReadState, type InfiniteRequestOptions, type InstanceApiContext, type InstanceApiResolvers, type InstancePluginExecutor, type LifecyclePhase, type MergePluginInstanceApi, type MergePluginOptions, type MergePluginResults, type MethodOptionsMap, type OperationController, type OperationState, type OperationType, type PageContext, type PluginAccessor, type PluginArray, type PluginContext, type PluginContextBase, type PluginContextExtensions, type PluginContextInput, type PluginExecutor, type PluginExportsRegistry, type PluginFactory, type PluginHandler, type PluginLifecycle, type PluginMiddleware, type PluginRegistry, type PluginRequestOptions, type PluginResolvers, type PluginResponseHandler, type PluginResultResolvers, type PluginTypeConfig, type PluginUpdateHandler, type ReadClient, type ReadPaths, type ReadSchemaHelper, type RefetchEvent, type RequestCompleteEvent, type RequestOptions$1 as RequestOptions, type RequestTracer, type ResolveInstanceApi, type ResolveResultTypes, type ResolveSchemaTypes, type ResolveTypes, type ResolverContext, type SchemaPaths, type SelectedEndpoint, type SelectorFunction, type SelectorResult, type SetupContext, type Simplify, Spoosh, type SpooshBody, type SpooshClient, type SpooshConfig, type SpooshInstance, type SpooshOptions, type SpooshOptionsInput, type SpooshPlugin, type SpooshResponse, type SpooshSchema, type StandaloneEvent, type StateManager, type StripPrefix, type TagMode, type TagOptions, type Trace, type TraceColor, type TraceEvent, type TraceInfo, type TraceListener, type TraceOptions, type TraceStage, type Transport, type TransportOption, type TransportOptionsMap, type TransportResponse, type WriteClient, type WriteMethod, type WritePaths, type WriteSchemaHelper, type WriteSelectorClient, __DEV__, buildUrl, clone, containsFile, createClient, createEventEmitter, createInfiniteReadController, createInitialState, createOperationController, createPluginExecutor, createPluginRegistry, createProxyHandler, createSelectorProxy, createStateManager, createTracer, executeFetch, extractMethodFromSelector, extractPathFromSelector, fetchTransport, form, generateTags, getContentType, isAbortError, isJsonBody, isNetworkError, isSpooshBody, json, mergeHeaders, objectToFormData, objectToUrlEncoded, resolveHeadersToRecord, resolvePath, resolveRequestBody, resolveTags, setHeaders, sortObjectKeys, urlencoded, xhrTransport };
|
|
2020
|
+
export { type AnyRequestOptions, type ApiSchema, type BuiltInEvents, type CacheEntry, type CacheEntryWithKey, type CapturedCall, type ComputeRequestOptions, type CoreRequestOptionsBase, type CreateInfiniteReadOptions, type CreateOperationOptions, type DataAwareCallback, type DataAwareTransform, type DevtoolEvents, type EventEmitter, type EventListener, type EventOptions, type EventTracer, type ExtractBody$1 as ExtractBody, type ExtractData, type ExtractError, type ExtractMethodOptions, type ExtractParamNames, type ExtractQuery$1 as ExtractQuery, type FetchDirection, type FetchExecutor, type FindMatchingKey, HTTP_METHODS, type HasParams, type HasReadMethod, type HasWriteMethod, type HeadersInitOrGetter, type HttpMethod, type HttpMethodKey, type InfiniteReadController, type InfiniteReadState, type InfiniteRequestOptions, type InstanceApiContext, type InstanceApiResolvers, type InstancePluginExecutor, type LifecyclePhase, type MergePluginInstanceApi, type MergePluginOptions, type MergePluginResults, type MethodOptionsMap, type OperationController, type OperationState, type OperationType, type PageContext, type PluginAccessor, type PluginArray, type PluginContext, type PluginContextBase, type PluginContextExtensions, type PluginContextInput, type PluginExecutor, type PluginExportsRegistry, type PluginFactory, type PluginHandler, type PluginLifecycle, type PluginMiddleware, type PluginRegistry, type PluginRequestOptions, type PluginResolvers, type PluginResponseHandler, type PluginResultResolvers, type PluginTypeConfig, type PluginUpdateHandler, type ReadClient, type ReadPaths, type ReadSchemaHelper, type RefetchEvent, type RequestCompleteEvent, type RequestOptions$1 as RequestOptions, type RequestTracer, type ResolveInstanceApi, type ResolveResultTypes, type ResolveSchemaTypes, type ResolveTypes, type ResolverContext, type SchemaPaths, type SelectedEndpoint, type SelectorFunction, type SelectorResult, type SetupContext, type Simplify, Spoosh, type SpooshBody, type SpooshClient, type SpooshConfig, type SpooshInstance, type SpooshOptions, type SpooshOptionsInput, type SpooshPlugin, type SpooshResponse, type SpooshSchema, type StandaloneEvent, type StateManager, type StripPrefix, type TagMode, type TagOptions, type Trace, type TraceColor, type TraceEvent, type TraceInfo, type TraceListener, type TraceOptions, type TraceStage, type Transport, type TransportOption, type TransportOptionsMap, type TransportResponse, type WriteClient, type WriteMethod, type WritePaths, type WriteSchemaHelper, type WriteSelectorClient, __DEV__, buildUrl, clone, containsFile, createClient, createEventEmitter, createInfiniteReadController, createInitialState, createOperationController, createPluginExecutor, createPluginRegistry, createProxyHandler, createSelectorProxy, createStateManager, createTracer, executeFetch, extractMethodFromSelector, extractPathFromSelector, fetchTransport, form, generateTags, getContentType, isAbortError, isJsonBody, isNetworkError, isSpooshBody, json, mergeHeaders, objectToFormData, objectToUrlEncoded, resolveHeadersToRecord, resolvePath, resolvePathString, resolveRequestBody, resolveTags, setHeaders, sortObjectKeys, urlencoded, xhrTransport };
|
package/dist/index.js
CHANGED
|
@@ -54,6 +54,7 @@ __export(src_exports, {
|
|
|
54
54
|
objectToUrlEncoded: () => objectToUrlEncoded,
|
|
55
55
|
resolveHeadersToRecord: () => resolveHeadersToRecord,
|
|
56
56
|
resolvePath: () => resolvePath,
|
|
57
|
+
resolvePathString: () => resolvePathString,
|
|
57
58
|
resolveRequestBody: () => resolveRequestBody,
|
|
58
59
|
resolveTags: () => resolveTags,
|
|
59
60
|
setHeaders: () => setHeaders,
|
|
@@ -355,6 +356,17 @@ function resolvePath(path, params) {
|
|
|
355
356
|
return segment;
|
|
356
357
|
});
|
|
357
358
|
}
|
|
359
|
+
function resolvePathString(path, params) {
|
|
360
|
+
if (!params) return path;
|
|
361
|
+
return path.split("/").map((segment) => {
|
|
362
|
+
if (segment.startsWith(":")) {
|
|
363
|
+
const paramName = segment.slice(1);
|
|
364
|
+
const value = params[paramName];
|
|
365
|
+
return value !== void 0 ? String(value) : segment;
|
|
366
|
+
}
|
|
367
|
+
return segment;
|
|
368
|
+
}).join("/");
|
|
369
|
+
}
|
|
358
370
|
|
|
359
371
|
// src/utils/errors.ts
|
|
360
372
|
var isNetworkError = (err) => err instanceof TypeError;
|
|
@@ -415,7 +427,15 @@ var fetchTransport = async (url, init) => {
|
|
|
415
427
|
const res = await fetch(url, init);
|
|
416
428
|
const contentType = res.headers.get("content-type");
|
|
417
429
|
const isJson = contentType?.includes("application/json");
|
|
418
|
-
const
|
|
430
|
+
const isText = contentType?.includes("text/") || contentType?.includes("application/xml");
|
|
431
|
+
let data;
|
|
432
|
+
if (isJson) {
|
|
433
|
+
data = await res.json();
|
|
434
|
+
} else if (isText) {
|
|
435
|
+
data = await res.text();
|
|
436
|
+
} else {
|
|
437
|
+
data = void 0;
|
|
438
|
+
}
|
|
419
439
|
return { ok: res.ok, status: res.status, headers: res.headers, data };
|
|
420
440
|
};
|
|
421
441
|
|
|
@@ -1325,30 +1345,26 @@ function createOperationController(options) {
|
|
|
1325
1345
|
const coreFetch = async () => {
|
|
1326
1346
|
abortController = new AbortController();
|
|
1327
1347
|
context.request.signal = abortController.signal;
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
}
|
|
1340
|
-
})();
|
|
1341
|
-
stateManager.setPendingPromise(queryKey, fetchPromise);
|
|
1342
|
-
fetchPromise.finally(() => {
|
|
1343
|
-
stateManager.setPendingPromise(queryKey, void 0);
|
|
1344
|
-
});
|
|
1345
|
-
return fetchPromise;
|
|
1348
|
+
try {
|
|
1349
|
+
const response = await fetchFn(context.request);
|
|
1350
|
+
return response;
|
|
1351
|
+
} catch (err) {
|
|
1352
|
+
const errorResponse = {
|
|
1353
|
+
status: 0,
|
|
1354
|
+
error: err,
|
|
1355
|
+
data: void 0
|
|
1356
|
+
};
|
|
1357
|
+
return errorResponse;
|
|
1358
|
+
}
|
|
1346
1359
|
};
|
|
1347
|
-
const
|
|
1360
|
+
const middlewarePromise = pluginExecutor.executeMiddleware(
|
|
1348
1361
|
operationType,
|
|
1349
1362
|
context,
|
|
1350
1363
|
coreFetch
|
|
1351
1364
|
);
|
|
1365
|
+
stateManager.setPendingPromise(queryKey, middlewarePromise);
|
|
1366
|
+
const finalResponse = await middlewarePromise;
|
|
1367
|
+
stateManager.setPendingPromise(queryKey, void 0);
|
|
1352
1368
|
if (finalResponse.data !== void 0 && !finalResponse.error) {
|
|
1353
1369
|
updateState({
|
|
1354
1370
|
data: finalResponse.data,
|
|
@@ -1483,6 +1499,7 @@ function createInfiniteReadController(options) {
|
|
|
1483
1499
|
let cachedState = createInitialInfiniteState();
|
|
1484
1500
|
const trackerKey = createTrackerKey(path, method, baseOptionsForKey);
|
|
1485
1501
|
let pageSubscriptions = [];
|
|
1502
|
+
let trackerSubscription = null;
|
|
1486
1503
|
let refetchUnsubscribe = null;
|
|
1487
1504
|
const loadFromTracker = () => {
|
|
1488
1505
|
const cached = stateManager.getCache(trackerKey);
|
|
@@ -1597,52 +1614,50 @@ function createInfiniteReadController(options) {
|
|
|
1597
1614
|
}
|
|
1598
1615
|
pendingFetches.add(pageKey);
|
|
1599
1616
|
fetchingDirection = direction;
|
|
1617
|
+
latestError = void 0;
|
|
1600
1618
|
notify();
|
|
1601
1619
|
abortController = new AbortController();
|
|
1602
1620
|
const signal = abortController.signal;
|
|
1603
1621
|
const context = createContext(pageKey, mergedRequest);
|
|
1604
1622
|
const coreFetch = async () => {
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
return {
|
|
1610
|
-
status: 0,
|
|
1611
|
-
data: void 0,
|
|
1612
|
-
aborted: true
|
|
1613
|
-
};
|
|
1614
|
-
}
|
|
1615
|
-
return response;
|
|
1616
|
-
} catch (err) {
|
|
1617
|
-
if (signal.aborted) {
|
|
1618
|
-
return {
|
|
1619
|
-
status: 0,
|
|
1620
|
-
data: void 0,
|
|
1621
|
-
aborted: true
|
|
1622
|
-
};
|
|
1623
|
-
}
|
|
1624
|
-
const errorResponse = {
|
|
1623
|
+
try {
|
|
1624
|
+
const response = await fetchFn(mergedRequest, signal);
|
|
1625
|
+
if (signal.aborted) {
|
|
1626
|
+
return {
|
|
1625
1627
|
status: 0,
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
+
data: void 0,
|
|
1629
|
+
aborted: true
|
|
1630
|
+
};
|
|
1631
|
+
}
|
|
1632
|
+
return response;
|
|
1633
|
+
} catch (err) {
|
|
1634
|
+
if (signal.aborted) {
|
|
1635
|
+
return {
|
|
1636
|
+
status: 0,
|
|
1637
|
+
data: void 0,
|
|
1638
|
+
aborted: true
|
|
1628
1639
|
};
|
|
1629
|
-
latestError = err;
|
|
1630
|
-
return errorResponse;
|
|
1631
|
-
} finally {
|
|
1632
|
-
pendingFetches.delete(pageKey);
|
|
1633
|
-
fetchingDirection = null;
|
|
1634
|
-
stateManager.setPendingPromise(pageKey, void 0);
|
|
1635
|
-
notify();
|
|
1636
1640
|
}
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1641
|
+
const errorResponse = {
|
|
1642
|
+
status: 0,
|
|
1643
|
+
error: err,
|
|
1644
|
+
data: void 0
|
|
1645
|
+
};
|
|
1646
|
+
latestError = err;
|
|
1647
|
+
return errorResponse;
|
|
1648
|
+
}
|
|
1640
1649
|
};
|
|
1641
|
-
const
|
|
1650
|
+
const middlewarePromise = pluginExecutor.executeMiddleware(
|
|
1642
1651
|
"infiniteRead",
|
|
1643
1652
|
context,
|
|
1644
1653
|
coreFetch
|
|
1645
1654
|
);
|
|
1655
|
+
stateManager.setPendingPromise(pageKey, middlewarePromise);
|
|
1656
|
+
const finalResponse = await middlewarePromise;
|
|
1657
|
+
pendingFetches.delete(pageKey);
|
|
1658
|
+
fetchingDirection = null;
|
|
1659
|
+
stateManager.setPendingPromise(pageKey, void 0);
|
|
1660
|
+
notify();
|
|
1646
1661
|
if (finalResponse.data !== void 0 && !finalResponse.error) {
|
|
1647
1662
|
pageRequests.set(pageKey, mergedRequest);
|
|
1648
1663
|
if (direction === "next") {
|
|
@@ -1755,6 +1770,7 @@ function createInfiniteReadController(options) {
|
|
|
1755
1770
|
loadFromTracker();
|
|
1756
1771
|
cachedState = computeState();
|
|
1757
1772
|
subscribeToPages();
|
|
1773
|
+
trackerSubscription = stateManager.subscribeCache(trackerKey, notify);
|
|
1758
1774
|
const context = createContext(trackerKey, initialRequest);
|
|
1759
1775
|
pluginExecutor.executeLifecycle("onMount", "infiniteRead", context);
|
|
1760
1776
|
refetchUnsubscribe = eventEmitter.on("refetch", (event) => {
|
|
@@ -1776,6 +1792,8 @@ function createInfiniteReadController(options) {
|
|
|
1776
1792
|
pluginExecutor.executeLifecycle("onUnmount", "infiniteRead", context);
|
|
1777
1793
|
pageSubscriptions.forEach((unsub) => unsub());
|
|
1778
1794
|
pageSubscriptions = [];
|
|
1795
|
+
trackerSubscription?.();
|
|
1796
|
+
trackerSubscription = null;
|
|
1779
1797
|
refetchUnsubscribe?.();
|
|
1780
1798
|
refetchUnsubscribe = null;
|
|
1781
1799
|
},
|
package/dist/index.mjs
CHANGED
|
@@ -290,6 +290,17 @@ function resolvePath(path, params) {
|
|
|
290
290
|
return segment;
|
|
291
291
|
});
|
|
292
292
|
}
|
|
293
|
+
function resolvePathString(path, params) {
|
|
294
|
+
if (!params) return path;
|
|
295
|
+
return path.split("/").map((segment) => {
|
|
296
|
+
if (segment.startsWith(":")) {
|
|
297
|
+
const paramName = segment.slice(1);
|
|
298
|
+
const value = params[paramName];
|
|
299
|
+
return value !== void 0 ? String(value) : segment;
|
|
300
|
+
}
|
|
301
|
+
return segment;
|
|
302
|
+
}).join("/");
|
|
303
|
+
}
|
|
293
304
|
|
|
294
305
|
// src/utils/errors.ts
|
|
295
306
|
var isNetworkError = (err) => err instanceof TypeError;
|
|
@@ -350,7 +361,15 @@ var fetchTransport = async (url, init) => {
|
|
|
350
361
|
const res = await fetch(url, init);
|
|
351
362
|
const contentType = res.headers.get("content-type");
|
|
352
363
|
const isJson = contentType?.includes("application/json");
|
|
353
|
-
const
|
|
364
|
+
const isText = contentType?.includes("text/") || contentType?.includes("application/xml");
|
|
365
|
+
let data;
|
|
366
|
+
if (isJson) {
|
|
367
|
+
data = await res.json();
|
|
368
|
+
} else if (isText) {
|
|
369
|
+
data = await res.text();
|
|
370
|
+
} else {
|
|
371
|
+
data = void 0;
|
|
372
|
+
}
|
|
354
373
|
return { ok: res.ok, status: res.status, headers: res.headers, data };
|
|
355
374
|
};
|
|
356
375
|
|
|
@@ -1260,30 +1279,26 @@ function createOperationController(options) {
|
|
|
1260
1279
|
const coreFetch = async () => {
|
|
1261
1280
|
abortController = new AbortController();
|
|
1262
1281
|
context.request.signal = abortController.signal;
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
}
|
|
1275
|
-
})();
|
|
1276
|
-
stateManager.setPendingPromise(queryKey, fetchPromise);
|
|
1277
|
-
fetchPromise.finally(() => {
|
|
1278
|
-
stateManager.setPendingPromise(queryKey, void 0);
|
|
1279
|
-
});
|
|
1280
|
-
return fetchPromise;
|
|
1282
|
+
try {
|
|
1283
|
+
const response = await fetchFn(context.request);
|
|
1284
|
+
return response;
|
|
1285
|
+
} catch (err) {
|
|
1286
|
+
const errorResponse = {
|
|
1287
|
+
status: 0,
|
|
1288
|
+
error: err,
|
|
1289
|
+
data: void 0
|
|
1290
|
+
};
|
|
1291
|
+
return errorResponse;
|
|
1292
|
+
}
|
|
1281
1293
|
};
|
|
1282
|
-
const
|
|
1294
|
+
const middlewarePromise = pluginExecutor.executeMiddleware(
|
|
1283
1295
|
operationType,
|
|
1284
1296
|
context,
|
|
1285
1297
|
coreFetch
|
|
1286
1298
|
);
|
|
1299
|
+
stateManager.setPendingPromise(queryKey, middlewarePromise);
|
|
1300
|
+
const finalResponse = await middlewarePromise;
|
|
1301
|
+
stateManager.setPendingPromise(queryKey, void 0);
|
|
1287
1302
|
if (finalResponse.data !== void 0 && !finalResponse.error) {
|
|
1288
1303
|
updateState({
|
|
1289
1304
|
data: finalResponse.data,
|
|
@@ -1418,6 +1433,7 @@ function createInfiniteReadController(options) {
|
|
|
1418
1433
|
let cachedState = createInitialInfiniteState();
|
|
1419
1434
|
const trackerKey = createTrackerKey(path, method, baseOptionsForKey);
|
|
1420
1435
|
let pageSubscriptions = [];
|
|
1436
|
+
let trackerSubscription = null;
|
|
1421
1437
|
let refetchUnsubscribe = null;
|
|
1422
1438
|
const loadFromTracker = () => {
|
|
1423
1439
|
const cached = stateManager.getCache(trackerKey);
|
|
@@ -1532,52 +1548,50 @@ function createInfiniteReadController(options) {
|
|
|
1532
1548
|
}
|
|
1533
1549
|
pendingFetches.add(pageKey);
|
|
1534
1550
|
fetchingDirection = direction;
|
|
1551
|
+
latestError = void 0;
|
|
1535
1552
|
notify();
|
|
1536
1553
|
abortController = new AbortController();
|
|
1537
1554
|
const signal = abortController.signal;
|
|
1538
1555
|
const context = createContext(pageKey, mergedRequest);
|
|
1539
1556
|
const coreFetch = async () => {
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
return {
|
|
1545
|
-
status: 0,
|
|
1546
|
-
data: void 0,
|
|
1547
|
-
aborted: true
|
|
1548
|
-
};
|
|
1549
|
-
}
|
|
1550
|
-
return response;
|
|
1551
|
-
} catch (err) {
|
|
1552
|
-
if (signal.aborted) {
|
|
1553
|
-
return {
|
|
1554
|
-
status: 0,
|
|
1555
|
-
data: void 0,
|
|
1556
|
-
aborted: true
|
|
1557
|
-
};
|
|
1558
|
-
}
|
|
1559
|
-
const errorResponse = {
|
|
1557
|
+
try {
|
|
1558
|
+
const response = await fetchFn(mergedRequest, signal);
|
|
1559
|
+
if (signal.aborted) {
|
|
1560
|
+
return {
|
|
1560
1561
|
status: 0,
|
|
1561
|
-
|
|
1562
|
-
|
|
1562
|
+
data: void 0,
|
|
1563
|
+
aborted: true
|
|
1564
|
+
};
|
|
1565
|
+
}
|
|
1566
|
+
return response;
|
|
1567
|
+
} catch (err) {
|
|
1568
|
+
if (signal.aborted) {
|
|
1569
|
+
return {
|
|
1570
|
+
status: 0,
|
|
1571
|
+
data: void 0,
|
|
1572
|
+
aborted: true
|
|
1563
1573
|
};
|
|
1564
|
-
latestError = err;
|
|
1565
|
-
return errorResponse;
|
|
1566
|
-
} finally {
|
|
1567
|
-
pendingFetches.delete(pageKey);
|
|
1568
|
-
fetchingDirection = null;
|
|
1569
|
-
stateManager.setPendingPromise(pageKey, void 0);
|
|
1570
|
-
notify();
|
|
1571
1574
|
}
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
+
const errorResponse = {
|
|
1576
|
+
status: 0,
|
|
1577
|
+
error: err,
|
|
1578
|
+
data: void 0
|
|
1579
|
+
};
|
|
1580
|
+
latestError = err;
|
|
1581
|
+
return errorResponse;
|
|
1582
|
+
}
|
|
1575
1583
|
};
|
|
1576
|
-
const
|
|
1584
|
+
const middlewarePromise = pluginExecutor.executeMiddleware(
|
|
1577
1585
|
"infiniteRead",
|
|
1578
1586
|
context,
|
|
1579
1587
|
coreFetch
|
|
1580
1588
|
);
|
|
1589
|
+
stateManager.setPendingPromise(pageKey, middlewarePromise);
|
|
1590
|
+
const finalResponse = await middlewarePromise;
|
|
1591
|
+
pendingFetches.delete(pageKey);
|
|
1592
|
+
fetchingDirection = null;
|
|
1593
|
+
stateManager.setPendingPromise(pageKey, void 0);
|
|
1594
|
+
notify();
|
|
1581
1595
|
if (finalResponse.data !== void 0 && !finalResponse.error) {
|
|
1582
1596
|
pageRequests.set(pageKey, mergedRequest);
|
|
1583
1597
|
if (direction === "next") {
|
|
@@ -1690,6 +1704,7 @@ function createInfiniteReadController(options) {
|
|
|
1690
1704
|
loadFromTracker();
|
|
1691
1705
|
cachedState = computeState();
|
|
1692
1706
|
subscribeToPages();
|
|
1707
|
+
trackerSubscription = stateManager.subscribeCache(trackerKey, notify);
|
|
1693
1708
|
const context = createContext(trackerKey, initialRequest);
|
|
1694
1709
|
pluginExecutor.executeLifecycle("onMount", "infiniteRead", context);
|
|
1695
1710
|
refetchUnsubscribe = eventEmitter.on("refetch", (event) => {
|
|
@@ -1711,6 +1726,8 @@ function createInfiniteReadController(options) {
|
|
|
1711
1726
|
pluginExecutor.executeLifecycle("onUnmount", "infiniteRead", context);
|
|
1712
1727
|
pageSubscriptions.forEach((unsub) => unsub());
|
|
1713
1728
|
pageSubscriptions = [];
|
|
1729
|
+
trackerSubscription?.();
|
|
1730
|
+
trackerSubscription = null;
|
|
1714
1731
|
refetchUnsubscribe?.();
|
|
1715
1732
|
refetchUnsubscribe = null;
|
|
1716
1733
|
},
|
|
@@ -1766,6 +1783,7 @@ export {
|
|
|
1766
1783
|
objectToUrlEncoded,
|
|
1767
1784
|
resolveHeadersToRecord,
|
|
1768
1785
|
resolvePath,
|
|
1786
|
+
resolvePathString,
|
|
1769
1787
|
resolveRequestBody,
|
|
1770
1788
|
resolveTags,
|
|
1771
1789
|
setHeaders,
|