@mittwald/api-client-commons 4.0.1 → 4.1.0-alpha.1

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.
@@ -1,8 +1,34 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
2
28
  Object.defineProperty(exports, "__esModule", { value: true });
3
29
  exports.ApiClientBase = void 0;
4
- const axios_1 = require("axios");
5
- const Request_js_1 = require("./Request.js");
30
+ const axios_1 = __importStar(require("axios"));
31
+ const Request_js_1 = __importDefault(require("./Request.js"));
6
32
  class ApiClientBase {
7
33
  constructor(axiosConfig = axios_1.default) {
8
34
  this.axios =
@@ -1,10 +1,11 @@
1
- import { OpenAPIOperation, RequestConfig, ResponsePromise } from "../types/index.js";
2
- import { AxiosInstance } from "axios";
1
+ import { OpenAPIOperation, RequestObject, ResponsePromise } from "../types/index.js";
2
+ import { AxiosInstance, AxiosRequestConfig } from "axios";
3
3
  export declare class Request<TOp extends OpenAPIOperation> {
4
4
  private readonly axios;
5
5
  private readonly operationDescriptor;
6
- private readonly config?;
7
- constructor(axiosInstance: AxiosInstance, operationDescriptor: TOp, config?: RequestConfig<TOp>);
6
+ private readonly requestObject?;
7
+ readonly requestConfig: AxiosRequestConfig;
8
+ constructor(axiosInstance: AxiosInstance, operationDescriptor: TOp, request?: RequestObject<TOp>);
8
9
  execute(): ResponsePromise<TOp>;
9
10
  private buildAxiosConfig;
10
11
  private makeAxiosHeaders;
@@ -1,28 +1,36 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.Request = void 0;
4
- const OpenAPIPath_js_1 = require("./OpenAPIPath.js");
7
+ const OpenAPIPath_js_1 = __importDefault(require("./OpenAPIPath.js"));
5
8
  class Request {
6
- constructor(axiosInstance, operationDescriptor, config) {
9
+ constructor(axiosInstance, operationDescriptor, request) {
7
10
  this.axios = axiosInstance;
8
11
  this.operationDescriptor = operationDescriptor;
9
- this.config = config;
12
+ this.requestObject = request;
13
+ this.requestConfig = Object.freeze(this.buildAxiosConfig());
10
14
  }
11
15
  execute() {
12
- return this.axios.request(this.buildAxiosConfig());
16
+ return this.axios.request(this.requestConfig);
13
17
  }
14
18
  buildAxiosConfig() {
15
19
  const { method, path } = this.operationDescriptor;
16
- const pathParameters = this.config;
20
+ const pathParameters = this.requestObject;
17
21
  const openApiPath = new OpenAPIPath_js_1.default(path, pathParameters);
18
22
  const url = openApiPath.buildUrl();
19
- const data = this.config && "data" in this.config ? this.config.data : undefined;
20
- const headersConfig = this.config && "headers" in this.config ? this.config.headers : undefined;
23
+ const data = this.requestObject && "data" in this.requestObject
24
+ ? this.requestObject.data
25
+ : undefined;
26
+ const headersConfig = this.requestObject && "headers" in this.requestObject
27
+ ? this.requestObject.headers
28
+ : undefined;
21
29
  const headers = headersConfig
22
30
  ? this.makeAxiosHeaders(headersConfig)
23
31
  : undefined;
24
- const queryParametersConfig = this.config && "queryParameters" in this.config
25
- ? this.config.queryParameters
32
+ const queryParametersConfig = this.requestObject && "queryParameters" in this.requestObject
33
+ ? this.requestObject.queryParameters
26
34
  : undefined;
27
35
  const params = this.convertQueryToUrlSearchParams(queryParametersConfig);
28
36
  return {
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const Request_js_1 = require("./Request.js");
6
+ const Request_js_1 = __importDefault(require("./Request.js"));
4
7
  const globals_1 = require("@jest/globals");
5
8
  const requestFn = globals_1.jest.fn();
6
9
  const mockedAxios = {
@@ -0,0 +1,10 @@
1
+ import { AsyncResource } from "@mittwald/react-use-promise";
2
+ import { InferredResponseType, OpenAPIOperation, RequestObject } from "../types/index.js";
3
+ import { AxiosInstance } from "axios";
4
+ type GetApiResourceFn<TOp extends OpenAPIOperation> = null extends RequestObject<TOp> ? (conf?: RequestObject<TOp>) => AsyncResource<InferredResponseType<TOp>> : (conf: RequestObject<TOp>) => AsyncResource<InferredResponseType<TOp>>;
5
+ export declare const getAsyncResourceFactory: <TOp extends OpenAPIOperation<{
6
+ headers?: Partial<{
7
+ [TKey: string]: (string | number | boolean) | (string | number | boolean)[];
8
+ }> | undefined;
9
+ }, import("../types/Response.js").Response>>(axios: AxiosInstance, op: TOp) => GetApiResourceFn<TOp>;
10
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getAsyncResourceFactory = void 0;
7
+ const react_use_promise_1 = require("@mittwald/react-use-promise");
8
+ const Request_js_1 = __importDefault(require("../core/Request.js"));
9
+ const prefix = "@mittwald/api-client/";
10
+ const getAsyncResourceFactory = (axios, op) => ((requestObj) => {
11
+ const request = new Request_js_1.default(axios, op, requestObj);
12
+ const url = request.requestConfig.url;
13
+ const loaderId = prefix + op.operationId;
14
+ const tags = [loaderId, prefix + op.method];
15
+ if (url) {
16
+ tags.push(prefix + url);
17
+ }
18
+ return (0, react_use_promise_1.getAsyncResource)((ignored) => request.execute(), [requestObj], {
19
+ tags,
20
+ loaderId,
21
+ });
22
+ });
23
+ exports.getAsyncResourceFactory = getAsyncResourceFactory;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const getAsyncResourceFactory_js_1 = require("./getAsyncResourceFactory.js");
4
+ const getStuff = (0, getAsyncResourceFactory_js_1.getAsyncResourceFactory)({}, {
5
+ operationId: "getStuff",
6
+ path: "/stuff",
7
+ method: "GET",
8
+ });
9
+ function ignoredCheckRequestType() {
10
+ getStuff({
11
+ data: {
12
+ // @ts-expect-error Not matching request type
13
+ foo: "",
14
+ },
15
+ });
16
+ getStuff({
17
+ data: {
18
+ requestString: "",
19
+ },
20
+ });
21
+ }
22
+ function ignoredCheckResponseType() {
23
+ const stuff = getStuff({
24
+ data: {
25
+ requestString: "",
26
+ },
27
+ }).watch();
28
+ // @ts-expect-error error
29
+ if (stuff.status === 42) {
30
+ // must be 200
31
+ }
32
+ // @ts-expect-error Accessing unknown prop
33
+ stuff.data.foo;
34
+ (function (ignored) {
35
+ // @ts-expect-error is a number
36
+ })(stuff.data.responseNumber);
37
+ (function (ignored) {
38
+ // is number
39
+ })(stuff.data.responseNumber);
40
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const globals_1 = require("@jest/globals");
13
+ const getAsyncResourceFactory_js_1 = require("./getAsyncResourceFactory.js");
14
+ const react_use_promise_1 = require("@mittwald/react-use-promise");
15
+ (0, globals_1.beforeEach)(() => {
16
+ (0, react_use_promise_1.refresh)();
17
+ globals_1.jest.resetAllMocks();
18
+ });
19
+ const requestMock = globals_1.jest.fn();
20
+ const axios = { request: requestMock };
21
+ const getStuff = (0, getAsyncResourceFactory_js_1.getAsyncResourceFactory)(axios, {
22
+ operationId: "getStuff",
23
+ path: "/stuff",
24
+ method: "GET",
25
+ });
26
+ const testRequest1 = {
27
+ data: {
28
+ foo: "bar",
29
+ },
30
+ };
31
+ const testRequest2 = {
32
+ data: {
33
+ foo: "baz",
34
+ },
35
+ };
36
+ test("Resource loader executes request", () => __awaiter(void 0, void 0, void 0, function* () {
37
+ yield getStuff(testRequest1).load();
38
+ (0, globals_1.expect)(requestMock).toHaveBeenCalledTimes(1);
39
+ const firstRequestParams = requestMock.mock.calls[0][0];
40
+ (0, globals_1.expect)(firstRequestParams).toMatchObject({
41
+ method: "GET",
42
+ url: "stuff",
43
+ });
44
+ }));
45
+ test("Resource is cached under URL", () => __awaiter(void 0, void 0, void 0, function* () {
46
+ yield getStuff(testRequest1).load();
47
+ (0, globals_1.expect)(requestMock).toHaveBeenCalledTimes(1);
48
+ yield getStuff(testRequest1).load();
49
+ (0, globals_1.expect)(requestMock).toHaveBeenCalledTimes(1);
50
+ (0, react_use_promise_1.refresh)({
51
+ tag: "@mittwald/api-client/stuff",
52
+ });
53
+ yield getStuff(testRequest1).load();
54
+ (0, globals_1.expect)(requestMock).toHaveBeenCalledTimes(2);
55
+ }));
56
+ test("Resources are different when request object changes", () => __awaiter(void 0, void 0, void 0, function* () {
57
+ yield getStuff(testRequest1).load();
58
+ (0, globals_1.expect)(requestMock).toHaveBeenCalledTimes(1);
59
+ yield getStuff(testRequest2).load();
60
+ (0, globals_1.expect)(requestMock).toHaveBeenCalledTimes(2);
61
+ }));
@@ -0,0 +1 @@
1
+ export * from "./getAsyncResourceFactory.js";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./getAsyncResourceFactory.js"), exports);
@@ -3,9 +3,9 @@ import { NullableOnNoRequiredKeysDeep } from "./NullableOnNoRequiredKeysDeep.js"
3
3
  type UnboxPathParameters<T> = T extends {
4
4
  pathParameters: infer TPath;
5
5
  } ? Omit<T, "pathParameters"> & TPath : T;
6
- export type RequestConfig<TOp extends OpenAPIOperation> = NullableOnNoRequiredKeysDeep<UnboxPathParameters<InferredRequestType<TOp>>>;
6
+ export type RequestObject<TOp extends OpenAPIOperation> = NullableOnNoRequiredKeysDeep<UnboxPathParameters<InferredRequestType<TOp>>>;
7
7
  export type ResponsePromise<TOp extends OpenAPIOperation> = Promise<InferredResponseType<TOp>>;
8
- type RequestFunctionWithOptionalRequest<TOp extends OpenAPIOperation> = (request?: RequestConfig<TOp>) => ResponsePromise<TOp>;
9
- type RequestFunctionWithRequiredRequest<TOp extends OpenAPIOperation> = (request: RequestConfig<TOp>) => ResponsePromise<TOp>;
10
- export type RequestFunction<TOp extends OpenAPIOperation> = null extends RequestConfig<TOp> ? RequestFunctionWithOptionalRequest<TOp> : RequestFunctionWithRequiredRequest<TOp>;
8
+ type RequestFunctionWithOptionalRequest<TOp extends OpenAPIOperation> = (request?: RequestObject<TOp>) => ResponsePromise<TOp>;
9
+ type RequestFunctionWithRequiredRequest<TOp extends OpenAPIOperation> = (request: RequestObject<TOp>) => ResponsePromise<TOp>;
10
+ export type RequestFunction<TOp extends OpenAPIOperation> = null extends RequestObject<TOp> ? RequestFunctionWithOptionalRequest<TOp> : RequestFunctionWithRequiredRequest<TOp>;
11
11
  export {};
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.assertStatus = void 0;
4
- const ApiClientError_js_1 = require("../core/ApiClientError.js");
7
+ const ApiClientError_js_1 = __importDefault(require("../core/ApiClientError.js"));
5
8
  function assertStatus(response, expectedStatus) {
6
9
  if (response.status !== expectedStatus) {
7
10
  throw ApiClientError_js_1.default.fromResponse(`Unexpected response status (expected ${expectedStatus}, got: ${response.status})`, response);
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const tsd_1 = require("tsd");
4
- const assertStatus_js_1 = require("./assertStatus.js");
7
+ const assertStatus_js_1 = __importDefault(require("./assertStatus.js"));
5
8
  function ignoredTestAssertStatusAssertsAlsoTheCorrectResponseType() {
6
9
  (0, assertStatus_js_1.default)(someResponse, 200);
7
10
  (0, tsd_1.expectAssignable)(someResponse);
@@ -1,10 +1,11 @@
1
- import { OpenAPIOperation, RequestConfig, ResponsePromise } from "../types/index.js";
2
- import { AxiosInstance } from "axios";
1
+ import { OpenAPIOperation, RequestObject, ResponsePromise } from "../types/index.js";
2
+ import { AxiosInstance, AxiosRequestConfig } from "axios";
3
3
  export declare class Request<TOp extends OpenAPIOperation> {
4
4
  private readonly axios;
5
5
  private readonly operationDescriptor;
6
- private readonly config?;
7
- constructor(axiosInstance: AxiosInstance, operationDescriptor: TOp, config?: RequestConfig<TOp>);
6
+ private readonly requestObject?;
7
+ readonly requestConfig: AxiosRequestConfig;
8
+ constructor(axiosInstance: AxiosInstance, operationDescriptor: TOp, request?: RequestObject<TOp>);
8
9
  execute(): ResponsePromise<TOp>;
9
10
  private buildAxiosConfig;
10
11
  private makeAxiosHeaders;
@@ -2,27 +2,33 @@ import OpenAPIPath from "./OpenAPIPath.js";
2
2
  export class Request {
3
3
  axios;
4
4
  operationDescriptor;
5
- config;
6
- constructor(axiosInstance, operationDescriptor, config) {
5
+ requestObject;
6
+ requestConfig;
7
+ constructor(axiosInstance, operationDescriptor, request) {
7
8
  this.axios = axiosInstance;
8
9
  this.operationDescriptor = operationDescriptor;
9
- this.config = config;
10
+ this.requestObject = request;
11
+ this.requestConfig = Object.freeze(this.buildAxiosConfig());
10
12
  }
11
13
  execute() {
12
- return this.axios.request(this.buildAxiosConfig());
14
+ return this.axios.request(this.requestConfig);
13
15
  }
14
16
  buildAxiosConfig() {
15
17
  const { method, path } = this.operationDescriptor;
16
- const pathParameters = this.config;
18
+ const pathParameters = this.requestObject;
17
19
  const openApiPath = new OpenAPIPath(path, pathParameters);
18
20
  const url = openApiPath.buildUrl();
19
- const data = this.config && "data" in this.config ? this.config.data : undefined;
20
- const headersConfig = this.config && "headers" in this.config ? this.config.headers : undefined;
21
+ const data = this.requestObject && "data" in this.requestObject
22
+ ? this.requestObject.data
23
+ : undefined;
24
+ const headersConfig = this.requestObject && "headers" in this.requestObject
25
+ ? this.requestObject.headers
26
+ : undefined;
21
27
  const headers = headersConfig
22
28
  ? this.makeAxiosHeaders(headersConfig)
23
29
  : undefined;
24
- const queryParametersConfig = this.config && "queryParameters" in this.config
25
- ? this.config.queryParameters
30
+ const queryParametersConfig = this.requestObject && "queryParameters" in this.requestObject
31
+ ? this.requestObject.queryParameters
26
32
  : undefined;
27
33
  const params = this.convertQueryToUrlSearchParams(queryParametersConfig);
28
34
  return {
@@ -0,0 +1,10 @@
1
+ import { AsyncResource } from "@mittwald/react-use-promise";
2
+ import { InferredResponseType, OpenAPIOperation, RequestObject } from "../types/index.js";
3
+ import { AxiosInstance } from "axios";
4
+ type GetApiResourceFn<TOp extends OpenAPIOperation> = null extends RequestObject<TOp> ? (conf?: RequestObject<TOp>) => AsyncResource<InferredResponseType<TOp>> : (conf: RequestObject<TOp>) => AsyncResource<InferredResponseType<TOp>>;
5
+ export declare const getAsyncResourceFactory: <TOp extends OpenAPIOperation<{
6
+ headers?: Partial<{
7
+ [TKey: string]: (string | number | boolean) | (string | number | boolean)[];
8
+ }> | undefined;
9
+ }, import("../types/Response.js").Response>>(axios: AxiosInstance, op: TOp) => GetApiResourceFn<TOp>;
10
+ export {};
@@ -0,0 +1,16 @@
1
+ import { getAsyncResource } from "@mittwald/react-use-promise";
2
+ import Request from "../core/Request.js";
3
+ const prefix = "@mittwald/api-client/";
4
+ export const getAsyncResourceFactory = (axios, op) => ((requestObj) => {
5
+ const request = new Request(axios, op, requestObj);
6
+ const url = request.requestConfig.url;
7
+ const loaderId = prefix + op.operationId;
8
+ const tags = [loaderId, prefix + op.method];
9
+ if (url) {
10
+ tags.push(prefix + url);
11
+ }
12
+ return getAsyncResource((ignored) => request.execute(), [requestObj], {
13
+ tags,
14
+ loaderId,
15
+ });
16
+ });
@@ -0,0 +1,38 @@
1
+ import { getAsyncResourceFactory } from "./getAsyncResourceFactory.js";
2
+ const getStuff = getAsyncResourceFactory({}, {
3
+ operationId: "getStuff",
4
+ path: "/stuff",
5
+ method: "GET",
6
+ });
7
+ function ignoredCheckRequestType() {
8
+ getStuff({
9
+ data: {
10
+ // @ts-expect-error Not matching request type
11
+ foo: "",
12
+ },
13
+ });
14
+ getStuff({
15
+ data: {
16
+ requestString: "",
17
+ },
18
+ });
19
+ }
20
+ function ignoredCheckResponseType() {
21
+ const stuff = getStuff({
22
+ data: {
23
+ requestString: "",
24
+ },
25
+ }).watch();
26
+ // @ts-expect-error error
27
+ if (stuff.status === 42) {
28
+ // must be 200
29
+ }
30
+ // @ts-expect-error Accessing unknown prop
31
+ stuff.data.foo;
32
+ (function (ignored) {
33
+ // @ts-expect-error is a number
34
+ })(stuff.data.responseNumber);
35
+ (function (ignored) {
36
+ // is number
37
+ })(stuff.data.responseNumber);
38
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ import { beforeEach, expect, jest } from "@jest/globals";
2
+ import { getAsyncResourceFactory } from "./getAsyncResourceFactory.js";
3
+ import { refresh } from "@mittwald/react-use-promise";
4
+ beforeEach(() => {
5
+ refresh();
6
+ jest.resetAllMocks();
7
+ });
8
+ const requestMock = jest.fn();
9
+ const axios = { request: requestMock };
10
+ const getStuff = getAsyncResourceFactory(axios, {
11
+ operationId: "getStuff",
12
+ path: "/stuff",
13
+ method: "GET",
14
+ });
15
+ const testRequest1 = {
16
+ data: {
17
+ foo: "bar",
18
+ },
19
+ };
20
+ const testRequest2 = {
21
+ data: {
22
+ foo: "baz",
23
+ },
24
+ };
25
+ test("Resource loader executes request", async () => {
26
+ await getStuff(testRequest1).load();
27
+ expect(requestMock).toHaveBeenCalledTimes(1);
28
+ const firstRequestParams = requestMock.mock.calls[0][0];
29
+ expect(firstRequestParams).toMatchObject({
30
+ method: "GET",
31
+ url: "stuff",
32
+ });
33
+ });
34
+ test("Resource is cached under URL", async () => {
35
+ await getStuff(testRequest1).load();
36
+ expect(requestMock).toHaveBeenCalledTimes(1);
37
+ await getStuff(testRequest1).load();
38
+ expect(requestMock).toHaveBeenCalledTimes(1);
39
+ refresh({
40
+ tag: "@mittwald/api-client/stuff",
41
+ });
42
+ await getStuff(testRequest1).load();
43
+ expect(requestMock).toHaveBeenCalledTimes(2);
44
+ });
45
+ test("Resources are different when request object changes", async () => {
46
+ await getStuff(testRequest1).load();
47
+ expect(requestMock).toHaveBeenCalledTimes(1);
48
+ await getStuff(testRequest2).load();
49
+ expect(requestMock).toHaveBeenCalledTimes(2);
50
+ });
@@ -0,0 +1 @@
1
+ export * from "./getAsyncResourceFactory.js";
@@ -0,0 +1 @@
1
+ export * from "./getAsyncResourceFactory.js";
@@ -3,9 +3,9 @@ import { NullableOnNoRequiredKeysDeep } from "./NullableOnNoRequiredKeysDeep.js"
3
3
  type UnboxPathParameters<T> = T extends {
4
4
  pathParameters: infer TPath;
5
5
  } ? Omit<T, "pathParameters"> & TPath : T;
6
- export type RequestConfig<TOp extends OpenAPIOperation> = NullableOnNoRequiredKeysDeep<UnboxPathParameters<InferredRequestType<TOp>>>;
6
+ export type RequestObject<TOp extends OpenAPIOperation> = NullableOnNoRequiredKeysDeep<UnboxPathParameters<InferredRequestType<TOp>>>;
7
7
  export type ResponsePromise<TOp extends OpenAPIOperation> = Promise<InferredResponseType<TOp>>;
8
- type RequestFunctionWithOptionalRequest<TOp extends OpenAPIOperation> = (request?: RequestConfig<TOp>) => ResponsePromise<TOp>;
9
- type RequestFunctionWithRequiredRequest<TOp extends OpenAPIOperation> = (request: RequestConfig<TOp>) => ResponsePromise<TOp>;
10
- export type RequestFunction<TOp extends OpenAPIOperation> = null extends RequestConfig<TOp> ? RequestFunctionWithOptionalRequest<TOp> : RequestFunctionWithRequiredRequest<TOp>;
8
+ type RequestFunctionWithOptionalRequest<TOp extends OpenAPIOperation> = (request?: RequestObject<TOp>) => ResponsePromise<TOp>;
9
+ type RequestFunctionWithRequiredRequest<TOp extends OpenAPIOperation> = (request: RequestObject<TOp>) => ResponsePromise<TOp>;
10
+ export type RequestFunction<TOp extends OpenAPIOperation> = null extends RequestObject<TOp> ? RequestFunctionWithOptionalRequest<TOp> : RequestFunctionWithRequiredRequest<TOp>;
11
11
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mittwald/api-client-commons",
3
- "version": "4.0.1",
3
+ "version": "4.1.0-alpha.1",
4
4
  "description": "Common types and utilities for mittwald API clients",
5
5
  "license": "MIT",
6
6
  "repository": "https://github.com/mittwald/api-client-js.git",
@@ -22,6 +22,16 @@
22
22
  "require": "./dist/cjs/index.js",
23
23
  "default": "./dist/esm/index.js"
24
24
  }
25
+ },
26
+ "./react": {
27
+ "types": {
28
+ "require": "./dist/cjs/react/index.d.ts",
29
+ "default": "./dist/esm/react/index.d.ts"
30
+ },
31
+ "default": {
32
+ "require": "./dist/cjs/react/index.js",
33
+ "default": "./dist/esm/react/index.js"
34
+ }
25
35
  }
26
36
  },
27
37
  "scripts": {
@@ -37,6 +47,14 @@
37
47
  "sdk",
38
48
  "rest"
39
49
  ],
50
+ "peerDependencies": {
51
+ "@mittwald/react-use-promise": "^1.3.2"
52
+ },
53
+ "peerDependenciesMeta": {
54
+ "@mittwald/react-use-promise": {
55
+ "optional": true
56
+ }
57
+ },
40
58
  "dependencies": {
41
59
  "@types/parse-path": "^7.0.0",
42
60
  "axios": "^1.4.0",
@@ -46,9 +64,11 @@
46
64
  },
47
65
  "devDependencies": {
48
66
  "@jest/globals": "^29.6.0",
67
+ "@mittwald/react-use-promise": "^1.3.2",
49
68
  "@types/jest": "^29.5.2",
50
69
  "@yarnpkg/pnpify": "^4.0.0-rc.48",
51
70
  "jest": "^29.6.1",
71
+ "react": "^18.2.0",
52
72
  "ts-jest": "^29.1.1",
53
73
  "tsd": "^0.28.1"
54
74
  },