mobx-tanstack-query-api 0.26.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs CHANGED
@@ -389,6 +389,176 @@ class EndpointMutation extends mobxTanstackQuery.Mutation {
389
389
  this.endpoint = endpoint;
390
390
  }
391
391
  }
392
+ const isHttpResponse = (response, status) => !!response && typeof response === "object" && response instanceof Response && "data" in response && (!status || response.status === status);
393
+ const isHttpBadResponse = (response) => {
394
+ return isHttpResponse(response) && (!response.ok || !!response.error);
395
+ };
396
+ class HttpClient {
397
+ config;
398
+ fetch;
399
+ meta;
400
+ baseApiParams;
401
+ badResponse;
402
+ toQueryString;
403
+ constructor(config) {
404
+ this.config = config ?? {};
405
+ this.badResponse = null;
406
+ this.meta = config?.meta ?? null;
407
+ this.fetch = config?.fetch ?? ((...fetchParams) => globalThis.fetch(...fetchParams));
408
+ this.toQueryString = config?.toQueryString ?? ((query) => qs.stringify(query, config?.queryStringifyOptions));
409
+ this.baseApiParams = {
410
+ credentials: "same-origin",
411
+ headers: {},
412
+ redirect: "follow",
413
+ referrerPolicy: "no-referrer"
414
+ };
415
+ this.updateConfig(this.config);
416
+ mobx.observable.ref(this, "badResponse");
417
+ mobx.observable.ref(this, "meta");
418
+ mobx.action(this, "setMeta");
419
+ mobx.action(this, "setBadResponse");
420
+ mobx.makeObservable(this);
421
+ }
422
+ get baseUrl() {
423
+ return this.config.baseUrl ?? "";
424
+ }
425
+ updateConfig(update) {
426
+ Object.assign(this.config, update);
427
+ if (update.baseApiParams) {
428
+ Object.assign(this.baseApiParams, update.baseApiParams);
429
+ }
430
+ if (update.contentFormatters) {
431
+ Object.assign(this.contentFormatters, update.contentFormatters);
432
+ }
433
+ if (update.fetch) {
434
+ this.fetch = update.fetch;
435
+ }
436
+ }
437
+ setMeta = (data) => {
438
+ this.meta = data;
439
+ };
440
+ setBadResponse = (response) => {
441
+ this.badResponse = response;
442
+ };
443
+ contentFormatters = {
444
+ "application/json": (input) => input !== null && (typeof input === "object" || typeof input === "string") ? JSON.stringify(input) : input,
445
+ "text/plain": (input) => input !== null && typeof input !== "string" ? JSON.stringify(input) : input,
446
+ "multipart/form-data": (input) => Object.keys(input || {}).reduce((formData, key) => {
447
+ const property = input[key];
448
+ if (property instanceof Blob) {
449
+ formData.append(key, property);
450
+ } else if (typeof property === "object" && property !== null) {
451
+ formData.append(key, JSON.stringify(property));
452
+ } else {
453
+ formData.append(key, `${property}`);
454
+ }
455
+ return formData;
456
+ }, new FormData()),
457
+ "application/x-www-form-urlencoded": (input) => this.toQueryString(input),
458
+ "application/octet-stream": (input) => input
459
+ };
460
+ mergeRequestParams(params1, params2) {
461
+ return {
462
+ ...this.baseApiParams,
463
+ ...params1,
464
+ ...params2,
465
+ headers: {
466
+ ...this.baseApiParams.headers,
467
+ ...params1.headers,
468
+ ...params2?.headers
469
+ }
470
+ };
471
+ }
472
+ async createResponse(responseFormat, raw, url, params) {
473
+ const response = raw;
474
+ response.request = {
475
+ url,
476
+ params
477
+ };
478
+ response.data = null;
479
+ response.error = null;
480
+ if (responseFormat) {
481
+ try {
482
+ const formatted = await response[responseFormat]();
483
+ if (response.ok) {
484
+ response.data = formatted;
485
+ } else {
486
+ response.error = formatted;
487
+ }
488
+ } catch (error) {
489
+ if (response.ok) {
490
+ response.error = error;
491
+ } else {
492
+ response.error = null;
493
+ }
494
+ }
495
+ }
496
+ if (!response.ok || response.error) {
497
+ this.setBadResponse(response);
498
+ }
499
+ return response;
500
+ }
501
+ buildUrl = (params) => {
502
+ const baseUrl = params.baseUrl ?? this.baseUrl ?? "";
503
+ const path = params.path;
504
+ const queryString = params.query && this.toQueryString(params.query);
505
+ const query = queryString ? `?${queryString}` : "";
506
+ if (this.config.buildUrl) {
507
+ return this.config.buildUrl(params, { baseUrl, path, query }, this.meta);
508
+ }
509
+ const url = baseUrl + path + query;
510
+ return url;
511
+ };
512
+ async request(fullParams, endpoint) {
513
+ this.setBadResponse(null);
514
+ const {
515
+ body,
516
+ contentType = "application/json",
517
+ format = "json",
518
+ ...params
519
+ } = fullParams;
520
+ let requestParams = this.mergeRequestParams(params);
521
+ if (this.config.interceptor) {
522
+ requestParams = await this.config.interceptor(requestParams, this.meta, endpoint) ?? requestParams;
523
+ }
524
+ const payloadFormatter = this.contentFormatters[contentType];
525
+ const responseFormat = format || requestParams.format;
526
+ const url = this.buildUrl(fullParams);
527
+ let headers;
528
+ if (requestParams.headers instanceof Headers) {
529
+ headers = requestParams.headers;
530
+ } else if (Array.isArray(requestParams.headers)) {
531
+ headers = new Headers(requestParams.headers);
532
+ } else {
533
+ headers = new Headers(requestParams.headers);
534
+ }
535
+ if (!headers.has("Content-Type")) {
536
+ headers.set("Content-Type", contentType);
537
+ }
538
+ const fetchUrl = url;
539
+ const fetchParams = {
540
+ ...requestParams,
541
+ headers,
542
+ body: body == null ? null : payloadFormatter(body)
543
+ };
544
+ let response;
545
+ try {
546
+ response = await this.fetch(fetchUrl, fetchParams);
547
+ } catch (error) {
548
+ response = error;
549
+ }
550
+ const httpResponse = await this.createResponse(
551
+ responseFormat,
552
+ response,
553
+ fetchUrl,
554
+ fetchParams
555
+ );
556
+ if (!httpResponse.ok || httpResponse.error) {
557
+ throw httpResponse;
558
+ }
559
+ return httpResponse;
560
+ }
561
+ }
392
562
  class Endpoint {
393
563
  constructor(configuration, queryClient, httpClient) {
394
564
  this.configuration = configuration;
@@ -444,6 +614,9 @@ class Endpoint {
444
614
  get namespace() {
445
615
  return this.configuration.namespace;
446
616
  }
617
+ checkResponse(response, status) {
618
+ return isHttpResponse(response, status);
619
+ }
447
620
  request(...args) {
448
621
  return this.httpClient.request(
449
622
  this.configuration.params(args[0] ?? {}),
@@ -585,176 +758,6 @@ const applyStringFilter = (filter, value) => {
585
758
  }
586
759
  return values.includes(filter);
587
760
  };
588
- const isHttpResponse = (response, status) => !!response && typeof response === "object" && response instanceof Response && "data" in response && (!status || response.status === status);
589
- const isHttpBadResponse = (response) => {
590
- return isHttpResponse(response) && (!response.ok || !!response.error);
591
- };
592
- class HttpClient {
593
- config;
594
- fetch;
595
- meta;
596
- baseApiParams;
597
- badResponse;
598
- toQueryString;
599
- constructor(config) {
600
- this.config = config ?? {};
601
- this.badResponse = null;
602
- this.meta = config?.meta ?? null;
603
- this.fetch = config?.fetch ?? ((...fetchParams) => globalThis.fetch(...fetchParams));
604
- this.toQueryString = config?.toQueryString ?? ((query) => qs.stringify(query, config?.queryStringifyOptions));
605
- this.baseApiParams = {
606
- credentials: "same-origin",
607
- headers: {},
608
- redirect: "follow",
609
- referrerPolicy: "no-referrer"
610
- };
611
- this.updateConfig(this.config);
612
- mobx.observable.ref(this, "badResponse");
613
- mobx.observable.ref(this, "meta");
614
- mobx.action(this, "setMeta");
615
- mobx.action(this, "setBadResponse");
616
- mobx.makeObservable(this);
617
- }
618
- get baseUrl() {
619
- return this.config.baseUrl ?? "";
620
- }
621
- updateConfig(update) {
622
- Object.assign(this.config, update);
623
- if (update.baseApiParams) {
624
- Object.assign(this.baseApiParams, update.baseApiParams);
625
- }
626
- if (update.contentFormatters) {
627
- Object.assign(this.contentFormatters, update.contentFormatters);
628
- }
629
- if (update.fetch) {
630
- this.fetch = update.fetch;
631
- }
632
- }
633
- setMeta = (data) => {
634
- this.meta = data;
635
- };
636
- setBadResponse = (response) => {
637
- this.badResponse = response;
638
- };
639
- contentFormatters = {
640
- "application/json": (input) => input !== null && (typeof input === "object" || typeof input === "string") ? JSON.stringify(input) : input,
641
- "text/plain": (input) => input !== null && typeof input !== "string" ? JSON.stringify(input) : input,
642
- "multipart/form-data": (input) => Object.keys(input || {}).reduce((formData, key) => {
643
- const property = input[key];
644
- if (property instanceof Blob) {
645
- formData.append(key, property);
646
- } else if (typeof property === "object" && property !== null) {
647
- formData.append(key, JSON.stringify(property));
648
- } else {
649
- formData.append(key, `${property}`);
650
- }
651
- return formData;
652
- }, new FormData()),
653
- "application/x-www-form-urlencoded": (input) => this.toQueryString(input),
654
- "application/octet-stream": (input) => input
655
- };
656
- mergeRequestParams(params1, params2) {
657
- return {
658
- ...this.baseApiParams,
659
- ...params1,
660
- ...params2,
661
- headers: {
662
- ...this.baseApiParams.headers,
663
- ...params1.headers,
664
- ...params2?.headers
665
- }
666
- };
667
- }
668
- async createResponse(responseFormat, raw, url, params) {
669
- const response = raw;
670
- response.request = {
671
- url,
672
- params
673
- };
674
- response.data = null;
675
- response.error = null;
676
- if (responseFormat) {
677
- try {
678
- const formatted = await response[responseFormat]();
679
- if (response.ok) {
680
- response.data = formatted;
681
- } else {
682
- response.error = formatted;
683
- }
684
- } catch (error) {
685
- if (response.ok) {
686
- response.error = error;
687
- } else {
688
- response.error = null;
689
- }
690
- }
691
- }
692
- if (!response.ok || response.error) {
693
- this.setBadResponse(response);
694
- }
695
- return response;
696
- }
697
- buildUrl = (params) => {
698
- const baseUrl = params.baseUrl ?? this.baseUrl ?? "";
699
- const path = params.path;
700
- const queryString = params.query && this.toQueryString(params.query);
701
- const query = queryString ? `?${queryString}` : "";
702
- if (this.config.buildUrl) {
703
- return this.config.buildUrl(params, { baseUrl, path, query }, this.meta);
704
- }
705
- const url = baseUrl + path + query;
706
- return url;
707
- };
708
- async request(fullParams, endpoint) {
709
- this.setBadResponse(null);
710
- const {
711
- body,
712
- contentType = "application/json",
713
- format = "json",
714
- ...params
715
- } = fullParams;
716
- let requestParams = this.mergeRequestParams(params);
717
- if (this.config.interceptor) {
718
- requestParams = await this.config.interceptor(requestParams, this.meta, endpoint) ?? requestParams;
719
- }
720
- const payloadFormatter = this.contentFormatters[contentType];
721
- const responseFormat = format || requestParams.format;
722
- const url = this.buildUrl(fullParams);
723
- let headers;
724
- if (requestParams.headers instanceof Headers) {
725
- headers = requestParams.headers;
726
- } else if (Array.isArray(requestParams.headers)) {
727
- headers = new Headers(requestParams.headers);
728
- } else {
729
- headers = new Headers(requestParams.headers);
730
- }
731
- if (!headers.has("Content-Type")) {
732
- headers.set("Content-Type", contentType);
733
- }
734
- const fetchUrl = url;
735
- const fetchParams = {
736
- ...requestParams,
737
- headers,
738
- body: body == null ? null : payloadFormatter(body)
739
- };
740
- let response;
741
- try {
742
- response = await this.fetch(fetchUrl, fetchParams);
743
- } catch (error) {
744
- response = error;
745
- }
746
- const httpResponse = await this.createResponse(
747
- responseFormat,
748
- response,
749
- fetchUrl,
750
- fetchParams
751
- );
752
- if (!httpResponse.ok || httpResponse.error) {
753
- throw httpResponse;
754
- }
755
- return httpResponse;
756
- }
757
- }
758
761
  exports.Endpoint = Endpoint;
759
762
  exports.EndpointMutation = EndpointMutation;
760
763
  exports.EndpointQuery = EndpointQuery;
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/runtime/endpoint-query.ts","../src/runtime/endpoint-infinite-query.ts","../src/runtime/endpoint-mutation.ts","../src/runtime/endpoint.ts","../src/runtime/endpoint-query-client.ts","../src/runtime/http-client.ts"],"sourcesContent":["/** biome-ignore-all lint/correctness/noUnusedVariables: <explanation> */\nimport type {\n DefaultError,\n QueryFunctionContext,\n QueryObserverResult,\n RefetchOptions,\n} from '@tanstack/query-core';\nimport {\n comparer,\n computed,\n makeObservable,\n observable,\n reaction,\n runInAction,\n} from 'mobx';\nimport { Query, type QueryUpdateOptionsAllVariants } from 'mobx-tanstack-query';\nimport { callFunction } from 'yummies/common';\nimport { getMobxAdministration, lazyObserve } from 'yummies/mobx';\nimport type { AnyObject, Maybe, MaybeFalsy, MaybeFn } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\nimport type {\n EndpointQueryFlattenOptions,\n EndpointQueryOptions,\n EndpointQueryUniqKey,\n ExcludedQueryKeys,\n} from './endpoint-query.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport type { RequestParams } from './http-client.js';\n\ninterface InternalObservableData<TEndpoint extends AnyEndpoint> {\n params: MaybeFalsy<TEndpoint['__params']>;\n uniqKey?: EndpointQueryUniqKey;\n initialized?: boolean;\n dynamicOptions?: any;\n response: TEndpoint['__response'] | null;\n}\n\n/**\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoint-queries/)\n */\nexport class EndpointQuery<\n TEndpoint extends AnyEndpoint,\n TQueryFnData = TEndpoint['__response']['data'],\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n> extends Query<TQueryFnData, TError, TData, TQueryData> {\n private _observableData: InternalObservableData<TEndpoint>;\n\n constructor(\n private endpoint: AnyEndpoint,\n inputQueryClient: EndpointQueryClient,\n queryOptionsInput:\n | EndpointQueryOptions<TEndpoint, TQueryFnData, TError, TData, TQueryData>\n | (() => EndpointQueryFlattenOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TData,\n TQueryData\n >),\n ) {\n const isQueryOptionsInputFn = typeof queryOptionsInput === 'function';\n const unpackedQueryOptionsInput = isQueryOptionsInputFn\n ? queryOptionsInput()\n : queryOptionsInput;\n\n const {\n uniqKey,\n transform: transformResponse,\n params,\n queryClient: overridedQueryClient,\n ...queryOptions\n } = unpackedQueryOptionsInput;\n\n const queryClient = overridedQueryClient ?? inputQueryClient;\n\n const _observableData: InternalObservableData<TEndpoint> = {\n params: null,\n dynamicOptions: undefined,\n response: null,\n uniqKey: unpackedQueryOptionsInput.uniqKey,\n };\n\n if (!isQueryOptionsInputFn && typeof params !== 'function') {\n if ('params' in unpackedQueryOptionsInput) {\n _observableData.params = params;\n } else {\n _observableData.params = {};\n }\n _observableData.initialized = true;\n }\n\n makeObservable(_observableData, {\n params: observable.ref,\n response: observable.ref,\n dynamicOptions: observable,\n });\n\n super({\n ...queryOptions,\n queryClient,\n meta: endpoint.toQueryMeta(queryOptions.meta),\n options: (): any => {\n const builtOptions = buildOptionsFromParams(\n endpoint,\n _observableData.params,\n _observableData.uniqKey,\n );\n\n let isEnabled = !!_observableData.initialized && builtOptions.enabled;\n\n if (\n typeof queryOptionsInput !== 'function' &&\n queryOptionsInput.enabled === false\n ) {\n isEnabled = false;\n }\n\n return {\n ...builtOptions,\n enabled: isEnabled,\n ..._observableData.dynamicOptions,\n };\n },\n queryFn: async (ctx): Promise<any> => {\n const params = endpoint.getParamsFromContext(ctx);\n\n runInAction(() => {\n _observableData.response = null;\n if (!comparer.structural(params, _observableData.params)) {\n _observableData.params = params;\n }\n });\n\n let requestParams = params.requestParams as Maybe<RequestParams>;\n\n if (requestParams) {\n if (!requestParams.signal) {\n requestParams.signal = ctx.signal;\n }\n } else {\n requestParams = { signal: ctx.signal };\n }\n\n const fixedInput = {\n ...params,\n requestParams,\n };\n\n const response = await endpoint.request(fixedInput);\n\n runInAction(() => {\n _observableData.response = response as TEndpoint['__response'];\n });\n\n return (await transformResponse?.(response)) ?? response.data;\n },\n });\n\n const parentAtom = getMobxAdministration(this);\n\n computed.struct(this, 'params');\n computed.struct(this, 'response');\n makeObservable(this);\n\n if (isQueryOptionsInputFn || typeof params === 'function') {\n const createParamsReaction = () =>\n reaction(\n (): Partial<InternalObservableData<TEndpoint>> => {\n let outDynamicOptions: InternalObservableData<TEndpoint>['dynamicOptions'];\n let outParams: MaybeFn<MaybeFalsy<TEndpoint['__params']>>;\n let uniqKey: Maybe<EndpointQueryUniqKey>;\n\n if (isQueryOptionsInputFn) {\n const result = queryOptionsInput();\n const {\n params,\n abortSignal,\n select,\n onDone,\n onError,\n onInit,\n enableOnDemand,\n uniqKey: _uniqKey,\n ...dynamicOptions\n } = result;\n\n uniqKey = _uniqKey;\n\n if ('params' in result) {\n outParams = result.params;\n } else {\n outParams = {};\n }\n\n outDynamicOptions =\n Object.keys(dynamicOptions).length > 0\n ? dynamicOptions\n : undefined;\n } else if ('params' in unpackedQueryOptionsInput) {\n outParams = unpackedQueryOptionsInput.params;\n uniqKey = unpackedQueryOptionsInput.uniqKey;\n } else {\n outParams = {};\n uniqKey = unpackedQueryOptionsInput.uniqKey;\n }\n\n return {\n params: callFunction(outParams),\n dynamicOptions: outDynamicOptions,\n uniqKey,\n };\n },\n ({ params, dynamicOptions, uniqKey }) => {\n runInAction(() => {\n _observableData.initialized = true;\n _observableData.params = params;\n _observableData.dynamicOptions = dynamicOptions;\n _observableData.uniqKey = uniqKey;\n });\n },\n {\n fireImmediately: true,\n },\n );\n\n if (this.features.lazy) {\n lazyObserve({\n property: parentAtom.values_.get('_result'),\n onStart: createParamsReaction,\n onEnd: (disposeFn) => disposeFn(),\n });\n } else {\n this.abortController.signal.addEventListener(\n 'abort',\n createParamsReaction(),\n );\n }\n }\n\n this._observableData = _observableData;\n }\n\n get params() {\n return this._observableData.params;\n }\n\n get response() {\n return this._observableData.response;\n }\n\n update(\n updateParams: Omit<\n QueryUpdateOptionsAllVariants<TQueryFnData, TError, TData, TQueryData>,\n ExcludedQueryKeys\n > & {\n params?: MaybeFalsy<TEndpoint['__params']>;\n },\n ) {\n if ('params' in updateParams) {\n const { params, ...options } = updateParams;\n runInAction(() => {\n this._observableData.params = params;\n });\n return super.update({\n ...buildOptionsFromParams(\n this.endpoint,\n params,\n this._observableData.uniqKey,\n ),\n ...options,\n });\n } else if (this._observableData) {\n return super.update({\n ...buildOptionsFromParams(\n this.endpoint,\n this._observableData.params,\n this._observableData.uniqKey,\n ),\n ...updateParams,\n });\n } else {\n return super.update(updateParams);\n }\n }\n\n refetch(\n options?: RefetchOptions,\n ): Promise<QueryObserverResult<TData, TError>> {\n if (this.params) {\n return super.refetch(options);\n }\n return Promise.resolve(this.queryObserver.getCurrentResult());\n }\n\n async start(\n params: MaybeFalsy<TEndpoint['__params']>,\n ): Promise<QueryObserverResult<TData, TError>> {\n runInAction(() => {\n this._observableData.params = params;\n });\n return await super.start(\n buildOptionsFromParams(\n this.endpoint,\n params,\n this._observableData.uniqKey,\n ),\n );\n }\n\n protected handleDestroy(): void {\n super.handleDestroy();\n runInAction(() => {\n this._observableData.params = undefined;\n this._observableData.dynamicOptions = undefined;\n });\n }\n}\n\nexport const getParamsFromContext = (ctx: QueryFunctionContext<any, any>) => {\n return (ctx.queryKey.at(-2) || {}) as AnyEndpoint['__params'];\n};\n\nexport const buildOptionsFromParams = (\n endpoint: AnyEndpoint,\n params: MaybeFalsy<AnyObject>,\n uniqKey: Maybe<EndpointQueryUniqKey>,\n): { enabled: boolean; queryKey: any[] } => {\n const { requiredParams } = endpoint.configuration;\n let hasRequiredParams = false;\n\n if (requiredParams.length > 0) {\n hasRequiredParams =\n !!params && requiredParams.every((param) => param in params);\n } else {\n hasRequiredParams = !!params;\n }\n\n return {\n enabled: hasRequiredParams,\n queryKey: endpoint.toQueryKey(params || {}, uniqKey),\n };\n};\n","import type {\n DefaultError,\n InfiniteData,\n QueryObserverResult,\n} from '@tanstack/query-core';\nimport { makeObservable, observable, runInAction } from 'mobx';\nimport { InfiniteQuery } from 'mobx-tanstack-query';\nimport type { Maybe, MaybeFalsy } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\nimport type {\n EndpointInfiniteQueryFlattenOptions,\n EndpointInfiniteQueryOptions,\n EndpointInfiniteQueryUpdateOptionsAllVariants,\n} from './endpoint-infinite-query.types.js';\nimport { buildOptionsFromParams } from './endpoint-query.js';\nimport type { EndpointQueryUniqKey } from './endpoint-query.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport type { RequestParams } from './http-client.js';\n\nexport class EndpointInfiniteQuery<\n TEndpoint extends AnyEndpoint,\n TQueryFnData = TEndpoint['__response']['data'],\n TError = DefaultError,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n> extends InfiniteQuery<TQueryFnData, TError, TPageParam, TData, any[]> {\n response: TEndpoint['__response'] | null = null;\n params: TEndpoint['__params'] | null = null;\n\n private uniqKey?: EndpointQueryUniqKey;\n\n private paramsFn: EndpointInfiniteQueryFlattenOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >['params'];\n\n constructor(\n private endpoint: AnyEndpoint,\n queryClient: EndpointQueryClient,\n\n queryOptionsInput:\n | EndpointInfiniteQueryOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >\n | (() => EndpointInfiniteQueryFlattenOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >),\n ) {\n const {\n uniqKey,\n transform: transformResponse,\n params: paramsFn,\n ...queryOptions\n } = typeof queryOptionsInput === 'function'\n ? queryOptionsInput()\n : queryOptionsInput;\n\n super({\n ...queryOptions,\n queryClient,\n meta: endpoint.toQueryMeta(queryOptions.meta),\n options: (query): any => {\n const extraOptions: any = {};\n let willEnableManually: boolean;\n let params: any;\n\n const pageParam = query.options.initialPageParam;\n\n if (typeof queryOptionsInput === 'function') {\n Object.assign(extraOptions, queryOptionsInput());\n params = paramsFn(pageParam);\n willEnableManually = false;\n } else {\n willEnableManually = queryOptionsInput.enabled === false;\n params = paramsFn(pageParam);\n }\n\n const builtOptions = buildOptionsFromParams(endpoint, params, uniqKey);\n // const dynamicOuterOptions = getDynamicOptions?.(query);\n\n let isEnabled = false;\n\n if (willEnableManually) {\n // if (dynamicOuterOptions?.enabled != null) {\n // isEnabled = dynamicOuterOptions.enabled;\n // }\n } else {\n // const outerDynamicEnabled =\n // dynamicOuterOptions?.enabled == null ||\n // !!dynamicOuterOptions.enabled;\n\n // isEnabled = builtOptions.enabled && outerDynamicEnabled;\n isEnabled = builtOptions.enabled;\n }\n\n return {\n ...query.options,\n ...builtOptions,\n // ...dynamicOuterOptions,\n enabled: isEnabled,\n ...extraOptions,\n } as any;\n },\n queryFn: async (ctx): Promise<any> => {\n const params = paramsFn(\n (ctx.pageParam as any) ?? queryOptions.initialPageParam,\n ) as TEndpoint['__params'];\n\n runInAction(() => {\n this.response = null;\n this.params = params;\n });\n\n let requestParams = params.request as Maybe<RequestParams>;\n\n if (requestParams) {\n if (!requestParams.signal) {\n requestParams.signal = ctx.signal;\n }\n } else {\n requestParams = { signal: ctx.signal };\n }\n\n const fixedInput = {\n ...params,\n request: requestParams,\n };\n\n const response = await endpoint.request(fixedInput);\n\n runInAction(() => {\n this.response = response as TEndpoint['__response'];\n });\n\n return (await transformResponse?.(response)) ?? response.data;\n },\n });\n\n this.paramsFn = paramsFn;\n this.uniqKey = uniqKey;\n\n observable.ref(this, 'response');\n observable.ref(this, 'params');\n makeObservable(this);\n }\n\n update({\n params,\n ...options\n }: EndpointInfiniteQueryUpdateOptionsAllVariants<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >) {\n return super.update({\n ...buildOptionsFromParams(this.endpoint, params, this.uniqKey),\n ...options,\n });\n }\n\n async start(\n params: MaybeFalsy<TEndpoint['__params']>,\n ): Promise<QueryObserverResult<TData, TError>> {\n return await super.start(\n buildOptionsFromParams(this.endpoint, params, this.uniqKey),\n );\n }\n}\n","import { Mutation } from 'mobx-tanstack-query';\nimport type { AnyObject, Maybe } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\nimport type {\n EndpointMutationOptions,\n EndpointMutationParams,\n} from './endpoint-mutation.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport type { InvalidateEndpointsFilters } from './endpoint-query-client.types.js';\nimport type { RequestParams } from './http-client.js';\n\n/**\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoint-mutations/)\n */\nexport class EndpointMutation<\n TEndpoint extends AnyEndpoint,\n TData = unknown,\n TParams extends AnyObject = AnyObject,\n TMutationMeta extends AnyObject | void = void,\n TOnMutateResult = unknown,\n> extends Mutation<\n TData,\n EndpointMutationParams<TParams, TMutationMeta>,\n TEndpoint['__response']['error'],\n TOnMutateResult\n> {\n constructor(\n private endpoint: AnyEndpoint,\n inputQueryClient: EndpointQueryClient,\n {\n transform: transformResponse,\n invalidateEndpoints,\n queryClient: overridedQueryClient,\n ...mutationOptions\n }: EndpointMutationOptions<\n TEndpoint,\n TData,\n TParams,\n TMutationMeta,\n TOnMutateResult\n >,\n ) {\n const queryClient = overridedQueryClient ?? inputQueryClient;\n super({\n ...mutationOptions,\n queryClient,\n onSuccess: (data, variables, onMutateResult, context) => {\n mutationOptions.onSuccess?.(data, variables, onMutateResult, context);\n if (invalidateEndpoints) {\n if (typeof invalidateEndpoints === 'object') {\n queryClient.invalidateEndpoints(invalidateEndpoints);\n } else {\n let filters: Maybe<InvalidateEndpointsFilters>;\n switch (`${invalidateEndpoints}`) {\n case 'true': {\n filters = endpoint.group\n ? {\n group: endpoint.group,\n }\n : {\n tag: endpoint.tags,\n };\n\n break;\n }\n case 'by-group': {\n filters = {\n group: endpoint.group,\n };\n\n break;\n }\n case 'by-tag': {\n filters = {\n tag: endpoint.tags,\n };\n\n break;\n }\n }\n\n if (filters) {\n queryClient.invalidateEndpoints(filters);\n }\n }\n }\n },\n mutationFn: async (input, context) => {\n let requestParams = input?.requestParams as Maybe<RequestParams>;\n\n if (requestParams) {\n if (!requestParams.signal) {\n requestParams.signal = context.signal;\n }\n } else {\n requestParams = { signal: context.signal };\n }\n\n const fixedInput = {\n ...input,\n requestParams,\n };\n\n const response = await endpoint.request(fixedInput);\n return (await transformResponse?.(response)) ?? response.data;\n },\n });\n }\n}\n","/** biome-ignore-all lint/style/useShorthandFunctionType: this is special trick to add typings for callable class instance */\nimport type {\n DefaultError,\n InvalidateOptions,\n InvalidateQueryFilters,\n QueryFunctionContext,\n QueryKey,\n} from '@tanstack/query-core';\nimport type { IQueryClientCore } from 'mobx-tanstack-query';\nimport { callFunction } from 'yummies/common';\nimport type { AnyObject, IsPartial, Maybe } from 'yummies/types';\nimport type {\n EndpointConfiguration,\n EndpointMutationPresets,\n} from './endpoint.types.js';\nimport { EndpointInfiniteQuery } from './endpoint-infinite-query.js';\nimport type {\n EndpointInfiniteQueryFlattenOptions,\n EndpointInfiniteQueryOptions,\n} from './endpoint-infinite-query.types.js';\nimport { EndpointMutation } from './endpoint-mutation.js';\nimport type { EndpointMutationOptions } from './endpoint-mutation.types.js';\nimport { EndpointQuery } from './endpoint-query.js';\nimport type {\n EndpointQueryFlattenOptions,\n EndpointQueryMeta,\n EndpointQueryOptions,\n EndpointQueryUniqKey,\n} from './endpoint-query.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport type { AnyResponse, HttpClient } from './http-client.js';\n\nexport interface Endpoint<\n TResponse extends AnyResponse,\n TParams extends AnyObject,\n TMetaData extends AnyObject = AnyObject,\n> {\n (\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ): ReturnType<Endpoint<TResponse, TParams, TMetaData>['request']>;\n}\n\n/**\n * This class is a wrapper for your http request.\n *\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoints/)\n */\nexport class Endpoint<\n TResponse extends AnyResponse,\n TParams extends AnyObject,\n TMetaData extends AnyObject = AnyObject,\n> {\n endpointId: string;\n\n presets: {\n mutations: EndpointMutationPresets;\n } = {\n mutations: {},\n };\n\n __params!: TParams;\n __response!: TResponse;\n\n meta!: TMetaData;\n\n constructor(\n public configuration: EndpointConfiguration<NoInfer<TParams>, TMetaData>,\n public queryClient: EndpointQueryClient,\n public httpClient: HttpClient,\n ) {\n this.endpointId = globalThis.crypto.randomUUID();\n this.meta = configuration.meta ?? ({} as TMetaData);\n // Сохраняем оригинальный инстанс\n const instance = this;\n\n // Создаем функцию-обертку\n const callable = function (\n this: any,\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ) {\n return instance.request.apply(instance, args);\n } as unknown as Endpoint<TResponse, TParams, TMetaData>;\n\n // Копируем прототип\n Object.setPrototypeOf(callable, new.target.prototype);\n\n // Копируем методы из оригинального инстанса\n Object.getOwnPropertyNames(instance)\n .concat(Object.getOwnPropertyNames(new.target.prototype))\n .forEach((key) => {\n if (key === 'constructor') return;\n const desc =\n Object.getOwnPropertyDescriptor(instance, key) ||\n Object.getOwnPropertyDescriptor(new.target.prototype, key);\n if (desc) Object.defineProperty(callable, key, desc);\n });\n\n // biome-ignore lint/correctness/noConstructorReturn: this is special trick to add typings for callable class instance\n return callable;\n }\n\n getFullUrl(\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ): string {\n const params = this.configuration.params(args[0] ?? ({} as TParams));\n return this.httpClient.buildUrl(params);\n }\n\n getPath(\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ): string {\n const params = this.configuration.params(args[0] ?? ({} as TParams));\n return params.path;\n }\n\n getParamsFromContext<\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n >(\n ctx: Omit<QueryFunctionContext<TQueryKey, TPageParam>, 'client'> & {\n client: IQueryClientCore;\n },\n ): TParams {\n return (ctx.queryKey.at(-2) || {}) as TParams;\n }\n\n get tags() {\n return this.configuration.tags;\n }\n\n get path() {\n return this.configuration.path;\n }\n\n get pathDeclaration() {\n return this.path.join('/');\n }\n\n get operationId() {\n return this.configuration.operationId;\n }\n\n get group() {\n return this.configuration.group;\n }\n\n get namespace() {\n return this.configuration.namespace;\n }\n\n request(\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ) {\n return this.httpClient.request<TResponse>(\n this.configuration.params(args[0] ?? ({} as TParams)),\n this,\n );\n }\n\n toQueryMeta = (meta?: AnyObject) =>\n ({\n ...meta,\n tags: this.tags,\n operationId: this.operationId,\n path: this.path,\n pathDeclaration: this.pathDeclaration,\n endpointId: this.endpointId,\n endpointQuery: true,\n }) satisfies EndpointQueryMeta;\n\n toQueryKey(params?: Maybe<TParams>, uniqKey?: EndpointQueryUniqKey): any {\n return [\n ...this.configuration.path,\n this.configuration.operationId,\n params ?? {},\n callFunction(uniqKey),\n ];\n }\n\n toInfiniteQueryKey(\n params?: Maybe<TParams>,\n uniqKey?: EndpointQueryUniqKey,\n ): any {\n return [\n { infiniteQuery: true },\n ...this.configuration.path,\n this.configuration.operationId,\n params ?? {},\n callFunction(uniqKey),\n ];\n }\n\n invalidateQuery(\n ...args: IsPartial<TParams> extends true\n ? [\n params?: Maybe<TParams>,\n filters?: InvalidateQueryFilters & { uniqKey?: EndpointQueryUniqKey },\n options?: InvalidateOptions,\n ]\n : [\n params: TParams,\n filters?: InvalidateQueryFilters & { uniqKey?: EndpointQueryUniqKey },\n options?: InvalidateOptions,\n ]\n ) {\n this.queryClient.invalidateQueries(\n {\n queryKey: this.toQueryKey(args[0], args[1]?.uniqKey),\n exact: true,\n ...(args[1] as any),\n },\n args[2],\n );\n }\n\n toMutation<\n TData = TResponse['data'],\n TMutationMeta extends AnyObject | void = void,\n TContext = unknown,\n >(\n options: EndpointMutationOptions<\n this,\n TData,\n TParams,\n TMutationMeta,\n TContext\n >,\n ) {\n return new EndpointMutation<this, TData, TParams, TMutationMeta, TContext>(\n this,\n this.queryClient,\n {\n ...options,\n invalidateEndpoints:\n options.invalidateEndpoints ??\n this.presets.mutations?.invalidateQueries,\n },\n );\n }\n\n toQuery<\n TQueryFnData = TResponse['data'],\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n >(\n options:\n | EndpointQueryOptions<this, TQueryFnData, TError, TData, TQueryData>\n | (() => EndpointQueryFlattenOptions<\n this,\n TQueryFnData,\n TError,\n TData,\n TQueryData\n >),\n ) {\n return new EndpointQuery<this, TQueryFnData, TError, TData, TQueryData>(\n this,\n this.queryClient,\n options,\n );\n }\n\n toInfiniteQuery<\n TData = TResponse['data'],\n TError = DefaultError,\n TPageParam = unknown,\n >(\n options:\n | EndpointInfiniteQueryOptions<this, TData, TError, TPageParam>\n | (() => EndpointInfiniteQueryFlattenOptions<\n this,\n TData,\n TError,\n TPageParam\n >),\n ) {\n return new EndpointInfiniteQuery<this, TData, TError, TPageParam>(\n this,\n this.queryClient,\n options,\n );\n }\n}\n","import { hashKey, type InvalidateOptions } from '@tanstack/query-core';\nimport { QueryClient, type QueryClientConfig } from 'mobx-tanstack-query';\nimport type { Maybe } from 'yummies/types';\nimport type { EndpointQueryMeta } from './endpoint-query.types.js';\nimport type {\n EndpointStringFilter,\n InvalidateEndpointsFilters,\n} from './endpoint-query-client.types.js';\n\n/**\n * Class that extends `QueryClient` and gives a bit more control over endpoint queries and mutations.\n *\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoint-query-client/)\n */\nexport class EndpointQueryClient extends QueryClient {\n constructor(config?: QueryClientConfig) {\n super({\n ...config,\n defaultOptions: {\n ...config?.defaultOptions,\n queries: {\n ...config?.defaultOptions?.queries,\n queryKeyHashFn:\n config?.defaultOptions?.queries?.queryKeyHashFn ?? hashKey,\n },\n },\n });\n }\n\n invalidateEndpoints(\n {\n group,\n namespace,\n operationId,\n tag,\n predicate,\n endpoint,\n ...queryFilters\n }: InvalidateEndpointsFilters,\n options?: InvalidateOptions,\n ) {\n let endpointIdsToFilter: Maybe<Set<string>>;\n\n if (Array.isArray(endpoint)) {\n endpointIdsToFilter = new Set(endpoint.map((it) => it.endpointId));\n } else if (endpoint) {\n endpointIdsToFilter = new Set([endpoint.endpointId]);\n }\n\n return this.invalidateQueries(\n {\n ...queryFilters,\n predicate: (query) => {\n if (!query.meta?.endpointQuery) {\n return false;\n }\n\n const meta = query.meta as unknown as EndpointQueryMeta;\n\n if (\n endpointIdsToFilter &&\n !endpointIdsToFilter.has(meta.endpointId)\n ) {\n return false;\n }\n\n if (\n namespace &&\n meta.namespace &&\n !applyStringFilter(namespace, meta.namespace)\n ) {\n return false;\n }\n\n if (group && meta.group && !applyStringFilter(group, meta.group)) {\n return false;\n }\n\n if (tag && meta.tags && !applyStringFilter(tag, meta.tags)) {\n return false;\n }\n\n if (tag && meta.tags && !applyStringFilter(tag, meta.tags)) {\n return false;\n }\n\n if (\n operationId &&\n !applyStringFilter(operationId, meta.operationId)\n ) {\n return false;\n }\n\n if (predicate && !predicate(meta, query as any)) {\n return false;\n }\n\n return true;\n },\n },\n options,\n );\n }\n}\n\nconst applyStringFilter = (\n filter: EndpointStringFilter,\n value: string | string[],\n): boolean => {\n const values = Array.isArray(value) ? value : [value];\n\n if (filter instanceof RegExp) {\n return values.some((value) => filter.test(value));\n }\n\n if (Array.isArray(filter)) {\n return filter.some((filter) => values.includes(filter));\n }\n\n return values.includes(filter);\n};\n","import type {\n HttpStatusCode,\n HttpSuccessStatusCode,\n} from 'http-status-code-types';\nimport { action, makeObservable, observable } from 'mobx';\nimport { type BooleanOptional, type IStringifyOptions, stringify } from 'qs';\nimport type { AnyObject, Defined, Maybe, ValueOf } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\n\nexport type QueryParamsType = Record<string | number, any>;\nexport type ResponseFormat = keyof Omit<Body, 'body' | 'bodyUsed'>;\n\nexport interface FullRequestParams extends Omit<RequestInit, 'body'> {\n /** set parameter to `true` for call `securityWorker` for this request */\n secure?: boolean;\n /** request path */\n path: string;\n /** content type of request body */\n contentType?: string;\n /** query params */\n query?: QueryParamsType;\n /** format of response (i.e. response.json() -> format: \"json\") */\n format?: ResponseFormat;\n /** request body */\n body?: unknown;\n /** base url */\n baseUrl?: string;\n /** meta data */\n meta?: Record<string, any>;\n}\n\nexport type RequestParams = Omit<\n FullRequestParams,\n 'body' | 'method' | 'query' | 'path' | 'serviceName'\n>;\n\nexport interface HttpClientConfig<TMeta = unknown> {\n baseUrl?: string;\n meta?: TMeta;\n fetch?: typeof globalThis.fetch;\n baseApiParams?: Omit<RequestParams, 'baseUrl' | 'cancelToken' | 'signal'>;\n contentFormatters?: Record<string, (input: any) => any>;\n queryStringifyOptions?: IStringifyOptions<BooleanOptional>;\n toQueryString?: (query?: AnyObject) => string;\n buildUrl?: (\n fullParams: FullRequestParams,\n formattedParts: { baseUrl: string; path: string; query: string },\n metadata: TMeta | null,\n ) => string;\n interceptor?: (\n requestParams: RequestParams,\n metadata: TMeta | null,\n endpoint?: Maybe<AnyEndpoint>,\n ) => Promise<RequestParams | void> | RequestParams | void;\n}\n\nexport interface HttpResponse<TData, TError = null, TStatus = number>\n extends Omit<Response, 'status'> {\n data: TData;\n error: TError;\n status: TStatus;\n request: {\n url: string;\n params: globalThis.RequestInit;\n };\n}\n\ntype ResponsesByStatusMap = {\n [K in HttpStatusCode]?: any;\n};\n\nexport type HttpMultistatusResponse<\n TResponsesByStatusMap extends ResponsesByStatusMap,\n TDefaultOkResponse,\n TDefaultBadResponse = unknown,\n> = Omit<Response, 'status'> &\n (\n | ValueOf<{\n [K in keyof TResponsesByStatusMap]: {\n status: K;\n data: K extends HttpSuccessStatusCode\n ? TResponsesByStatusMap[K]\n : TDefaultOkResponse;\n error: K extends HttpSuccessStatusCode\n ? TDefaultBadResponse\n : TResponsesByStatusMap[K];\n request: {\n url: string;\n params: globalThis.RequestInit;\n };\n };\n }>\n | {\n status: Exclude<HttpStatusCode, keyof TResponsesByStatusMap>;\n data: TDefaultOkResponse;\n error: TDefaultBadResponse;\n request: {\n url: string;\n params: globalThis.RequestInit;\n };\n }\n );\n\nexport type GetHttpResponse<T> = T extends (...args: any[]) => infer R\n ? R extends Promise<HttpResponse<any, any>>\n ? Awaited<R>\n : R extends Promise<HttpMultistatusResponse<any, any, any>>\n ? Awaited<R>\n : HttpResponse<any, any>\n : HttpResponse<any, any>;\n\nexport type HttpBadResponse<T = any> = HttpResponse<null, T>;\n\nexport type AnyHttpResponse = HttpResponse<any, any>;\n\nexport type AnyHttpMultistatusResponse = HttpMultistatusResponse<\n ResponsesByStatusMap,\n any,\n any\n>;\n\nexport type AnyResponse = AnyHttpResponse | AnyHttpMultistatusResponse;\n\nexport const isHttpResponse = (\n response: unknown,\n status?: number,\n): response is AnyHttpResponse =>\n !!response &&\n typeof response === 'object' &&\n response instanceof Response &&\n 'data' in response &&\n (!status || response.status === status);\n\nexport const isHttpBadResponse = (\n response: unknown,\n): response is HttpResponse<null, any> => {\n return isHttpResponse(response) && (!response.ok || !!response.error);\n};\n\nexport class HttpClient<TMeta = unknown> {\n private config: HttpClientConfig<TMeta>;\n private fetch: Required<HttpClientConfig<TMeta>>['fetch'];\n\n public meta: TMeta | null;\n public baseApiParams: RequestParams;\n\n badResponse: unknown;\n\n protected toQueryString: Defined<HttpClientConfig<TMeta>['toQueryString']>;\n\n constructor(config?: HttpClientConfig<TMeta>) {\n this.config = config ?? {};\n this.badResponse = null;\n this.meta = config?.meta ?? null;\n this.fetch =\n config?.fetch ??\n ((...fetchParams: Parameters<typeof globalThis.fetch>) =>\n globalThis.fetch(...fetchParams));\n this.toQueryString =\n config?.toQueryString ??\n ((query) => stringify(query, config?.queryStringifyOptions));\n\n this.baseApiParams = {\n credentials: 'same-origin',\n headers: {},\n redirect: 'follow',\n referrerPolicy: 'no-referrer',\n };\n\n this.updateConfig(this.config);\n\n observable.ref(this, 'badResponse');\n observable.ref(this, 'meta');\n\n action(this, 'setMeta');\n action(this, 'setBadResponse');\n\n makeObservable(this);\n }\n\n get baseUrl() {\n return this.config.baseUrl ?? '';\n }\n\n public updateConfig(update: Partial<HttpClientConfig<TMeta>>) {\n Object.assign(this.config, update);\n\n if (update.baseApiParams) {\n Object.assign(this.baseApiParams, update.baseApiParams);\n }\n\n if (update.contentFormatters) {\n Object.assign(this.contentFormatters, update.contentFormatters);\n }\n\n if (update.fetch) {\n this.fetch = update.fetch;\n }\n }\n\n public setMeta = (data: TMeta | null) => {\n this.meta = data;\n };\n\n public setBadResponse = (response: unknown) => {\n this.badResponse = response;\n };\n\n private contentFormatters: Record<string, (input: any) => any> = {\n 'application/json': (input: any) =>\n input !== null && (typeof input === 'object' || typeof input === 'string')\n ? JSON.stringify(input)\n : input,\n 'text/plain': (input: any) =>\n input !== null && typeof input !== 'string'\n ? JSON.stringify(input)\n : input,\n 'multipart/form-data': (input: any) =>\n Object.keys(input || {}).reduce((formData, key) => {\n const property = input[key];\n\n if (property instanceof Blob) {\n formData.append(key, property);\n } else if (typeof property === 'object' && property !== null) {\n formData.append(key, JSON.stringify(property));\n } else {\n formData.append(key, `${property}`);\n }\n\n return formData;\n }, new FormData()),\n 'application/x-www-form-urlencoded': (input: any) =>\n this.toQueryString(input),\n 'application/octet-stream': (input: any) => input,\n };\n\n protected mergeRequestParams(\n params1: RequestParams,\n params2?: RequestParams,\n ): RequestParams {\n return {\n ...this.baseApiParams,\n ...params1,\n ...params2,\n headers: {\n ...this.baseApiParams.headers,\n ...params1.headers,\n ...params2?.headers,\n },\n };\n }\n\n protected async createResponse(\n responseFormat: FullRequestParams['format'],\n raw: Response,\n url: string,\n params: RequestInit,\n ): Promise<AnyHttpResponse> {\n const response = raw as AnyHttpResponse;\n\n response.request = {\n url,\n params,\n };\n response.data = null;\n response.error = null;\n\n if (responseFormat) {\n try {\n const formatted = await response[responseFormat]();\n if (response.ok) {\n response.data = formatted;\n } else {\n response.error = formatted;\n }\n } catch (error) {\n if (response.ok) {\n response.error = error;\n } else {\n response.error = null;\n }\n }\n }\n\n if (!response.ok || response.error) {\n this.setBadResponse(response);\n }\n\n return response;\n }\n\n public buildUrl = (params: FullRequestParams) => {\n const baseUrl = params.baseUrl ?? this.baseUrl ?? '';\n\n const path = params.path;\n\n const queryString = params.query && this.toQueryString(params.query);\n\n const query = queryString ? `?${queryString}` : '';\n\n if (this.config.buildUrl) {\n return this.config.buildUrl(params, { baseUrl, path, query }, this.meta);\n }\n\n const url = baseUrl + path + query;\n\n return url;\n };\n\n public request<T, E>(\n fullParams: FullRequestParams,\n endpoint?: Maybe<AnyEndpoint>,\n ): Promise<HttpResponse<T, E>>;\n public request<THttpResponse extends AnyResponse>(\n fullParams: FullRequestParams,\n endpoint?: Maybe<AnyEndpoint>,\n ): Promise<THttpResponse>;\n\n public async request(\n fullParams: FullRequestParams,\n endpoint?: Maybe<AnyEndpoint>,\n ): Promise<any> {\n this.setBadResponse(null);\n\n const {\n body,\n contentType = 'application/json',\n format = 'json',\n ...params\n } = fullParams;\n\n let requestParams = this.mergeRequestParams(params);\n\n if (this.config.interceptor) {\n requestParams =\n (await this.config.interceptor(requestParams, this.meta, endpoint)) ??\n requestParams;\n }\n\n const payloadFormatter = this.contentFormatters[contentType];\n const responseFormat = format || requestParams.format;\n\n const url = this.buildUrl(fullParams);\n\n let headers: Headers;\n\n if (requestParams.headers instanceof Headers) {\n headers = requestParams.headers;\n } else if (Array.isArray(requestParams.headers)) {\n headers = new Headers(requestParams.headers);\n } else {\n headers = new Headers(requestParams.headers);\n }\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', contentType);\n }\n\n const fetchUrl: string = url;\n const fetchParams: RequestInit = {\n ...requestParams,\n headers,\n body: body == null ? null : payloadFormatter(body),\n };\n\n let response: Response | undefined;\n\n try {\n response = await this.fetch(fetchUrl, fetchParams);\n } catch (error) {\n response = error as Response;\n }\n\n const httpResponse = await this.createResponse(\n responseFormat,\n response,\n fetchUrl,\n fetchParams,\n );\n\n if (!httpResponse.ok || httpResponse.error) {\n throw httpResponse;\n }\n\n return httpResponse;\n }\n}\n"],"names":["Query","makeObservable","observable","params","runInAction","comparer","getMobxAdministration","computed","reaction","uniqKey","callFunction","lazyObserve","InfiniteQuery","Mutation","QueryClient","hashKey","value","filter","stringify","action"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/runtime/endpoint-query.ts","../src/runtime/endpoint-infinite-query.ts","../src/runtime/endpoint-mutation.ts","../src/runtime/http-client.ts","../src/runtime/endpoint.ts","../src/runtime/endpoint-query-client.ts"],"sourcesContent":["/** biome-ignore-all lint/correctness/noUnusedVariables: <explanation> */\nimport type {\n DefaultError,\n QueryFunctionContext,\n QueryObserverResult,\n RefetchOptions,\n} from '@tanstack/query-core';\nimport {\n comparer,\n computed,\n makeObservable,\n observable,\n reaction,\n runInAction,\n} from 'mobx';\nimport { Query, type QueryUpdateOptionsAllVariants } from 'mobx-tanstack-query';\nimport { callFunction } from 'yummies/common';\nimport { getMobxAdministration, lazyObserve } from 'yummies/mobx';\nimport type { AnyObject, Maybe, MaybeFalsy, MaybeFn } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\nimport type {\n EndpointQueryFlattenOptions,\n EndpointQueryOptions,\n EndpointQueryUniqKey,\n ExcludedQueryKeys,\n} from './endpoint-query.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport type { RequestParams } from './http-client.js';\n\ninterface InternalObservableData<TEndpoint extends AnyEndpoint> {\n params: MaybeFalsy<TEndpoint['__params']>;\n uniqKey?: EndpointQueryUniqKey;\n initialized?: boolean;\n dynamicOptions?: any;\n response: TEndpoint['__response'] | null;\n}\n\n/**\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoint-queries/)\n */\nexport class EndpointQuery<\n TEndpoint extends AnyEndpoint,\n TQueryFnData = TEndpoint['__response']['data'],\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n> extends Query<TQueryFnData, TError, TData, TQueryData> {\n private _observableData: InternalObservableData<TEndpoint>;\n\n constructor(\n private endpoint: AnyEndpoint,\n inputQueryClient: EndpointQueryClient,\n queryOptionsInput:\n | EndpointQueryOptions<TEndpoint, TQueryFnData, TError, TData, TQueryData>\n | (() => EndpointQueryFlattenOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TData,\n TQueryData\n >),\n ) {\n const isQueryOptionsInputFn = typeof queryOptionsInput === 'function';\n const unpackedQueryOptionsInput = isQueryOptionsInputFn\n ? queryOptionsInput()\n : queryOptionsInput;\n\n const {\n uniqKey,\n transform: transformResponse,\n params,\n queryClient: overridedQueryClient,\n ...queryOptions\n } = unpackedQueryOptionsInput;\n\n const queryClient = overridedQueryClient ?? inputQueryClient;\n\n const _observableData: InternalObservableData<TEndpoint> = {\n params: null,\n dynamicOptions: undefined,\n response: null,\n uniqKey: unpackedQueryOptionsInput.uniqKey,\n };\n\n if (!isQueryOptionsInputFn && typeof params !== 'function') {\n if ('params' in unpackedQueryOptionsInput) {\n _observableData.params = params;\n } else {\n _observableData.params = {};\n }\n _observableData.initialized = true;\n }\n\n makeObservable(_observableData, {\n params: observable.ref,\n response: observable.ref,\n dynamicOptions: observable,\n });\n\n super({\n ...queryOptions,\n queryClient,\n meta: endpoint.toQueryMeta(queryOptions.meta),\n options: (): any => {\n const builtOptions = buildOptionsFromParams(\n endpoint,\n _observableData.params,\n _observableData.uniqKey,\n );\n\n let isEnabled = !!_observableData.initialized && builtOptions.enabled;\n\n if (\n typeof queryOptionsInput !== 'function' &&\n queryOptionsInput.enabled === false\n ) {\n isEnabled = false;\n }\n\n return {\n ...builtOptions,\n enabled: isEnabled,\n ..._observableData.dynamicOptions,\n };\n },\n queryFn: async (ctx): Promise<any> => {\n const params = endpoint.getParamsFromContext(ctx);\n\n runInAction(() => {\n _observableData.response = null;\n if (!comparer.structural(params, _observableData.params)) {\n _observableData.params = params;\n }\n });\n\n let requestParams = params.requestParams as Maybe<RequestParams>;\n\n if (requestParams) {\n if (!requestParams.signal) {\n requestParams.signal = ctx.signal;\n }\n } else {\n requestParams = { signal: ctx.signal };\n }\n\n const fixedInput = {\n ...params,\n requestParams,\n };\n\n const response = await endpoint.request(fixedInput);\n\n runInAction(() => {\n _observableData.response = response as TEndpoint['__response'];\n });\n\n return (await transformResponse?.(response)) ?? response.data;\n },\n });\n\n const parentAtom = getMobxAdministration(this);\n\n computed.struct(this, 'params');\n computed.struct(this, 'response');\n makeObservable(this);\n\n if (isQueryOptionsInputFn || typeof params === 'function') {\n const createParamsReaction = () =>\n reaction(\n (): Partial<InternalObservableData<TEndpoint>> => {\n let outDynamicOptions: InternalObservableData<TEndpoint>['dynamicOptions'];\n let outParams: MaybeFn<MaybeFalsy<TEndpoint['__params']>>;\n let uniqKey: Maybe<EndpointQueryUniqKey>;\n\n if (isQueryOptionsInputFn) {\n const result = queryOptionsInput();\n const {\n params,\n abortSignal,\n select,\n onDone,\n onError,\n onInit,\n enableOnDemand,\n uniqKey: _uniqKey,\n ...dynamicOptions\n } = result;\n\n uniqKey = _uniqKey;\n\n if ('params' in result) {\n outParams = result.params;\n } else {\n outParams = {};\n }\n\n outDynamicOptions =\n Object.keys(dynamicOptions).length > 0\n ? dynamicOptions\n : undefined;\n } else if ('params' in unpackedQueryOptionsInput) {\n outParams = unpackedQueryOptionsInput.params;\n uniqKey = unpackedQueryOptionsInput.uniqKey;\n } else {\n outParams = {};\n uniqKey = unpackedQueryOptionsInput.uniqKey;\n }\n\n return {\n params: callFunction(outParams),\n dynamicOptions: outDynamicOptions,\n uniqKey,\n };\n },\n ({ params, dynamicOptions, uniqKey }) => {\n runInAction(() => {\n _observableData.initialized = true;\n _observableData.params = params;\n _observableData.dynamicOptions = dynamicOptions;\n _observableData.uniqKey = uniqKey;\n });\n },\n {\n fireImmediately: true,\n },\n );\n\n if (this.features.lazy) {\n lazyObserve({\n property: parentAtom.values_.get('_result'),\n onStart: createParamsReaction,\n onEnd: (disposeFn) => disposeFn(),\n });\n } else {\n this.abortController.signal.addEventListener(\n 'abort',\n createParamsReaction(),\n );\n }\n }\n\n this._observableData = _observableData;\n }\n\n get params() {\n return this._observableData.params;\n }\n\n get response() {\n return this._observableData.response;\n }\n\n update(\n updateParams: Omit<\n QueryUpdateOptionsAllVariants<TQueryFnData, TError, TData, TQueryData>,\n ExcludedQueryKeys\n > & {\n params?: MaybeFalsy<TEndpoint['__params']>;\n },\n ) {\n if ('params' in updateParams) {\n const { params, ...options } = updateParams;\n runInAction(() => {\n this._observableData.params = params;\n });\n return super.update({\n ...buildOptionsFromParams(\n this.endpoint,\n params,\n this._observableData.uniqKey,\n ),\n ...options,\n });\n } else if (this._observableData) {\n return super.update({\n ...buildOptionsFromParams(\n this.endpoint,\n this._observableData.params,\n this._observableData.uniqKey,\n ),\n ...updateParams,\n });\n } else {\n return super.update(updateParams);\n }\n }\n\n refetch(\n options?: RefetchOptions,\n ): Promise<QueryObserverResult<TData, TError>> {\n if (this.params) {\n return super.refetch(options);\n }\n return Promise.resolve(this.queryObserver.getCurrentResult());\n }\n\n async start(\n params: MaybeFalsy<TEndpoint['__params']>,\n ): Promise<QueryObserverResult<TData, TError>> {\n runInAction(() => {\n this._observableData.params = params;\n });\n return await super.start(\n buildOptionsFromParams(\n this.endpoint,\n params,\n this._observableData.uniqKey,\n ),\n );\n }\n\n protected handleDestroy(): void {\n super.handleDestroy();\n runInAction(() => {\n this._observableData.params = undefined;\n this._observableData.dynamicOptions = undefined;\n });\n }\n}\n\nexport const getParamsFromContext = (ctx: QueryFunctionContext<any, any>) => {\n return (ctx.queryKey.at(-2) || {}) as AnyEndpoint['__params'];\n};\n\nexport const buildOptionsFromParams = (\n endpoint: AnyEndpoint,\n params: MaybeFalsy<AnyObject>,\n uniqKey: Maybe<EndpointQueryUniqKey>,\n): { enabled: boolean; queryKey: any[] } => {\n const { requiredParams } = endpoint.configuration;\n let hasRequiredParams = false;\n\n if (requiredParams.length > 0) {\n hasRequiredParams =\n !!params && requiredParams.every((param) => param in params);\n } else {\n hasRequiredParams = !!params;\n }\n\n return {\n enabled: hasRequiredParams,\n queryKey: endpoint.toQueryKey(params || {}, uniqKey),\n };\n};\n","import type {\n DefaultError,\n InfiniteData,\n QueryObserverResult,\n} from '@tanstack/query-core';\nimport { makeObservable, observable, runInAction } from 'mobx';\nimport { InfiniteQuery } from 'mobx-tanstack-query';\nimport type { Maybe, MaybeFalsy } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\nimport type {\n EndpointInfiniteQueryFlattenOptions,\n EndpointInfiniteQueryOptions,\n EndpointInfiniteQueryUpdateOptionsAllVariants,\n} from './endpoint-infinite-query.types.js';\nimport { buildOptionsFromParams } from './endpoint-query.js';\nimport type { EndpointQueryUniqKey } from './endpoint-query.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport type { RequestParams } from './http-client.js';\n\nexport class EndpointInfiniteQuery<\n TEndpoint extends AnyEndpoint,\n TQueryFnData = TEndpoint['__response']['data'],\n TError = DefaultError,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n> extends InfiniteQuery<TQueryFnData, TError, TPageParam, TData, any[]> {\n response: TEndpoint['__response'] | null = null;\n params: TEndpoint['__params'] | null = null;\n\n private uniqKey?: EndpointQueryUniqKey;\n\n private paramsFn: EndpointInfiniteQueryFlattenOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >['params'];\n\n constructor(\n private endpoint: AnyEndpoint,\n queryClient: EndpointQueryClient,\n\n queryOptionsInput:\n | EndpointInfiniteQueryOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >\n | (() => EndpointInfiniteQueryFlattenOptions<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >),\n ) {\n const {\n uniqKey,\n transform: transformResponse,\n params: paramsFn,\n ...queryOptions\n } = typeof queryOptionsInput === 'function'\n ? queryOptionsInput()\n : queryOptionsInput;\n\n super({\n ...queryOptions,\n queryClient,\n meta: endpoint.toQueryMeta(queryOptions.meta),\n options: (query): any => {\n const extraOptions: any = {};\n let willEnableManually: boolean;\n let params: any;\n\n const pageParam = query.options.initialPageParam;\n\n if (typeof queryOptionsInput === 'function') {\n Object.assign(extraOptions, queryOptionsInput());\n params = paramsFn(pageParam);\n willEnableManually = false;\n } else {\n willEnableManually = queryOptionsInput.enabled === false;\n params = paramsFn(pageParam);\n }\n\n const builtOptions = buildOptionsFromParams(endpoint, params, uniqKey);\n // const dynamicOuterOptions = getDynamicOptions?.(query);\n\n let isEnabled = false;\n\n if (willEnableManually) {\n // if (dynamicOuterOptions?.enabled != null) {\n // isEnabled = dynamicOuterOptions.enabled;\n // }\n } else {\n // const outerDynamicEnabled =\n // dynamicOuterOptions?.enabled == null ||\n // !!dynamicOuterOptions.enabled;\n\n // isEnabled = builtOptions.enabled && outerDynamicEnabled;\n isEnabled = builtOptions.enabled;\n }\n\n return {\n ...query.options,\n ...builtOptions,\n // ...dynamicOuterOptions,\n enabled: isEnabled,\n ...extraOptions,\n } as any;\n },\n queryFn: async (ctx): Promise<any> => {\n const params = paramsFn(\n (ctx.pageParam as any) ?? queryOptions.initialPageParam,\n ) as TEndpoint['__params'];\n\n runInAction(() => {\n this.response = null;\n this.params = params;\n });\n\n let requestParams = params.request as Maybe<RequestParams>;\n\n if (requestParams) {\n if (!requestParams.signal) {\n requestParams.signal = ctx.signal;\n }\n } else {\n requestParams = { signal: ctx.signal };\n }\n\n const fixedInput = {\n ...params,\n request: requestParams,\n };\n\n const response = await endpoint.request(fixedInput);\n\n runInAction(() => {\n this.response = response as TEndpoint['__response'];\n });\n\n return (await transformResponse?.(response)) ?? response.data;\n },\n });\n\n this.paramsFn = paramsFn;\n this.uniqKey = uniqKey;\n\n observable.ref(this, 'response');\n observable.ref(this, 'params');\n makeObservable(this);\n }\n\n update({\n params,\n ...options\n }: EndpointInfiniteQueryUpdateOptionsAllVariants<\n TEndpoint,\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >) {\n return super.update({\n ...buildOptionsFromParams(this.endpoint, params, this.uniqKey),\n ...options,\n });\n }\n\n async start(\n params: MaybeFalsy<TEndpoint['__params']>,\n ): Promise<QueryObserverResult<TData, TError>> {\n return await super.start(\n buildOptionsFromParams(this.endpoint, params, this.uniqKey),\n );\n }\n}\n","import { Mutation } from 'mobx-tanstack-query';\nimport type { AnyObject, Maybe } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\nimport type {\n EndpointMutationOptions,\n EndpointMutationParams,\n} from './endpoint-mutation.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport type { InvalidateEndpointsFilters } from './endpoint-query-client.types.js';\nimport type { RequestParams } from './http-client.js';\n\n/**\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoint-mutations/)\n */\nexport class EndpointMutation<\n TEndpoint extends AnyEndpoint,\n TData = unknown,\n TParams extends AnyObject = AnyObject,\n TMutationMeta extends AnyObject | void = void,\n TOnMutateResult = unknown,\n> extends Mutation<\n TData,\n EndpointMutationParams<TParams, TMutationMeta>,\n TEndpoint['__response']['error'],\n TOnMutateResult\n> {\n constructor(\n private endpoint: AnyEndpoint,\n inputQueryClient: EndpointQueryClient,\n {\n transform: transformResponse,\n invalidateEndpoints,\n queryClient: overridedQueryClient,\n ...mutationOptions\n }: EndpointMutationOptions<\n TEndpoint,\n TData,\n TParams,\n TMutationMeta,\n TOnMutateResult\n >,\n ) {\n const queryClient = overridedQueryClient ?? inputQueryClient;\n super({\n ...mutationOptions,\n queryClient,\n onSuccess: (data, variables, onMutateResult, context) => {\n mutationOptions.onSuccess?.(data, variables, onMutateResult, context);\n if (invalidateEndpoints) {\n if (typeof invalidateEndpoints === 'object') {\n queryClient.invalidateEndpoints(invalidateEndpoints);\n } else {\n let filters: Maybe<InvalidateEndpointsFilters>;\n switch (`${invalidateEndpoints}`) {\n case 'true': {\n filters = endpoint.group\n ? {\n group: endpoint.group,\n }\n : {\n tag: endpoint.tags,\n };\n\n break;\n }\n case 'by-group': {\n filters = {\n group: endpoint.group,\n };\n\n break;\n }\n case 'by-tag': {\n filters = {\n tag: endpoint.tags,\n };\n\n break;\n }\n }\n\n if (filters) {\n queryClient.invalidateEndpoints(filters);\n }\n }\n }\n },\n mutationFn: async (input, context) => {\n let requestParams = input?.requestParams as Maybe<RequestParams>;\n\n if (requestParams) {\n if (!requestParams.signal) {\n requestParams.signal = context.signal;\n }\n } else {\n requestParams = { signal: context.signal };\n }\n\n const fixedInput = {\n ...input,\n requestParams,\n };\n\n const response = await endpoint.request(fixedInput);\n return (await transformResponse?.(response)) ?? response.data;\n },\n });\n }\n}\n","import type {\n HttpStatusCode,\n HttpSuccessStatusCode,\n} from 'http-status-code-types';\nimport { action, makeObservable, observable } from 'mobx';\nimport { type BooleanOptional, type IStringifyOptions, stringify } from 'qs';\nimport type { AnyObject, Defined, Maybe, ValueOf } from 'yummies/types';\nimport type { AnyEndpoint } from './endpoint.types.js';\n\nexport type QueryParamsType = Record<string | number, any>;\nexport type ResponseFormat = keyof Omit<Body, 'body' | 'bodyUsed'>;\n\nexport interface FullRequestParams extends Omit<RequestInit, 'body'> {\n /** set parameter to `true` for call `securityWorker` for this request */\n secure?: boolean;\n /** request path */\n path: string;\n /** content type of request body */\n contentType?: string;\n /** query params */\n query?: QueryParamsType;\n /** format of response (i.e. response.json() -> format: \"json\") */\n format?: ResponseFormat;\n /** request body */\n body?: unknown;\n /** base url */\n baseUrl?: string;\n /** meta data */\n meta?: Record<string, any>;\n}\n\nexport type RequestParams = Omit<\n FullRequestParams,\n 'body' | 'method' | 'query' | 'path' | 'serviceName'\n>;\n\nexport interface HttpClientConfig<TMeta = unknown> {\n baseUrl?: string;\n meta?: TMeta;\n fetch?: typeof globalThis.fetch;\n baseApiParams?: Omit<RequestParams, 'baseUrl' | 'cancelToken' | 'signal'>;\n contentFormatters?: Record<string, (input: any) => any>;\n queryStringifyOptions?: IStringifyOptions<BooleanOptional>;\n toQueryString?: (query?: AnyObject) => string;\n buildUrl?: (\n fullParams: FullRequestParams,\n formattedParts: { baseUrl: string; path: string; query: string },\n metadata: TMeta | null,\n ) => string;\n interceptor?: (\n requestParams: RequestParams,\n metadata: TMeta | null,\n endpoint?: Maybe<AnyEndpoint>,\n ) => Promise<RequestParams | void> | RequestParams | void;\n}\n\nexport interface HttpResponse<TData, TError = null, TStatus = number>\n extends Omit<Response, 'status'> {\n data: TData;\n error: TError;\n status: TStatus;\n request: {\n url: string;\n params: globalThis.RequestInit;\n };\n}\n\ntype ResponsesByStatusMap = {\n [K in HttpStatusCode]?: any;\n};\n\nexport type HttpMultistatusResponse<\n TResponsesByStatusMap extends ResponsesByStatusMap,\n TDefaultOkResponse,\n TDefaultBadResponse = unknown,\n> = Omit<Response, 'status'> &\n (\n | ValueOf<{\n [K in keyof TResponsesByStatusMap]: {\n status: K;\n data: K extends HttpSuccessStatusCode\n ? TResponsesByStatusMap[K]\n : TDefaultOkResponse;\n error: K extends HttpSuccessStatusCode\n ? TDefaultBadResponse\n : TResponsesByStatusMap[K];\n request: {\n url: string;\n params: globalThis.RequestInit;\n };\n };\n }>\n | {\n status: Exclude<HttpStatusCode, keyof TResponsesByStatusMap>;\n data: TDefaultOkResponse;\n error: TDefaultBadResponse;\n request: {\n url: string;\n params: globalThis.RequestInit;\n };\n }\n );\n\nexport type GetHttpResponse<T> = T extends (...args: any[]) => infer R\n ? R extends Promise<HttpResponse<any, any>>\n ? Awaited<R>\n : R extends Promise<HttpMultistatusResponse<any, any, any>>\n ? Awaited<R>\n : HttpResponse<any, any>\n : HttpResponse<any, any>;\n\nexport type HttpBadResponse<T = any> = HttpResponse<null, T>;\n\nexport type AnyHttpResponse = HttpResponse<any, any>;\n\nexport type AnyHttpMultistatusResponse = HttpMultistatusResponse<\n ResponsesByStatusMap,\n any,\n any\n>;\n\nexport type AnyResponse = AnyHttpResponse | AnyHttpMultistatusResponse;\n\nexport const isHttpResponse = (\n response: unknown,\n status?: number,\n): response is AnyHttpResponse =>\n !!response &&\n typeof response === 'object' &&\n response instanceof Response &&\n 'data' in response &&\n (!status || response.status === status);\n\nexport const isHttpBadResponse = (\n response: unknown,\n): response is HttpResponse<null, any> => {\n return isHttpResponse(response) && (!response.ok || !!response.error);\n};\n\nexport class HttpClient<TMeta = unknown> {\n private config: HttpClientConfig<TMeta>;\n private fetch: Required<HttpClientConfig<TMeta>>['fetch'];\n\n public meta: TMeta | null;\n public baseApiParams: RequestParams;\n\n badResponse: unknown;\n\n protected toQueryString: Defined<HttpClientConfig<TMeta>['toQueryString']>;\n\n constructor(config?: HttpClientConfig<TMeta>) {\n this.config = config ?? {};\n this.badResponse = null;\n this.meta = config?.meta ?? null;\n this.fetch =\n config?.fetch ??\n ((...fetchParams: Parameters<typeof globalThis.fetch>) =>\n globalThis.fetch(...fetchParams));\n this.toQueryString =\n config?.toQueryString ??\n ((query) => stringify(query, config?.queryStringifyOptions));\n\n this.baseApiParams = {\n credentials: 'same-origin',\n headers: {},\n redirect: 'follow',\n referrerPolicy: 'no-referrer',\n };\n\n this.updateConfig(this.config);\n\n observable.ref(this, 'badResponse');\n observable.ref(this, 'meta');\n\n action(this, 'setMeta');\n action(this, 'setBadResponse');\n\n makeObservable(this);\n }\n\n get baseUrl() {\n return this.config.baseUrl ?? '';\n }\n\n public updateConfig(update: Partial<HttpClientConfig<TMeta>>) {\n Object.assign(this.config, update);\n\n if (update.baseApiParams) {\n Object.assign(this.baseApiParams, update.baseApiParams);\n }\n\n if (update.contentFormatters) {\n Object.assign(this.contentFormatters, update.contentFormatters);\n }\n\n if (update.fetch) {\n this.fetch = update.fetch;\n }\n }\n\n public setMeta = (data: TMeta | null) => {\n this.meta = data;\n };\n\n public setBadResponse = (response: unknown) => {\n this.badResponse = response;\n };\n\n private contentFormatters: Record<string, (input: any) => any> = {\n 'application/json': (input: any) =>\n input !== null && (typeof input === 'object' || typeof input === 'string')\n ? JSON.stringify(input)\n : input,\n 'text/plain': (input: any) =>\n input !== null && typeof input !== 'string'\n ? JSON.stringify(input)\n : input,\n 'multipart/form-data': (input: any) =>\n Object.keys(input || {}).reduce((formData, key) => {\n const property = input[key];\n\n if (property instanceof Blob) {\n formData.append(key, property);\n } else if (typeof property === 'object' && property !== null) {\n formData.append(key, JSON.stringify(property));\n } else {\n formData.append(key, `${property}`);\n }\n\n return formData;\n }, new FormData()),\n 'application/x-www-form-urlencoded': (input: any) =>\n this.toQueryString(input),\n 'application/octet-stream': (input: any) => input,\n };\n\n protected mergeRequestParams(\n params1: RequestParams,\n params2?: RequestParams,\n ): RequestParams {\n return {\n ...this.baseApiParams,\n ...params1,\n ...params2,\n headers: {\n ...this.baseApiParams.headers,\n ...params1.headers,\n ...params2?.headers,\n },\n };\n }\n\n protected async createResponse(\n responseFormat: FullRequestParams['format'],\n raw: Response,\n url: string,\n params: RequestInit,\n ): Promise<AnyHttpResponse> {\n const response = raw as AnyHttpResponse;\n\n response.request = {\n url,\n params,\n };\n response.data = null;\n response.error = null;\n\n if (responseFormat) {\n try {\n const formatted = await response[responseFormat]();\n if (response.ok) {\n response.data = formatted;\n } else {\n response.error = formatted;\n }\n } catch (error) {\n if (response.ok) {\n response.error = error;\n } else {\n response.error = null;\n }\n }\n }\n\n if (!response.ok || response.error) {\n this.setBadResponse(response);\n }\n\n return response;\n }\n\n public buildUrl = (params: FullRequestParams) => {\n const baseUrl = params.baseUrl ?? this.baseUrl ?? '';\n\n const path = params.path;\n\n const queryString = params.query && this.toQueryString(params.query);\n\n const query = queryString ? `?${queryString}` : '';\n\n if (this.config.buildUrl) {\n return this.config.buildUrl(params, { baseUrl, path, query }, this.meta);\n }\n\n const url = baseUrl + path + query;\n\n return url;\n };\n\n public request<T, E>(\n fullParams: FullRequestParams,\n endpoint?: Maybe<AnyEndpoint>,\n ): Promise<HttpResponse<T, E>>;\n public request<THttpResponse extends AnyResponse>(\n fullParams: FullRequestParams,\n endpoint?: Maybe<AnyEndpoint>,\n ): Promise<THttpResponse>;\n\n public async request(\n fullParams: FullRequestParams,\n endpoint?: Maybe<AnyEndpoint>,\n ): Promise<any> {\n this.setBadResponse(null);\n\n const {\n body,\n contentType = 'application/json',\n format = 'json',\n ...params\n } = fullParams;\n\n let requestParams = this.mergeRequestParams(params);\n\n if (this.config.interceptor) {\n requestParams =\n (await this.config.interceptor(requestParams, this.meta, endpoint)) ??\n requestParams;\n }\n\n const payloadFormatter = this.contentFormatters[contentType];\n const responseFormat = format || requestParams.format;\n\n const url = this.buildUrl(fullParams);\n\n let headers: Headers;\n\n if (requestParams.headers instanceof Headers) {\n headers = requestParams.headers;\n } else if (Array.isArray(requestParams.headers)) {\n headers = new Headers(requestParams.headers);\n } else {\n headers = new Headers(requestParams.headers);\n }\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', contentType);\n }\n\n const fetchUrl: string = url;\n const fetchParams: RequestInit = {\n ...requestParams,\n headers,\n body: body == null ? null : payloadFormatter(body),\n };\n\n let response: Response | undefined;\n\n try {\n response = await this.fetch(fetchUrl, fetchParams);\n } catch (error) {\n response = error as Response;\n }\n\n const httpResponse = await this.createResponse(\n responseFormat,\n response,\n fetchUrl,\n fetchParams,\n );\n\n if (!httpResponse.ok || httpResponse.error) {\n throw httpResponse;\n }\n\n return httpResponse;\n }\n}\n","/** biome-ignore-all lint/style/useShorthandFunctionType: this is special trick to add typings for callable class instance */\nimport type {\n DefaultError,\n InvalidateOptions,\n InvalidateQueryFilters,\n QueryFunctionContext,\n QueryKey,\n} from '@tanstack/query-core';\nimport type { HttpStatusCode } from 'http-status-code-types';\nimport type { IQueryClientCore } from 'mobx-tanstack-query';\nimport { callFunction } from 'yummies/common';\nimport type { AnyObject, Defined, IsPartial, Maybe } from 'yummies/types';\nimport type {\n EndpointConfiguration,\n EndpointMutationPresets,\n} from './endpoint.types.js';\nimport { EndpointInfiniteQuery } from './endpoint-infinite-query.js';\nimport type {\n EndpointInfiniteQueryFlattenOptions,\n EndpointInfiniteQueryOptions,\n} from './endpoint-infinite-query.types.js';\nimport { EndpointMutation } from './endpoint-mutation.js';\nimport type { EndpointMutationOptions } from './endpoint-mutation.types.js';\nimport { EndpointQuery } from './endpoint-query.js';\nimport type {\n EndpointQueryFlattenOptions,\n EndpointQueryMeta,\n EndpointQueryOptions,\n EndpointQueryUniqKey,\n} from './endpoint-query.types.js';\nimport type { EndpointQueryClient } from './endpoint-query-client.js';\nimport {\n type AnyResponse,\n type HttpClient,\n isHttpResponse,\n} from './http-client.js';\n\nexport interface Endpoint<\n TResponse extends AnyResponse,\n TParams extends AnyObject,\n TMetaData extends AnyObject = AnyObject,\n> {\n (\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ): ReturnType<Endpoint<TResponse, TParams, TMetaData>['request']>;\n}\n\n/**\n * This class is a wrapper for your http request.\n *\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoints/)\n */\nexport class Endpoint<\n TResponse extends AnyResponse,\n TParams extends AnyObject,\n TMetaData extends AnyObject = AnyObject,\n> {\n endpointId: string;\n\n presets: {\n mutations: EndpointMutationPresets;\n } = {\n mutations: {},\n };\n\n __params!: TParams;\n __response!: TResponse;\n\n meta!: TMetaData;\n\n constructor(\n public configuration: EndpointConfiguration<NoInfer<TParams>, TMetaData>,\n public queryClient: EndpointQueryClient,\n public httpClient: HttpClient,\n ) {\n this.endpointId = globalThis.crypto.randomUUID();\n this.meta = configuration.meta ?? ({} as TMetaData);\n // Сохраняем оригинальный инстанс\n const instance = this;\n\n // Создаем функцию-обертку\n const callable = function (\n this: any,\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ) {\n return instance.request.apply(instance, args);\n } as unknown as Endpoint<TResponse, TParams, TMetaData>;\n\n // Копируем прототип\n Object.setPrototypeOf(callable, new.target.prototype);\n\n // Копируем методы из оригинального инстанса\n Object.getOwnPropertyNames(instance)\n .concat(Object.getOwnPropertyNames(new.target.prototype))\n .forEach((key) => {\n if (key === 'constructor') return;\n const desc =\n Object.getOwnPropertyDescriptor(instance, key) ||\n Object.getOwnPropertyDescriptor(new.target.prototype, key);\n if (desc) Object.defineProperty(callable, key, desc);\n });\n\n // biome-ignore lint/correctness/noConstructorReturn: this is special trick to add typings for callable class instance\n return callable;\n }\n\n getFullUrl(\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ): string {\n const params = this.configuration.params(args[0] ?? ({} as TParams));\n return this.httpClient.buildUrl(params);\n }\n\n getPath(\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ): string {\n const params = this.configuration.params(args[0] ?? ({} as TParams));\n return params.path;\n }\n\n getParamsFromContext<\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n >(\n ctx: Omit<QueryFunctionContext<TQueryKey, TPageParam>, 'client'> & {\n client: IQueryClientCore;\n },\n ): TParams {\n return (ctx.queryKey.at(-2) || {}) as TParams;\n }\n\n get tags() {\n return this.configuration.tags;\n }\n\n get path() {\n return this.configuration.path;\n }\n\n get pathDeclaration() {\n return this.path.join('/');\n }\n\n get operationId() {\n return this.configuration.operationId;\n }\n\n get group() {\n return this.configuration.group;\n }\n\n get namespace() {\n return this.configuration.namespace;\n }\n\n checkResponse<TStatus extends HttpStatusCode>(\n response: unknown,\n status: TStatus,\n ): response is Extract<TResponse, { status: TStatus }>;\n checkResponse(response: unknown): response is TResponse;\n checkResponse(response: unknown, status?: HttpStatusCode) {\n return isHttpResponse(response, status);\n }\n\n request(\n ...args: IsPartial<TParams> extends true\n ? [params?: Maybe<TParams>]\n : [params: TParams]\n ) {\n return this.httpClient.request<TResponse>(\n this.configuration.params(args[0] ?? ({} as TParams)),\n this,\n );\n }\n\n toQueryMeta = (meta?: AnyObject) =>\n ({\n ...meta,\n tags: this.tags,\n operationId: this.operationId,\n path: this.path,\n pathDeclaration: this.pathDeclaration,\n endpointId: this.endpointId,\n endpointQuery: true,\n }) satisfies EndpointQueryMeta;\n\n toQueryKey(params?: Maybe<TParams>, uniqKey?: EndpointQueryUniqKey): any {\n return [\n ...this.configuration.path,\n this.configuration.operationId,\n params ?? {},\n callFunction(uniqKey),\n ];\n }\n\n toInfiniteQueryKey(\n params?: Maybe<TParams>,\n uniqKey?: EndpointQueryUniqKey,\n ): any {\n return [\n { infiniteQuery: true },\n ...this.configuration.path,\n this.configuration.operationId,\n params ?? {},\n callFunction(uniqKey),\n ];\n }\n\n invalidateQuery(\n ...args: IsPartial<TParams> extends true\n ? [\n params?: Maybe<TParams>,\n filters?: InvalidateQueryFilters & { uniqKey?: EndpointQueryUniqKey },\n options?: InvalidateOptions,\n ]\n : [\n params: TParams,\n filters?: InvalidateQueryFilters & { uniqKey?: EndpointQueryUniqKey },\n options?: InvalidateOptions,\n ]\n ) {\n this.queryClient.invalidateQueries(\n {\n queryKey: this.toQueryKey(args[0], args[1]?.uniqKey),\n exact: true,\n ...(args[1] as any),\n },\n args[2],\n );\n }\n\n toMutation<\n TData = TResponse['data'],\n TMutationMeta extends AnyObject | void = void,\n TContext = unknown,\n >(\n options: EndpointMutationOptions<\n this,\n TData,\n TParams,\n TMutationMeta,\n TContext\n >,\n ) {\n return new EndpointMutation<this, TData, TParams, TMutationMeta, TContext>(\n this,\n this.queryClient,\n {\n ...options,\n invalidateEndpoints:\n options.invalidateEndpoints ??\n this.presets.mutations?.invalidateQueries,\n },\n );\n }\n\n toQuery<\n TQueryFnData = TResponse['data'],\n TError = DefaultError | Defined<TResponse['error']>,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n >(\n options:\n | EndpointQueryOptions<this, TQueryFnData, TError, TData, TQueryData>\n | (() => EndpointQueryFlattenOptions<\n this,\n TQueryFnData,\n TError,\n TData,\n TQueryData\n >),\n ) {\n return new EndpointQuery<this, TQueryFnData, TError, TData, TQueryData>(\n this,\n this.queryClient,\n options,\n );\n }\n\n toInfiniteQuery<\n TData = TResponse['data'],\n TError = DefaultError,\n TPageParam = unknown,\n >(\n options:\n | EndpointInfiniteQueryOptions<this, TData, TError, TPageParam>\n | (() => EndpointInfiniteQueryFlattenOptions<\n this,\n TData,\n TError,\n TPageParam\n >),\n ) {\n return new EndpointInfiniteQuery<this, TData, TError, TPageParam>(\n this,\n this.queryClient,\n options,\n );\n }\n}\n","import { hashKey, type InvalidateOptions } from '@tanstack/query-core';\nimport { QueryClient, type QueryClientConfig } from 'mobx-tanstack-query';\nimport type { Maybe } from 'yummies/types';\nimport type { EndpointQueryMeta } from './endpoint-query.types.js';\nimport type {\n EndpointStringFilter,\n InvalidateEndpointsFilters,\n} from './endpoint-query-client.types.js';\n\n/**\n * Class that extends `QueryClient` and gives a bit more control over endpoint queries and mutations.\n *\n * [**Documentation**](https://js2me.github.io/mobx-tanstack-query-api/endpoint-query-client/)\n */\nexport class EndpointQueryClient extends QueryClient {\n constructor(config?: QueryClientConfig) {\n super({\n ...config,\n defaultOptions: {\n ...config?.defaultOptions,\n queries: {\n ...config?.defaultOptions?.queries,\n queryKeyHashFn:\n config?.defaultOptions?.queries?.queryKeyHashFn ?? hashKey,\n },\n },\n });\n }\n\n invalidateEndpoints(\n {\n group,\n namespace,\n operationId,\n tag,\n predicate,\n endpoint,\n ...queryFilters\n }: InvalidateEndpointsFilters,\n options?: InvalidateOptions,\n ) {\n let endpointIdsToFilter: Maybe<Set<string>>;\n\n if (Array.isArray(endpoint)) {\n endpointIdsToFilter = new Set(endpoint.map((it) => it.endpointId));\n } else if (endpoint) {\n endpointIdsToFilter = new Set([endpoint.endpointId]);\n }\n\n return this.invalidateQueries(\n {\n ...queryFilters,\n predicate: (query) => {\n if (!query.meta?.endpointQuery) {\n return false;\n }\n\n const meta = query.meta as unknown as EndpointQueryMeta;\n\n if (\n endpointIdsToFilter &&\n !endpointIdsToFilter.has(meta.endpointId)\n ) {\n return false;\n }\n\n if (\n namespace &&\n meta.namespace &&\n !applyStringFilter(namespace, meta.namespace)\n ) {\n return false;\n }\n\n if (group && meta.group && !applyStringFilter(group, meta.group)) {\n return false;\n }\n\n if (tag && meta.tags && !applyStringFilter(tag, meta.tags)) {\n return false;\n }\n\n if (tag && meta.tags && !applyStringFilter(tag, meta.tags)) {\n return false;\n }\n\n if (\n operationId &&\n !applyStringFilter(operationId, meta.operationId)\n ) {\n return false;\n }\n\n if (predicate && !predicate(meta, query as any)) {\n return false;\n }\n\n return true;\n },\n },\n options,\n );\n }\n}\n\nconst applyStringFilter = (\n filter: EndpointStringFilter,\n value: string | string[],\n): boolean => {\n const values = Array.isArray(value) ? value : [value];\n\n if (filter instanceof RegExp) {\n return values.some((value) => filter.test(value));\n }\n\n if (Array.isArray(filter)) {\n return filter.some((filter) => values.includes(filter));\n }\n\n return values.includes(filter);\n};\n"],"names":["Query","makeObservable","observable","params","runInAction","comparer","getMobxAdministration","computed","reaction","uniqKey","callFunction","lazyObserve","InfiniteQuery","Mutation","stringify","action","QueryClient","hashKey","value","filter"],"mappings":"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"}