@geekmidas/client 4.0.2 → 4.0.4
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/CHANGELOG.md +12 -0
- package/dist/auth-fetcher.cjs +1 -1
- package/dist/auth-fetcher.d.cts +1 -1
- package/dist/auth-fetcher.d.mts +1 -1
- package/dist/auth-fetcher.mjs +1 -1
- package/dist/endpoint-hooks.cjs +44 -1
- package/dist/endpoint-hooks.cjs.map +1 -1
- package/dist/endpoint-hooks.d.cts +24 -3
- package/dist/endpoint-hooks.d.cts.map +1 -1
- package/dist/endpoint-hooks.d.mts +24 -3
- package/dist/endpoint-hooks.d.mts.map +1 -1
- package/dist/endpoint-hooks.mjs +45 -2
- package/dist/endpoint-hooks.mjs.map +1 -1
- package/dist/{fetcher-DNt7DDn9.mjs → fetcher-CakjC9C7.mjs} +8 -9
- package/dist/fetcher-CakjC9C7.mjs.map +1 -0
- package/dist/{fetcher-CbQRQD5f.cjs → fetcher-CwnSqc4D.cjs} +8 -9
- package/dist/fetcher-CwnSqc4D.cjs.map +1 -0
- package/dist/fetcher.cjs +1 -1
- package/dist/fetcher.d.cts +6 -5
- package/dist/fetcher.d.cts.map +1 -1
- package/dist/fetcher.d.mts +6 -5
- package/dist/fetcher.d.mts.map +1 -1
- package/dist/fetcher.mjs +1 -1
- package/dist/openapi-hooks.cjs +1 -1
- package/dist/openapi-hooks.d.cts +1 -1
- package/dist/openapi-hooks.d.mts +1 -1
- package/dist/openapi-hooks.mjs +1 -1
- package/dist/react-query.cjs +1 -1
- package/dist/react-query.d.cts +1 -1
- package/dist/react-query.d.mts +1 -1
- package/dist/react-query.mjs +1 -1
- package/dist/{types-BtQ80bpa.d.mts → types-D8Jrl4o3.d.mts} +8 -7
- package/dist/{types-BtQ80bpa.d.mts.map → types-D8Jrl4o3.d.mts.map} +1 -1
- package/dist/{types-C7tGYTBD.d.cts → types-DMQMHePI.d.cts} +8 -7
- package/dist/{types-C7tGYTBD.d.cts.map → types-DMQMHePI.d.cts.map} +1 -1
- package/dist/types.d.cts +2 -2
- package/dist/types.d.mts +2 -2
- package/package.json +1 -1
- package/src/__tests__/fetcher.spec.ts +96 -25
- package/src/endpoint-hooks.ts +144 -2
- package/src/fetcher.ts +14 -7
- package/src/types.ts +9 -5
- package/dist/fetcher-CbQRQD5f.cjs.map +0 -1
- package/dist/fetcher-DNt7DDn9.mjs.map +0 -1
package/dist/openapi-hooks.mjs
CHANGED
package/dist/react-query.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_fetcher = require('./fetcher-
|
|
2
|
+
const require_fetcher = require('./fetcher-CwnSqc4D.cjs');
|
|
3
3
|
const __tanstack_react_query = require_chunk.__toESM(require("@tanstack/react-query"));
|
|
4
4
|
const react = require_chunk.__toESM(require("react"));
|
|
5
5
|
|
package/dist/react-query.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ExtractEndpointResponse, FetcherOptions, FilteredRequestConfig, MutationEndpoint, QueryEndpoint, TypedEndpoint } from "./types-
|
|
1
|
+
import { ExtractEndpointResponse, FetcherOptions, FilteredRequestConfig, MutationEndpoint, QueryEndpoint, TypedEndpoint } from "./types-DMQMHePI.cjs";
|
|
2
2
|
import * as _tanstack_react_query3 from "@tanstack/react-query";
|
|
3
3
|
import { QueryClient, UseInfiniteQueryOptions, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
|
|
4
4
|
|
package/dist/react-query.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ExtractEndpointResponse, FetcherOptions, FilteredRequestConfig, MutationEndpoint, QueryEndpoint, TypedEndpoint } from "./types-
|
|
1
|
+
import { ExtractEndpointResponse, FetcherOptions, FilteredRequestConfig, MutationEndpoint, QueryEndpoint, TypedEndpoint } from "./types-D8Jrl4o3.mjs";
|
|
2
2
|
import * as _tanstack_react_query3 from "@tanstack/react-query";
|
|
3
3
|
import { QueryClient, UseInfiniteQueryOptions, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
|
|
4
4
|
|
package/dist/react-query.mjs
CHANGED
|
@@ -96,14 +96,15 @@ interface FetcherOptions {
|
|
|
96
96
|
onError?: (error: Error) => void | Promise<void>;
|
|
97
97
|
fetch?: typeof fetch;
|
|
98
98
|
}
|
|
99
|
-
type WrappedResult<T> = {
|
|
99
|
+
type WrappedResult<T, E = unknown> = {
|
|
100
|
+
ok: true;
|
|
100
101
|
data: T;
|
|
101
|
-
error: null;
|
|
102
102
|
} | {
|
|
103
|
-
|
|
104
|
-
error:
|
|
103
|
+
ok: false;
|
|
104
|
+
error: E;
|
|
105
105
|
};
|
|
106
|
-
type
|
|
106
|
+
type ErrorTransformer<E> = (error: unknown) => E | Promise<E>;
|
|
107
|
+
type WrappedApiFunction<Paths, E = unknown> = <T extends TypedEndpoint<Paths>>(endpoint: T, ...args: IsConfigRequired<Paths, T> extends true ? [config: FilteredRequestConfig<Paths, T>] : [config?: FilteredRequestConfig<Paths, T>]) => Promise<WrappedResult<ExtractEndpointResponse<Paths, T>, E>>;
|
|
107
108
|
//#endregion
|
|
108
|
-
export { EndpointString, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
|
109
|
-
//# sourceMappingURL=types-
|
|
109
|
+
export { EndpointString, ErrorTransformer, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
|
110
|
+
//# sourceMappingURL=types-D8Jrl4o3.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-D8Jrl4o3.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -96,14 +96,15 @@ interface FetcherOptions {
|
|
|
96
96
|
onError?: (error: Error) => void | Promise<void>;
|
|
97
97
|
fetch?: typeof fetch;
|
|
98
98
|
}
|
|
99
|
-
type WrappedResult<T> = {
|
|
99
|
+
type WrappedResult<T, E = unknown> = {
|
|
100
|
+
ok: true;
|
|
100
101
|
data: T;
|
|
101
|
-
error: null;
|
|
102
102
|
} | {
|
|
103
|
-
|
|
104
|
-
error:
|
|
103
|
+
ok: false;
|
|
104
|
+
error: E;
|
|
105
105
|
};
|
|
106
|
-
type
|
|
106
|
+
type ErrorTransformer<E> = (error: unknown) => E | Promise<E>;
|
|
107
|
+
type WrappedApiFunction<Paths, E = unknown> = <T extends TypedEndpoint<Paths>>(endpoint: T, ...args: IsConfigRequired<Paths, T> extends true ? [config: FilteredRequestConfig<Paths, T>] : [config?: FilteredRequestConfig<Paths, T>]) => Promise<WrappedResult<ExtractEndpointResponse<Paths, T>, E>>;
|
|
107
108
|
//#endregion
|
|
108
|
-
export { EndpointString, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
|
109
|
-
//# sourceMappingURL=types-
|
|
109
|
+
export { EndpointString, ErrorTransformer, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
|
110
|
+
//# sourceMappingURL=types-DMQMHePI.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-DMQMHePI.d.cts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";KAAY,6BAA6B;AAAzC,KAEK,UAAA,GAFO,KAAa,GAAA,MAAgB,GAAA,KAAK,GAAA,OAAA,GAAA,QAAA,GAAA,MAAA,GAAA,SAAA;AAEzC,KASO,aATG,CAAA,KAAA,EAAA,cASgC,aAThC,CAS8C,KAT9C,CAAA,CAAA,GASwD,OATxD,CAAA,MAUR,KAVQ,CAUF,KAVE,CAAA,EAWd,UAXc,CAAA;AASH,KAKA,iBALa,CAAA,KAAA,EAAA,cAOV,aAPU,CAOI,KAPJ,CAAA,CAAA,GAQrB,KARqB,CAQf,KARe,CAAA,SAAA;EAAA,UAAA,CAAA,EAAA;IAAoC,IAAA,CAAA,EAAA,KAAA,EAAA;EAAK,CAAA;CAAN,GAWzD,CAXyD,GACrD,KAAA;AAAM,KAaD,kBAbC,CAAA,KAAA,EAAA,cAeE,aAfF,CAegB,KAfhB,CAAA,EAAA,eAgBG,aAhBH,CAgBiB,KAhBjB,EAgBwB,KAhBxB,CAAA,CAAA,GAiBT,KAjBS,CAiBH,KAjBG,CAAA,CAiBI,MAjBJ,CAAA,SAAA;EAAK,UACjB,CAAA,EAAA;IAFsE,KAAA,CAAA,EAAA,KAAA,EAAA;EAAO,CAAA;AAK9E,CAAA,GAcG,CAdS,GAAA,KAAA;AAAiB,KAiBjB,kBAjBiB,CAAA,KAAA,EAAA,cAmBd,aAnBc,CAmBA,KAnBA,CAAA,EAAA,eAoBb,aApBa,CAoBC,KApBD,EAoBQ,KApBR,CAAA,CAAA,GAqBzB,KArByB,CAqBnB,KArBmB,CAAA,CAqBZ,MArBY,CAAA,SAAA;EAAA,WAEA,CAAA,EAAA;IAAd,OAAA,CAAA,EAAA;MACX,kBAAA,CAAA,EAAA,KAAA,EAAA;IAAM,CAAA;EAAK,CAAA;AAGX,CAAA,GAkBD,CAlBC,GAAA,KAAA;AAGQ,KAkBA,eAlBkB,CAAA,KAAA,EAAA,cAoBf,aApBe,CAoBD,KApBC,CAAA,EAAA,eAqBd,aArBc,CAqBA,KArBA,EAqBO,KArBP,CAAA,CAAA,GAsB1B,KAtB0B,CAsBpB,KAtBoB,CAAA,CAsBb,MAtBa,CAAA,SAAA;EAAA,SAAA,CAAA,EAAA;IAED,GAAA,CAAA,EAAA;MAAd,OAAA,CAAA,EAAA;QACe,kBAAA,CAAA,EAAA,KAAA,EAAA;MAAO,CAAA;IAArB,CAAA;EAAa,CAAA;CACpB,GAqBN,CArBM,GAsBN,KAtBO,CAsBD,KAtBC,CAAA,CAsBM,MAtBN,CAAA,SAAA;EAAK,SAAE,CAAA,EAAA;IACd,GAAA,CAAA,EAAA;MAAC,OAAA,CAAA,EAAA;QAGQ,kBAAkB,CAAA,EAAA,KAAA,EAAA;MAAA,CAAA;IAED,CAAA;EAAK,CAAA;CAAN,GAmBxB,CAnBwB,GACE,KAAA;AAAO,KAqBzB,aArByB,CAAA,KAAA,EAAA,cAuBtB,aAvBsB,CAuBR,KAvBQ,CAAA,EAAA,eAwBrB,aAxBqB,CAwBP,KAxBO,EAwBA,KAxBA,CAAA,CAAA,GAAA;EAAK,MAA1B,CAAA,EA0BN,iBA1BM,CA0BY,KA1BZ,EA0BmB,KA1BnB,CAAA;EAAa,KACzB,CAAA,EA0BK,kBA1BL,CA0BwB,KA1BxB,EA0B+B,KA1B/B,EA0BsC,MA1BtC,CAAA;EAAK,IAAC,CAAA,EA2BF,kBA3BE,CA2BiB,KA3BjB,EA2BwB,KA3BxB,EA2B+B,MA3B/B,CAAA;EAAK,OAAE,CAAA,EA4BN,MA5BM,CAAA,MAAA,EAAA,MAAA,CAAA;CAAM;AAGnB,KA4BQ,cAAA,GA5BR,GA4B4B,SA5B5B,CAAA,MAAA,CAAA,IAAA,MAAA,EAAA;AAGQ,KA6BA,aA7Be,CAAA,KAAA,CAAA,GAAA,YAAA,MA8BV,KA9BU,GAAA,aA+Bd,OA7BgB,CAAA,MA6BF,KA7BE,CA6BI,KA7BJ,CAAA,EA6BY,UA7BZ,CAAA,GAAA,GA6B6B,SA7B7B,CAAA,MAAA,GA8BjB,MA9BiB,CAAA,IAAA,MAAA,GA+Bb,KA/Ba,EAAA,EAAK,CAgC/B,OAhCY,CAAA,MAgCE,KAhCF,CAgCQ,KAhCR,CAAA,EAgCgB,UAhChB,CAAA,CAAA,EAAa,CAAA,MAiCpB,KAhCsB,CAAA;AAAO,KAmCzB,aAnCyB,CAAA,KAAA,CAAA,GAoCpC,aApCoC,CAoCtB,KApCsB,CAAA,SAAA,KAAA,EAAA,GAAA,CAoCI,CApCJ,SAAA,MAAA,GAoCuB,CApCvB,GAAA,KAAA,CAAA,GAAA,KAAA;AAArB,KAuCJ,sBAvCI,CAAA,KAAA,EAAA,eAAA,MAAA,CAAA,GA0CZ,aA1CY,CA0CE,KA1CF,CAAA,SAAA,KAAA,EAAA,GA2Cb,CA3Ca,SAAA,GA2CA,MA3CA,IAAA,MAAA,EAAA,GA4CZ,CA5CY,GAAA,KAAA,GAAA,KAAA;AACZ,KAgDQ,aAhDR,CAAA,KAAA,CAAA,GAgD+B,sBAhD/B,CAgDsD,KAhDtD,EAAA,KAAA,CAAA;AAAM,KAmDE,gBAnDF,CAAA,KAAA,CAAA,GAoDP,sBApDO,CAoDgB,KApDhB,EAAA,MAAA,CAAA,GAqDP,sBArDO,CAqDgB,KArDhB,EAAA,OAAA,CAAA,GAsDP,sBAtDO,CAsDgB,KAtDhB,EAAA,KAAA,CAAA,GAuDP,sBAvDO,CAuDgB,KAvDhB,EAAA,QAAA,CAAA;AAAO,KAyDL,aAzDK,CAAA,UAyDmB,cAzDnB,CAAA,GA0DhB,CA1DgB,SAAA,GAAA,KAAA,OAAA,IAAA,KAAA,MAAA,EAAA,GAAA;EAAM,MAGpB,EAwDW,SAxDX,CAwDqB,MAxDrB,CAAA;EAAC,KACD,EAuDqC,KAvDrC;CAAK,GAAA,KAAC;AAAO,KA0DJ,uBA1DI,CAAA,KAAA,EAAA,UA4DL,cA5DK,CAAA,GA6DZ,CA7DY,SAAA,GAAA,KAAA,OAAA,IAAA,KAAA,MAAA,EAAA,GA8Db,KA9Da,SA8DC,aA9DD,CA8De,KA9Df,CAAA,GA+DZ,SA/DY,CA+DF,MA/DE,CAAA,SA+Dc,aA/Dd,CA+D4B,KA/D5B,EA+DmC,KA/DnC,CAAA,GAgEX,eAhEW,CAgEK,KAhEL,EAgEY,KAhEZ,EAgEmB,SAhEnB,CAgE6B,MAhE7B,CAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA;AAGZ,KAkEQ,qBAlER,CAAA,KAAA,EAAA,UAoEO,cApEP,CAAA,GAqEA,CArEA,SAAA,GAAA,KAAA,OAAA,IAAA,KAAA,MAAA,EAAA,GAsED,KAtEC,SAsEa,aAtEb,CAsE2B,KAtE3B,CAAA,GAuEA,SAvEA,CAuEU,MAvEV,CAAA,SAuE0B,aAvE1B,CAuEwC,KAvExC,EAuE+C,KAvE/C,CAAA,GAwEC,aAxED,CAwEe,KAxEf,EAwEsB,KAxEtB,EAwE6B,SAxE7B,CAwEuC,MAxEvC,CAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA;AAAC;AAGL;;;;;AAGqC,KA6EzB,qBA7EyB,CAAA,KAAA,EAAA,UA+E1B,cA/E0B,CAAA,GAgFjC,CAhFiC,SAAA,GAAA,KAAA,OAAA,IAAA,KAAA,MAAA,EAAA,GAiFlC,KAjFkC,SAiFpB,aAjFoB,CAiFN,KAjFM,CAAA,GAkFjC,SAlFiC,CAkFvB,MAlFuB,CAAA,SAkFP,aAlFO,CAkFO,KAlFP,EAkFc,KAlFd,CAAA,GAmFhC,kBAnFgC,CAoFhC,iBApFgC,CAoFd,KApFc,EAoFP,KApFO,CAAA,EAqFhC,kBArFgC,CAqFb,KArFa,EAqFN,KArFM,EAqFC,SArFD,CAqFW,MArFX,CAAA,CAAA,EAsFhC,kBAtFgC,CAsFb,KAtFa,EAsFN,KAtFM,EAsFC,SAtFD,CAsFW,MAtFX,CAAA,CAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA;;;;;;KAiGhC,kBA9F8B,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,CAAA,GA8Fe,oBA9Ff,CAAA,CAAA,CAgGhC,OAhGgC,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA;EAAK,MAAE,EAgGG,OAhGH;CAAM,CAAA,GAAA,CAAA,CAkG5C,KAlGK,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA;EAAkB,IACA,EAiGe,KAjGf;CAAK,CAAA,GAAA,CAAA,CAmG5B,MAnG8B,CAAA,SAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA;EAAK,KAAE,CAAA,EAmGI,MAnGJ;CAAM,CAAA,GAAA;EAArB,OACf,CAAA,EAoGE,MApGF,CAAA,MAAA,EAAA,MAAA,CAAA;AAAM,CAAA,CAAA;AAGjB;AAIA;;KAoGK,oBAnGY,CAAA,CAAA,CAAA,GAAA,QACU,MAkGkB,CAlGlB,GAkGsB,CAlGtB,CAkGwB,CAlGxB,CAAA,EAAK;;;;AAA0B,KAuG9C,gBAvG8C,CAAA,KAAA,EAAA,UAyG/C,cAzG+C,CAAA,GA0GtD,CA1GsD,SAAA,GAAA,KAAA,OAAA,IAAA,KAAA,MAAA,EAAA,GA2GvD,KA3GuD,SA2GzC,aA3GyC,CA2G3B,KA3G2B,CAAA,GA4GtD,SA5GsD,CA4G5C,MA5G4C,CAAA,SA4G5B,aA5G4B,CA4Gd,KA5Gc,EA4GP,KA5GO,CAAA,GA6GrD,iBA7GqD,CA6GnC,KA7GmC,EA6G5B,KA7G4B,CAAA,SAAA,KAAA,GA8GpD,kBA9GoD,CA8GjC,KA9GiC,EA8G1B,KA9G0B,EA8GnB,SA9GmB,CA8GT,MA9GS,CAAA,CAAA,SAAA,KAAA,GAAA,KAAA,GAAA,IAAA,GAAA,IAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA;;;;;AAGvD,KAuHS,gBAvHT,CAAA,KAAA,CAAA,GAAA,CAAA,UAuH8C,aAvH9C,CAuH4D,KAvH5D,CAAA,CAAA,CAAA,QAAA,EAwHQ,CAxHR,EAAA,GAAA,IAAA,EAyHO,gBAzHP,CAyHwB,KAzHxB,EAyH+B,CAzH/B,CAAA,SAAA,IAAA,GAAA,CAAA,MAAA,EA0HU,qBA1HV,CA0HgC,KA1HhC,EA0HuC,CA1HvC,CAAA,CAAA,GAAA,CAAA,MAAA,GA2HW,qBA3HX,CA2HiC,KA3HjC,EA2HwC,CA3HxC,CAAA,CAAA,EAAA,GA4HE,OA5HF,CA4HU,uBA5HV,CA4HkC,KA5HlC,EA4HyC,CA5HzC,CAAA,CAAA;AACK,UA6HS,cAAA,CA7HT;EAAK,OAAA,CAAA,EAAA,MAAA;EAGD,OAAA,CAAA,EA4HD,MA5Hc,CAAA,MAAA,EAAA,MAAA,CAAA;EAAA,SAAA,CAAA,EAAA,CAAA,MAAA,EA6HH,WA7HG,EAAA,GA6Ha,WA7Hb,GA6H2B,OA7H3B,CA6HmC,WA7HnC,CAAA;EAAA,UACV,CAAA,EAAA,CAAA,QAAA,EA6HU,QA7HV,EAAA,GA6HuB,QA7HvB,GA6HkC,OA7HlC,CA6H0C,QA7H1C,CAAA;EAAK,OAAnB,CAAA,EAAA,CAAA,KAAA,EA8HkB,KA9HlB,EAAA,GAAA,IAAA,GA8HmC,OA9HnC,CAAA,IAAA,CAAA;EAAa,KAA2B,CAAA,EAAA,OA+HzB,KA/HyB;;AAAoB,KAkIjD,aAlIiD,CAAA,CAAA,EAAA,IAAA,OAAA,CAAA,GAAA;EAGjD,EAAA,EAAA,IAAA;EAAsB,IAAA,EAgIb,CAhIa;CAAA,GAAA;EAGX,EAAA,EAAnB,KAAA;EAAa,KACd,EA6HoB,CA7HpB;CAAC;AACA,KA8HQ,gBA9HR,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GA8HkD,CA9HlD,GA8HsD,OA9HtD,CA8H8D,CA9H9D,CAAA;AAAC,KAgIO,kBAhIP,CAAA,KAAA,EAAA,IAAA,OAAA,CAAA,GAAA,CAAA,UAiIM,aAjIN,CAiIoB,KAjIpB,CAAA,CAAA,CAAA,QAAA,EAmIM,CAnIN,EAAA,GAAA,IAAA,EAoIK,gBApIL,CAoIsB,KApItB,EAoI6B,CApI7B,CAAA,SAAA,IAAA,GAAA,CAAA,MAAA,EAqIQ,qBArIR,CAqI8B,KArI9B,EAqIqC,CArIrC,CAAA,CAAA,GAAA,CAAA,MAAA,GAsIS,qBAtIT,CAsI+B,KAtI/B,EAsIsC,CAtItC,CAAA,CAAA,EAAA,GAuIA,OAvIA,CAuIQ,aAvIR,CAuIsB,uBAvItB,CAuI8C,KAvI9C,EAuIqD,CAvIrD,CAAA,EAuIyD,CAvIzD,CAAA,CAAA"}
|
package/dist/types.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { EndpointString, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult } from "./types-
|
|
2
|
-
export { EndpointString, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
|
1
|
+
import { EndpointString, ErrorTransformer, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult } from "./types-DMQMHePI.cjs";
|
|
2
|
+
export { EndpointString, ErrorTransformer, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
package/dist/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { EndpointString, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult } from "./types-
|
|
2
|
-
export { EndpointString, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
|
1
|
+
import { EndpointString, ErrorTransformer, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult } from "./types-D8Jrl4o3.mjs";
|
|
2
|
+
export { EndpointString, ErrorTransformer, ExtractEndpointConfig, ExtractEndpointResponse, ExtractMethod, ExtractPathParams, ExtractQueryParams, ExtractRequestBody, ExtractResponse, FetcherOptions, FilterEndpointByMethod, FilteredRequestConfig, IsConfigRequired, MutationEndpoint, OpenAPIRoutes, ParseEndpoint, QueryEndpoint, RequestConfig, TypedApiFunction, TypedEndpoint, ValidEndpoint, WrappedApiFunction, WrappedResult };
|
package/package.json
CHANGED
|
@@ -383,7 +383,7 @@ describe('TypedFetcher', () => {
|
|
|
383
383
|
});
|
|
384
384
|
|
|
385
385
|
describe('wrap', () => {
|
|
386
|
-
it('should return
|
|
386
|
+
it('should return ok: true with data on success', async () => {
|
|
387
387
|
const client = createTypedFetcher<paths>({
|
|
388
388
|
baseURL: 'https://api.example.com',
|
|
389
389
|
});
|
|
@@ -391,16 +391,19 @@ describe('TypedFetcher', () => {
|
|
|
391
391
|
|
|
392
392
|
const result = await wrappedClient('GET /users');
|
|
393
393
|
|
|
394
|
-
expect(result.
|
|
395
|
-
expect(result
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
394
|
+
expect(result.ok).toBe(true);
|
|
395
|
+
expect('error' in result).toBe(false);
|
|
396
|
+
if (result.ok) {
|
|
397
|
+
expect(result.data).toEqual({
|
|
398
|
+
users: [
|
|
399
|
+
{ id: '1', name: 'John Doe', email: 'john@example.com' },
|
|
400
|
+
{ id: '2', name: 'Jane Smith', email: 'jane@example.com' },
|
|
401
|
+
],
|
|
402
|
+
});
|
|
403
|
+
}
|
|
401
404
|
});
|
|
402
405
|
|
|
403
|
-
it('should return
|
|
406
|
+
it('should return ok: false with error on failure', async () => {
|
|
404
407
|
const client = createTypedFetcher<paths>({
|
|
405
408
|
baseURL: 'https://api.example.com',
|
|
406
409
|
});
|
|
@@ -410,13 +413,16 @@ describe('TypedFetcher', () => {
|
|
|
410
413
|
params: { id: '404' },
|
|
411
414
|
});
|
|
412
415
|
|
|
413
|
-
expect(result.
|
|
414
|
-
expect(result
|
|
415
|
-
|
|
416
|
-
|
|
416
|
+
expect(result.ok).toBe(false);
|
|
417
|
+
expect('data' in result).toBe(false);
|
|
418
|
+
if (!result.ok) {
|
|
419
|
+
expect(result.error).toBeInstanceOf(Response);
|
|
420
|
+
const response = result.error as Response;
|
|
421
|
+
expect(response.status).toBe(404);
|
|
422
|
+
}
|
|
417
423
|
});
|
|
418
424
|
|
|
419
|
-
it('should return
|
|
425
|
+
it('should return ok: false on 500 errors', async () => {
|
|
420
426
|
const client = createTypedFetcher<paths>({
|
|
421
427
|
baseURL: 'https://api.example.com',
|
|
422
428
|
});
|
|
@@ -424,10 +430,13 @@ describe('TypedFetcher', () => {
|
|
|
424
430
|
|
|
425
431
|
const result = await wrappedClient('GET /error');
|
|
426
432
|
|
|
427
|
-
expect(result.
|
|
428
|
-
expect(result
|
|
429
|
-
|
|
430
|
-
|
|
433
|
+
expect(result.ok).toBe(false);
|
|
434
|
+
expect('data' in result).toBe(false);
|
|
435
|
+
if (!result.ok) {
|
|
436
|
+
expect(result.error).toBeInstanceOf(Response);
|
|
437
|
+
const response = result.error as Response;
|
|
438
|
+
expect(response.status).toBe(500);
|
|
439
|
+
}
|
|
431
440
|
});
|
|
432
441
|
|
|
433
442
|
it('should work with path params and body', async () => {
|
|
@@ -441,12 +450,15 @@ describe('TypedFetcher', () => {
|
|
|
441
450
|
body: { name: 'Updated Name' },
|
|
442
451
|
});
|
|
443
452
|
|
|
444
|
-
expect(result.
|
|
445
|
-
expect(result
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
453
|
+
expect(result.ok).toBe(true);
|
|
454
|
+
expect('error' in result).toBe(false);
|
|
455
|
+
if (result.ok) {
|
|
456
|
+
expect(result.data).toEqual({
|
|
457
|
+
id: '456',
|
|
458
|
+
name: 'Updated Name',
|
|
459
|
+
email: 'john@example.com',
|
|
460
|
+
});
|
|
461
|
+
}
|
|
450
462
|
});
|
|
451
463
|
|
|
452
464
|
it('should still call onError handler', async () => {
|
|
@@ -461,9 +473,68 @@ describe('TypedFetcher', () => {
|
|
|
461
473
|
params: { id: '404' },
|
|
462
474
|
});
|
|
463
475
|
|
|
464
|
-
expect(result.
|
|
476
|
+
expect(result.ok).toBe(false);
|
|
477
|
+
expect('data' in result).toBe(false);
|
|
465
478
|
expect(onError).toHaveBeenCalledWith(expect.any(Response));
|
|
466
479
|
});
|
|
480
|
+
|
|
481
|
+
it('should transform error with callback', async () => {
|
|
482
|
+
const client = createTypedFetcher<paths>({
|
|
483
|
+
baseURL: 'https://api.example.com',
|
|
484
|
+
});
|
|
485
|
+
const wrappedClient = client.wrap(async (error) => {
|
|
486
|
+
const response = error as Response;
|
|
487
|
+
const body = await response.json();
|
|
488
|
+
return { status: response.status, message: body.message };
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
const result = await wrappedClient('GET /users/{id}', {
|
|
492
|
+
params: { id: '404' },
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
expect(result.ok).toBe(false);
|
|
496
|
+
if (!result.ok) {
|
|
497
|
+
expect(result.error).toEqual({
|
|
498
|
+
status: 404,
|
|
499
|
+
message: 'User not found',
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
it('should infer error type from transformer', async () => {
|
|
505
|
+
const client = createTypedFetcher<paths>({
|
|
506
|
+
baseURL: 'https://api.example.com',
|
|
507
|
+
});
|
|
508
|
+
const wrappedClient = client.wrap(async (error) => {
|
|
509
|
+
const response = error as Response;
|
|
510
|
+
return { status: response.status, message: 'something went wrong' };
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
const result = await wrappedClient('GET /error');
|
|
514
|
+
|
|
515
|
+
expect(result.ok).toBe(false);
|
|
516
|
+
if (!result.ok) {
|
|
517
|
+
expect(result.error.status).toBe(500);
|
|
518
|
+
expect(result.error.message).toBe('something went wrong');
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
it('should preserve extra properties on wrapped function', async () => {
|
|
523
|
+
const client = createTypedFetcher<paths>({
|
|
524
|
+
baseURL: 'https://api.example.com',
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
// Simulate attaching hooks (like useQuery/useMutation)
|
|
528
|
+
const mockUseQuery = vi.fn();
|
|
529
|
+
const mockUseMutation = vi.fn();
|
|
530
|
+
(client as any).useQuery = mockUseQuery;
|
|
531
|
+
(client as any).useMutation = mockUseMutation;
|
|
532
|
+
|
|
533
|
+
const wrappedClient = client.wrap();
|
|
534
|
+
|
|
535
|
+
expect((wrappedClient as any).useQuery).toBe(mockUseQuery);
|
|
536
|
+
expect((wrappedClient as any).useMutation).toBe(mockUseMutation);
|
|
537
|
+
});
|
|
467
538
|
});
|
|
468
539
|
|
|
469
540
|
it('should URL encode special characters in path parameters', async () => {
|
package/src/endpoint-hooks.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
QueryClient,
|
|
3
|
+
QueryFunctionContext,
|
|
4
|
+
UseInfiniteQueryOptions,
|
|
5
|
+
UseInfiniteQueryResult,
|
|
3
6
|
UseMutationOptions,
|
|
4
7
|
UseMutationResult,
|
|
5
8
|
UseQueryOptions,
|
|
6
9
|
UseQueryResult,
|
|
7
10
|
} from '@tanstack/react-query';
|
|
8
|
-
import { useMutation, useQuery } from '@tanstack/react-query';
|
|
11
|
+
import { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query';
|
|
9
12
|
import { useMemo } from 'react';
|
|
10
13
|
import type {
|
|
11
14
|
ExtractEndpointResponse,
|
|
@@ -98,6 +101,52 @@ export interface EndpointHooks<Paths> {
|
|
|
98
101
|
FilteredRequestConfig<Paths, T>
|
|
99
102
|
>;
|
|
100
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Use infinite query hook for paginated GET endpoints.
|
|
106
|
+
*/
|
|
107
|
+
useInfiniteQuery: <
|
|
108
|
+
T extends QueryEndpoint<Paths>,
|
|
109
|
+
TPageData = ExtractEndpointResponse<Paths, T>,
|
|
110
|
+
TPageParam = unknown,
|
|
111
|
+
>(
|
|
112
|
+
endpoint: T,
|
|
113
|
+
options: Omit<
|
|
114
|
+
UseInfiniteQueryOptions<
|
|
115
|
+
TPageData,
|
|
116
|
+
Error,
|
|
117
|
+
{ pages: TPageData[]; pageParams: TPageParam[] },
|
|
118
|
+
unknown[],
|
|
119
|
+
TPageParam
|
|
120
|
+
>,
|
|
121
|
+
'queryKey' | 'queryFn' | 'getNextPageParam' | 'initialPageParam'
|
|
122
|
+
> & {
|
|
123
|
+
getNextPageParam: (
|
|
124
|
+
lastPage: TPageData,
|
|
125
|
+
allPages: TPageData[],
|
|
126
|
+
lastPageParam: TPageParam,
|
|
127
|
+
allPageParams: TPageParam[],
|
|
128
|
+
) => TPageParam | undefined;
|
|
129
|
+
initialPageParam: TPageParam;
|
|
130
|
+
},
|
|
131
|
+
config?: FilteredRequestConfig<Paths, T>,
|
|
132
|
+
) => UseInfiniteQueryResult<
|
|
133
|
+
{ pages: TPageData[]; pageParams: TPageParam[] },
|
|
134
|
+
Error
|
|
135
|
+
>;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Invalidate queries for a specific endpoint.
|
|
139
|
+
*/
|
|
140
|
+
invalidateQueries: <T extends QueryEndpoint<Paths>>(
|
|
141
|
+
endpoint: T,
|
|
142
|
+
config?: FilteredRequestConfig<Paths, T>,
|
|
143
|
+
) => Promise<void>;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Invalidate all queries in the cache.
|
|
147
|
+
*/
|
|
148
|
+
invalidateAllQueries: () => Promise<void>;
|
|
149
|
+
|
|
101
150
|
/**
|
|
102
151
|
* Build a query key for manual cache operations
|
|
103
152
|
*/
|
|
@@ -124,7 +173,7 @@ export interface EndpointHooks<Paths> {
|
|
|
124
173
|
*/
|
|
125
174
|
export function createEndpointHooks<Paths>(
|
|
126
175
|
fetcher: TypedApiFunction<Paths>,
|
|
127
|
-
|
|
176
|
+
options: CreateEndpointHooksOptions = {},
|
|
128
177
|
): EndpointHooks<Paths> {
|
|
129
178
|
return {
|
|
130
179
|
useQuery: <T extends QueryEndpoint<Paths>>(
|
|
@@ -199,6 +248,99 @@ export function createEndpointHooks<Paths>(
|
|
|
199
248
|
>(memoizedOptions);
|
|
200
249
|
},
|
|
201
250
|
|
|
251
|
+
useInfiniteQuery: <
|
|
252
|
+
T extends QueryEndpoint<Paths>,
|
|
253
|
+
TPageData = ExtractEndpointResponse<Paths, T>,
|
|
254
|
+
TPageParam = unknown,
|
|
255
|
+
>(
|
|
256
|
+
endpoint: T,
|
|
257
|
+
options: Omit<
|
|
258
|
+
UseInfiniteQueryOptions<
|
|
259
|
+
TPageData,
|
|
260
|
+
Error,
|
|
261
|
+
{ pages: TPageData[]; pageParams: TPageParam[] },
|
|
262
|
+
unknown[],
|
|
263
|
+
TPageParam
|
|
264
|
+
>,
|
|
265
|
+
'queryKey' | 'queryFn' | 'getNextPageParam' | 'initialPageParam'
|
|
266
|
+
> & {
|
|
267
|
+
getNextPageParam: (
|
|
268
|
+
lastPage: TPageData,
|
|
269
|
+
allPages: TPageData[],
|
|
270
|
+
lastPageParam: TPageParam,
|
|
271
|
+
allPageParams: TPageParam[],
|
|
272
|
+
) => TPageParam | undefined;
|
|
273
|
+
initialPageParam: TPageParam;
|
|
274
|
+
},
|
|
275
|
+
config?: FilteredRequestConfig<Paths, T>,
|
|
276
|
+
) => {
|
|
277
|
+
const queryKey = buildQueryKey(endpoint, config);
|
|
278
|
+
|
|
279
|
+
const memoizedOptions = useMemo(
|
|
280
|
+
() => ({
|
|
281
|
+
queryKey,
|
|
282
|
+
queryFn: ({
|
|
283
|
+
pageParam,
|
|
284
|
+
}: QueryFunctionContext<unknown[], TPageParam>) => {
|
|
285
|
+
let mergedConfig = config;
|
|
286
|
+
if (pageParam !== undefined && config) {
|
|
287
|
+
const pageQuery =
|
|
288
|
+
typeof pageParam === 'object' ? pageParam : { page: pageParam };
|
|
289
|
+
mergedConfig = {
|
|
290
|
+
...config,
|
|
291
|
+
query: { ...(config as any).query, ...pageQuery },
|
|
292
|
+
} as any;
|
|
293
|
+
} else if (pageParam !== undefined && !config) {
|
|
294
|
+
const pageQuery =
|
|
295
|
+
typeof pageParam === 'object' ? pageParam : { page: pageParam };
|
|
296
|
+
mergedConfig = { query: pageQuery } as any;
|
|
297
|
+
}
|
|
298
|
+
return (
|
|
299
|
+
fetcher as (
|
|
300
|
+
endpoint: T,
|
|
301
|
+
config?: unknown,
|
|
302
|
+
) => Promise<ExtractEndpointResponse<Paths, T>>
|
|
303
|
+
)(endpoint, mergedConfig) as Promise<TPageData>;
|
|
304
|
+
},
|
|
305
|
+
...options,
|
|
306
|
+
}),
|
|
307
|
+
[endpoint, config, fetcher, queryKey, options],
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
return useInfiniteQuery<
|
|
311
|
+
TPageData,
|
|
312
|
+
Error,
|
|
313
|
+
{ pages: TPageData[]; pageParams: TPageParam[] },
|
|
314
|
+
unknown[],
|
|
315
|
+
TPageParam
|
|
316
|
+
>(memoizedOptions);
|
|
317
|
+
},
|
|
318
|
+
|
|
319
|
+
invalidateQueries: <T extends QueryEndpoint<Paths>>(
|
|
320
|
+
endpoint: T,
|
|
321
|
+
config?: FilteredRequestConfig<Paths, T>,
|
|
322
|
+
) => {
|
|
323
|
+
if (!options.queryClient) {
|
|
324
|
+
throw new Error(
|
|
325
|
+
'queryClient is required for invalidateQueries. Pass it to createEndpointHooks options.',
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
const queryKey = buildQueryKey(endpoint, config);
|
|
329
|
+
return options.queryClient.invalidateQueries({
|
|
330
|
+
queryKey,
|
|
331
|
+
exact: !!config,
|
|
332
|
+
});
|
|
333
|
+
},
|
|
334
|
+
|
|
335
|
+
invalidateAllQueries: () => {
|
|
336
|
+
if (!options.queryClient) {
|
|
337
|
+
throw new Error(
|
|
338
|
+
'queryClient is required for invalidateAllQueries. Pass it to createEndpointHooks options.',
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
return options.queryClient.invalidateQueries();
|
|
342
|
+
},
|
|
343
|
+
|
|
202
344
|
buildQueryKey,
|
|
203
345
|
};
|
|
204
346
|
}
|
package/src/fetcher.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import qs from 'qs';
|
|
2
2
|
import type {
|
|
3
3
|
EndpointString,
|
|
4
|
+
ErrorTransformer,
|
|
4
5
|
ExtractEndpointResponse,
|
|
5
6
|
FetcherOptions,
|
|
6
7
|
FilteredRequestConfig,
|
|
@@ -129,14 +130,17 @@ export class TypedFetcher<Paths> {
|
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
132
|
|
|
132
|
-
wrap() {
|
|
133
|
+
wrap<E = unknown>(onError?: ErrorTransformer<E>) {
|
|
133
134
|
return <T extends TypedEndpoint<Paths>>(
|
|
134
135
|
endpoint: T,
|
|
135
136
|
config?: FilteredRequestConfig<Paths, T>,
|
|
136
|
-
): Promise<WrappedResult<ExtractEndpointResponse<Paths, T
|
|
137
|
+
): Promise<WrappedResult<ExtractEndpointResponse<Paths, T>, E>> =>
|
|
137
138
|
this.request(endpoint, config).then(
|
|
138
|
-
(data) => ({
|
|
139
|
-
(error) => ({
|
|
139
|
+
(data) => ({ ok: true as const, data }),
|
|
140
|
+
async (error) => ({
|
|
141
|
+
ok: false as const,
|
|
142
|
+
error: onError ? await onError(error) : (error as E),
|
|
143
|
+
}),
|
|
140
144
|
);
|
|
141
145
|
}
|
|
142
146
|
|
|
@@ -156,9 +160,12 @@ export function createTypedFetcher<Paths>(options?: FetcherOptions) {
|
|
|
156
160
|
config?: FilteredRequestConfig<Paths, T>,
|
|
157
161
|
) => fetcher.request(endpoint, config);
|
|
158
162
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
163
|
+
return Object.assign(fn, {
|
|
164
|
+
wrap: <E = unknown>(onError?: ErrorTransformer<E>) =>
|
|
165
|
+
Object.assign(fetcher.wrap(onError), fn, {
|
|
166
|
+
wrap: undefined,
|
|
167
|
+
}),
|
|
168
|
+
});
|
|
162
169
|
}
|
|
163
170
|
|
|
164
171
|
export type FetchFn = typeof fetch;
|
package/src/types.ts
CHANGED
|
@@ -210,13 +210,17 @@ export interface FetcherOptions {
|
|
|
210
210
|
fetch?: typeof fetch;
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
export type WrappedResult<T> =
|
|
214
|
-
| {
|
|
215
|
-
| {
|
|
213
|
+
export type WrappedResult<T, E = unknown> =
|
|
214
|
+
| { ok: true; data: T }
|
|
215
|
+
| { ok: false; error: E };
|
|
216
216
|
|
|
217
|
-
export type
|
|
217
|
+
export type ErrorTransformer<E> = (error: unknown) => E | Promise<E>;
|
|
218
|
+
|
|
219
|
+
export type WrappedApiFunction<Paths, E = unknown> = <
|
|
220
|
+
T extends TypedEndpoint<Paths>,
|
|
221
|
+
>(
|
|
218
222
|
endpoint: T,
|
|
219
223
|
...args: IsConfigRequired<Paths, T> extends true
|
|
220
224
|
? [config: FilteredRequestConfig<Paths, T>]
|
|
221
225
|
: [config?: FilteredRequestConfig<Paths, T>]
|
|
222
|
-
) => Promise<WrappedResult<ExtractEndpointResponse<Paths, T
|
|
226
|
+
) => Promise<WrappedResult<ExtractEndpointResponse<Paths, T>, E>>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher-CbQRQD5f.cjs","names":["fn?: FetchFn","options: FetcherOptions","endpoint: T","config?: FilteredRequestConfig<Paths, T>","requestConfig: RequestInit","options?: FetcherOptions"],"sources":["../src/fetcher.ts"],"sourcesContent":["import qs from 'qs';\nimport type {\n\tEndpointString,\n\tExtractEndpointResponse,\n\tFetcherOptions,\n\tFilteredRequestConfig,\n\tParseEndpoint,\n\tTypedEndpoint,\n\tWrappedResult,\n} from './types';\n\nexport type { FetcherOptions, WrappedResult } from './types';\n\nexport class TypedFetcher<Paths> {\n\tprivate baseURL: string;\n\tprivate defaultHeaders: Record<string, string>;\n\tprivate options: FetcherOptions;\n\tprivate fetchFn: FetchFn;\n\n\tstatic getFetchFn(fn?: FetchFn): FetchFn {\n\t\tif (fn) {\n\t\t\treturn fn;\n\t\t}\n\n\t\tif (typeof window !== 'undefined' && typeof window.fetch === 'function') {\n\t\t\treturn window.fetch.bind(window);\n\t\t}\n\n\t\tif (\n\t\t\ttypeof globalThis !== 'undefined' &&\n\t\t\ttypeof globalThis.fetch === 'function'\n\t\t) {\n\t\t\treturn globalThis.fetch.bind(globalThis);\n\t\t}\n\n\t\tthrow new Error('No fetch implementation found');\n\t}\n\n\tconstructor(options: FetcherOptions = {}) {\n\t\tthis.baseURL = options.baseURL || '';\n\t\tthis.defaultHeaders = options.headers || {};\n\t\tthis.options = options;\n\t\tthis.fetchFn = TypedFetcher.getFetchFn(options.fetch);\n\t}\n\n\tasync request<T extends TypedEndpoint<Paths>>(\n\t\tendpoint: T,\n\t\tconfig?: FilteredRequestConfig<Paths, T>,\n\t): Promise<ExtractEndpointResponse<Paths, T>> {\n\t\tconst { method, route } = this.parseEndpoint(endpoint);\n\n\t\t// Replace path parameters\n\t\tlet url = route;\n\t\tif (config && 'params' in config && config.params) {\n\t\t\tObject.entries(config.params as Record<string, unknown>).forEach(\n\t\t\t\t([key, value]) => {\n\t\t\t\t\turl = url.replace(`{${key}}`, encodeURIComponent(String(value)));\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// Add query parameters\n\t\tif (config && 'query' in config && config.query) {\n\t\t\tconst queryString = qs.stringify(config.query, {\n\t\t\t\tencode: true,\n\t\t\t\tarrayFormat: 'brackets',\n\t\t\t\tskipNulls: true,\n\t\t\t});\n\t\t\tif (queryString) {\n\t\t\t\turl += `?${queryString}`;\n\t\t\t}\n\t\t}\n\n\t\t// Build request configuration\n\t\tlet requestConfig: RequestInit = {\n\t\t\tmethod: method.toUpperCase(),\n\t\t\theaders: {\n\t\t\t\t...this.defaultHeaders,\n\t\t\t\t...((config && 'headers' in config && config.headers) || {}),\n\t\t\t},\n\t\t};\n\n\t\t// Add body if present\n\t\tif (config && 'body' in config && config.body) {\n\t\t\trequestConfig.body = JSON.stringify(config.body);\n\t\t\trequestConfig.headers = {\n\t\t\t\t...requestConfig.headers,\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t};\n\t\t}\n\n\t\t// Apply request interceptor\n\t\tif (this.options.onRequest) {\n\t\t\trequestConfig = await this.options.onRequest(requestConfig);\n\t\t}\n\n\t\ttry {\n\t\t\t// Make the request\n\t\t\tlet response = await this.fetchFn(`${this.baseURL}${url}`, requestConfig);\n\n\t\t\t// Apply response interceptor\n\t\t\tif (this.options.onResponse) {\n\t\t\t\tresponse = await this.options.onResponse(response);\n\t\t\t}\n\n\t\t\t// Handle errors\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow response;\n\t\t\t}\n\n\t\t\t// Handle empty responses (204 No Content, etc.)\n\t\t\tif (\n\t\t\t\tresponse.status === 204 ||\n\t\t\t\tresponse.headers.get('content-length') === '0'\n\t\t\t) {\n\t\t\t\treturn undefined as ExtractEndpointResponse<Paths, T>;\n\t\t\t}\n\n\t\t\t// Parse JSON response\n\t\t\tconst data = await response.json();\n\t\t\treturn data as ExtractEndpointResponse<Paths, T>;\n\t\t} catch (error) {\n\t\t\t// Apply error handler\n\t\t\tif (this.options.onError) {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tawait this.options.onError(error);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\twrap() {\n\t\treturn <T extends TypedEndpoint<Paths>>(\n\t\t\tendpoint: T,\n\t\t\tconfig?: FilteredRequestConfig<Paths, T>,\n\t\t): Promise<WrappedResult<ExtractEndpointResponse<Paths, T>>> =>\n\t\t\tthis.request(endpoint, config).then(\n\t\t\t\t(data) => ({ data, error: null }),\n\t\t\t\t(error) => ({ data: null, error }),\n\t\t\t);\n\t}\n\n\tprivate parseEndpoint<T extends EndpointString>(\n\t\tendpoint: T,\n\t): ParseEndpoint<T> {\n\t\tconst [method, ...routeParts] = endpoint.split(' ');\n\t\tconst route = routeParts.join(' ');\n\t\treturn { method: method?.toLowerCase() ?? '', route } as ParseEndpoint<T>;\n\t}\n}\n\nexport function createTypedFetcher<Paths>(options?: FetcherOptions) {\n\tconst fetcher = new TypedFetcher<Paths>(options);\n\tconst fn = <T extends TypedEndpoint<Paths>>(\n\t\tendpoint: T,\n\t\tconfig?: FilteredRequestConfig<Paths, T>,\n\t) => fetcher.request(endpoint, config);\n\n\tfn.wrap = () => fetcher.wrap();\n\n\treturn fn;\n}\n\nexport type FetchFn = typeof fetch;\n"],"mappings":";;;;AAaA,IAAa,eAAb,MAAa,aAAoB;CAChC,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,OAAO,WAAWA,IAAuB;AACxC,MAAI,GACH,QAAO;AAGR,aAAW,WAAW,sBAAsB,OAAO,UAAU,WAC5D,QAAO,OAAO,MAAM,KAAK,OAAO;AAGjC,aACQ,eAAe,sBACf,WAAW,UAAU,WAE5B,QAAO,WAAW,MAAM,KAAK,WAAW;AAGzC,QAAM,IAAI,MAAM;CAChB;CAED,YAAYC,UAA0B,CAAE,GAAE;AACzC,OAAK,UAAU,QAAQ,WAAW;AAClC,OAAK,iBAAiB,QAAQ,WAAW,CAAE;AAC3C,OAAK,UAAU;AACf,OAAK,UAAU,aAAa,WAAW,QAAQ,MAAM;CACrD;CAED,MAAM,QACLC,UACAC,QAC6C;EAC7C,MAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,cAAc,SAAS;EAGtD,IAAI,MAAM;AACV,MAAI,UAAU,YAAY,UAAU,OAAO,OAC1C,QAAO,QAAQ,OAAO,OAAkC,CAAC,QACxD,CAAC,CAAC,KAAK,MAAM,KAAK;AACjB,SAAM,IAAI,SAAS,GAAG,IAAI,IAAI,mBAAmB,OAAO,MAAM,CAAC,CAAC;EAChE,EACD;AAIF,MAAI,UAAU,WAAW,UAAU,OAAO,OAAO;GAChD,MAAM,cAAc,WAAG,UAAU,OAAO,OAAO;IAC9C,QAAQ;IACR,aAAa;IACb,WAAW;GACX,EAAC;AACF,OAAI,YACH,SAAQ,GAAG,YAAY;EAExB;EAGD,IAAIC,gBAA6B;GAChC,QAAQ,OAAO,aAAa;GAC5B,SAAS;IACR,GAAG,KAAK;IACR,GAAK,UAAU,aAAa,UAAU,OAAO,WAAY,CAAE;GAC3D;EACD;AAGD,MAAI,UAAU,UAAU,UAAU,OAAO,MAAM;AAC9C,iBAAc,OAAO,KAAK,UAAU,OAAO,KAAK;AAChD,iBAAc,UAAU;IACvB,GAAG,cAAc;IACjB,gBAAgB;GAChB;EACD;AAGD,MAAI,KAAK,QAAQ,UAChB,iBAAgB,MAAM,KAAK,QAAQ,UAAU,cAAc;AAG5D,MAAI;GAEH,IAAI,WAAW,MAAM,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,IAAI,GAAG,cAAc;AAGzE,OAAI,KAAK,QAAQ,WAChB,YAAW,MAAM,KAAK,QAAQ,WAAW,SAAS;AAInD,QAAK,SAAS,GACb,OAAM;AAIP,OACC,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,iBAAiB,KAAK,IAE3C;GAID,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,UAAO;EACP,SAAQ,OAAO;AAEf,OAAI,KAAK,QAAQ,QAEhB,OAAM,KAAK,QAAQ,QAAQ,MAAM;AAElC,SAAM;EACN;CACD;CAED,OAAO;AACN,SAAO,CACNF,UACAC,WAEA,KAAK,QAAQ,UAAU,OAAO,CAAC,KAC9B,CAAC,UAAU;GAAE;GAAM,OAAO;EAAM,IAChC,CAAC,WAAW;GAAE,MAAM;GAAM;EAAO,GACjC;CACF;CAED,AAAQ,cACPD,UACmB;EACnB,MAAM,CAAC,QAAQ,GAAG,WAAW,GAAG,SAAS,MAAM,IAAI;EACnD,MAAM,QAAQ,WAAW,KAAK,IAAI;AAClC,SAAO;GAAE,QAAQ,QAAQ,aAAa,IAAI;GAAI;EAAO;CACrD;AACD;AAED,SAAgB,mBAA0BG,SAA0B;CACnE,MAAM,UAAU,IAAI,aAAoB;CACxC,MAAM,KAAK,CACVH,UACAC,WACI,QAAQ,QAAQ,UAAU,OAAO;AAEtC,IAAG,OAAO,MAAM,QAAQ,MAAM;AAE9B,QAAO;AACP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher-DNt7DDn9.mjs","names":["fn?: FetchFn","options: FetcherOptions","endpoint: T","config?: FilteredRequestConfig<Paths, T>","requestConfig: RequestInit","options?: FetcherOptions"],"sources":["../src/fetcher.ts"],"sourcesContent":["import qs from 'qs';\nimport type {\n\tEndpointString,\n\tExtractEndpointResponse,\n\tFetcherOptions,\n\tFilteredRequestConfig,\n\tParseEndpoint,\n\tTypedEndpoint,\n\tWrappedResult,\n} from './types';\n\nexport type { FetcherOptions, WrappedResult } from './types';\n\nexport class TypedFetcher<Paths> {\n\tprivate baseURL: string;\n\tprivate defaultHeaders: Record<string, string>;\n\tprivate options: FetcherOptions;\n\tprivate fetchFn: FetchFn;\n\n\tstatic getFetchFn(fn?: FetchFn): FetchFn {\n\t\tif (fn) {\n\t\t\treturn fn;\n\t\t}\n\n\t\tif (typeof window !== 'undefined' && typeof window.fetch === 'function') {\n\t\t\treturn window.fetch.bind(window);\n\t\t}\n\n\t\tif (\n\t\t\ttypeof globalThis !== 'undefined' &&\n\t\t\ttypeof globalThis.fetch === 'function'\n\t\t) {\n\t\t\treturn globalThis.fetch.bind(globalThis);\n\t\t}\n\n\t\tthrow new Error('No fetch implementation found');\n\t}\n\n\tconstructor(options: FetcherOptions = {}) {\n\t\tthis.baseURL = options.baseURL || '';\n\t\tthis.defaultHeaders = options.headers || {};\n\t\tthis.options = options;\n\t\tthis.fetchFn = TypedFetcher.getFetchFn(options.fetch);\n\t}\n\n\tasync request<T extends TypedEndpoint<Paths>>(\n\t\tendpoint: T,\n\t\tconfig?: FilteredRequestConfig<Paths, T>,\n\t): Promise<ExtractEndpointResponse<Paths, T>> {\n\t\tconst { method, route } = this.parseEndpoint(endpoint);\n\n\t\t// Replace path parameters\n\t\tlet url = route;\n\t\tif (config && 'params' in config && config.params) {\n\t\t\tObject.entries(config.params as Record<string, unknown>).forEach(\n\t\t\t\t([key, value]) => {\n\t\t\t\t\turl = url.replace(`{${key}}`, encodeURIComponent(String(value)));\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// Add query parameters\n\t\tif (config && 'query' in config && config.query) {\n\t\t\tconst queryString = qs.stringify(config.query, {\n\t\t\t\tencode: true,\n\t\t\t\tarrayFormat: 'brackets',\n\t\t\t\tskipNulls: true,\n\t\t\t});\n\t\t\tif (queryString) {\n\t\t\t\turl += `?${queryString}`;\n\t\t\t}\n\t\t}\n\n\t\t// Build request configuration\n\t\tlet requestConfig: RequestInit = {\n\t\t\tmethod: method.toUpperCase(),\n\t\t\theaders: {\n\t\t\t\t...this.defaultHeaders,\n\t\t\t\t...((config && 'headers' in config && config.headers) || {}),\n\t\t\t},\n\t\t};\n\n\t\t// Add body if present\n\t\tif (config && 'body' in config && config.body) {\n\t\t\trequestConfig.body = JSON.stringify(config.body);\n\t\t\trequestConfig.headers = {\n\t\t\t\t...requestConfig.headers,\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t};\n\t\t}\n\n\t\t// Apply request interceptor\n\t\tif (this.options.onRequest) {\n\t\t\trequestConfig = await this.options.onRequest(requestConfig);\n\t\t}\n\n\t\ttry {\n\t\t\t// Make the request\n\t\t\tlet response = await this.fetchFn(`${this.baseURL}${url}`, requestConfig);\n\n\t\t\t// Apply response interceptor\n\t\t\tif (this.options.onResponse) {\n\t\t\t\tresponse = await this.options.onResponse(response);\n\t\t\t}\n\n\t\t\t// Handle errors\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow response;\n\t\t\t}\n\n\t\t\t// Handle empty responses (204 No Content, etc.)\n\t\t\tif (\n\t\t\t\tresponse.status === 204 ||\n\t\t\t\tresponse.headers.get('content-length') === '0'\n\t\t\t) {\n\t\t\t\treturn undefined as ExtractEndpointResponse<Paths, T>;\n\t\t\t}\n\n\t\t\t// Parse JSON response\n\t\t\tconst data = await response.json();\n\t\t\treturn data as ExtractEndpointResponse<Paths, T>;\n\t\t} catch (error) {\n\t\t\t// Apply error handler\n\t\t\tif (this.options.onError) {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tawait this.options.onError(error);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\twrap() {\n\t\treturn <T extends TypedEndpoint<Paths>>(\n\t\t\tendpoint: T,\n\t\t\tconfig?: FilteredRequestConfig<Paths, T>,\n\t\t): Promise<WrappedResult<ExtractEndpointResponse<Paths, T>>> =>\n\t\t\tthis.request(endpoint, config).then(\n\t\t\t\t(data) => ({ data, error: null }),\n\t\t\t\t(error) => ({ data: null, error }),\n\t\t\t);\n\t}\n\n\tprivate parseEndpoint<T extends EndpointString>(\n\t\tendpoint: T,\n\t): ParseEndpoint<T> {\n\t\tconst [method, ...routeParts] = endpoint.split(' ');\n\t\tconst route = routeParts.join(' ');\n\t\treturn { method: method?.toLowerCase() ?? '', route } as ParseEndpoint<T>;\n\t}\n}\n\nexport function createTypedFetcher<Paths>(options?: FetcherOptions) {\n\tconst fetcher = new TypedFetcher<Paths>(options);\n\tconst fn = <T extends TypedEndpoint<Paths>>(\n\t\tendpoint: T,\n\t\tconfig?: FilteredRequestConfig<Paths, T>,\n\t) => fetcher.request(endpoint, config);\n\n\tfn.wrap = () => fetcher.wrap();\n\n\treturn fn;\n}\n\nexport type FetchFn = typeof fetch;\n"],"mappings":";;;AAaA,IAAa,eAAb,MAAa,aAAoB;CAChC,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,OAAO,WAAWA,IAAuB;AACxC,MAAI,GACH,QAAO;AAGR,aAAW,WAAW,sBAAsB,OAAO,UAAU,WAC5D,QAAO,OAAO,MAAM,KAAK,OAAO;AAGjC,aACQ,eAAe,sBACf,WAAW,UAAU,WAE5B,QAAO,WAAW,MAAM,KAAK,WAAW;AAGzC,QAAM,IAAI,MAAM;CAChB;CAED,YAAYC,UAA0B,CAAE,GAAE;AACzC,OAAK,UAAU,QAAQ,WAAW;AAClC,OAAK,iBAAiB,QAAQ,WAAW,CAAE;AAC3C,OAAK,UAAU;AACf,OAAK,UAAU,aAAa,WAAW,QAAQ,MAAM;CACrD;CAED,MAAM,QACLC,UACAC,QAC6C;EAC7C,MAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,cAAc,SAAS;EAGtD,IAAI,MAAM;AACV,MAAI,UAAU,YAAY,UAAU,OAAO,OAC1C,QAAO,QAAQ,OAAO,OAAkC,CAAC,QACxD,CAAC,CAAC,KAAK,MAAM,KAAK;AACjB,SAAM,IAAI,SAAS,GAAG,IAAI,IAAI,mBAAmB,OAAO,MAAM,CAAC,CAAC;EAChE,EACD;AAIF,MAAI,UAAU,WAAW,UAAU,OAAO,OAAO;GAChD,MAAM,cAAc,GAAG,UAAU,OAAO,OAAO;IAC9C,QAAQ;IACR,aAAa;IACb,WAAW;GACX,EAAC;AACF,OAAI,YACH,SAAQ,GAAG,YAAY;EAExB;EAGD,IAAIC,gBAA6B;GAChC,QAAQ,OAAO,aAAa;GAC5B,SAAS;IACR,GAAG,KAAK;IACR,GAAK,UAAU,aAAa,UAAU,OAAO,WAAY,CAAE;GAC3D;EACD;AAGD,MAAI,UAAU,UAAU,UAAU,OAAO,MAAM;AAC9C,iBAAc,OAAO,KAAK,UAAU,OAAO,KAAK;AAChD,iBAAc,UAAU;IACvB,GAAG,cAAc;IACjB,gBAAgB;GAChB;EACD;AAGD,MAAI,KAAK,QAAQ,UAChB,iBAAgB,MAAM,KAAK,QAAQ,UAAU,cAAc;AAG5D,MAAI;GAEH,IAAI,WAAW,MAAM,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,IAAI,GAAG,cAAc;AAGzE,OAAI,KAAK,QAAQ,WAChB,YAAW,MAAM,KAAK,QAAQ,WAAW,SAAS;AAInD,QAAK,SAAS,GACb,OAAM;AAIP,OACC,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,iBAAiB,KAAK,IAE3C;GAID,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,UAAO;EACP,SAAQ,OAAO;AAEf,OAAI,KAAK,QAAQ,QAEhB,OAAM,KAAK,QAAQ,QAAQ,MAAM;AAElC,SAAM;EACN;CACD;CAED,OAAO;AACN,SAAO,CACNF,UACAC,WAEA,KAAK,QAAQ,UAAU,OAAO,CAAC,KAC9B,CAAC,UAAU;GAAE;GAAM,OAAO;EAAM,IAChC,CAAC,WAAW;GAAE,MAAM;GAAM;EAAO,GACjC;CACF;CAED,AAAQ,cACPD,UACmB;EACnB,MAAM,CAAC,QAAQ,GAAG,WAAW,GAAG,SAAS,MAAM,IAAI;EACnD,MAAM,QAAQ,WAAW,KAAK,IAAI;AAClC,SAAO;GAAE,QAAQ,QAAQ,aAAa,IAAI;GAAI;EAAO;CACrD;AACD;AAED,SAAgB,mBAA0BG,SAA0B;CACnE,MAAM,UAAU,IAAI,aAAoB;CACxC,MAAM,KAAK,CACVH,UACAC,WACI,QAAQ,QAAQ,UAAU,OAAO;AAEtC,IAAG,OAAO,MAAM,QAAQ,MAAM;AAE9B,QAAO;AACP"}
|