@mittwald/api-client-commons 3.0.0-alpha.1 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,5 +8,6 @@ export declare class Request<TOp extends OpenAPIOperation> {
8
8
  constructor(axiosInstance: AxiosInstance, operationDescriptor: TOp, config?: RequestConfig<TOp>);
9
9
  execute(): ResponsePromise<TOp>;
10
10
  private buildAxiosConfig;
11
+ private makeAxiosHeaders;
11
12
  }
12
13
  export default Request;
@@ -24,11 +24,14 @@ class Request {
24
24
  return {
25
25
  url: openApiPath.buildUrl(),
26
26
  method,
27
- headers,
27
+ headers: headers ? this.makeAxiosHeaders(headers) : undefined,
28
28
  data,
29
29
  validateStatus: () => true,
30
30
  };
31
31
  }
32
+ makeAxiosHeaders(headers) {
33
+ return Object.fromEntries(Object.entries(headers).map(([key, value]) => [key, value.toString()]));
34
+ }
32
35
  }
33
36
  exports.Request = Request;
34
37
  exports.default = Request;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tsd_1 = require("tsd");
4
+ function ignoredTestEmptyRequestTypes() {
5
+ (0, tsd_1.expectAssignable)({});
6
+ // @ts-expect-error Not assignable
7
+ (0, tsd_1.expectAssignable)({ extra: true });
8
+ // @ts-expect-error Not assignable
9
+ (0, tsd_1.expectAssignable)({ data: {} });
10
+ // @ts-expect-error Not assignable
11
+ (0, tsd_1.expectAssignable)({ data: null });
12
+ // @ts-expect-error Not assignable
13
+ (0, tsd_1.expectAssignable)({ pathParameters: {} });
14
+ }
15
+ function ignoredTestRequestTypesWithDataType() {
16
+ (0, tsd_1.expectAssignable)({ data: { foo: "" } });
17
+ // @ts-expect-error Not assignable
18
+ (0, tsd_1.expectAssignable)({});
19
+ (0, tsd_1.expectAssignable)({
20
+ // @ts-expect-error Not assignable
21
+ data: { foo: "", extra: "" },
22
+ });
23
+ // @ts-expect-error Not assignable
24
+ (0, tsd_1.expectAssignable)({ data: { noFoo: "" } });
25
+ }
26
+ function ignoredTestRequestTypesWithPathParameters() {
27
+ (0, tsd_1.expectAssignable)({
28
+ data: { foo: "" },
29
+ pathParameters: { bar: "" },
30
+ });
31
+ (0, tsd_1.expectAssignable)({
32
+ pathParameters: { bar: "" },
33
+ });
34
+ // @ts-expect-error Not assignable
35
+ (0, tsd_1.expectAssignable)({});
36
+ (0, tsd_1.expectAssignable)({
37
+ // @ts-expect-error Not assignable
38
+ pathParameters: {},
39
+ });
40
+ (0, tsd_1.expectAssignable)({
41
+ // @ts-expect-error Not assignable
42
+ pathParameters: { foo: "", extra: "" },
43
+ });
44
+ }
45
+ function ignoredTestRequestTypesWithHeader() {
46
+ (0, tsd_1.expectAssignable)({
47
+ data: {
48
+ foo: "",
49
+ },
50
+ pathParameters: { bar: "" },
51
+ headers: { baz: "" },
52
+ });
53
+ (0, tsd_1.expectAssignable)({
54
+ pathParameters: { bar: "" },
55
+ headers: { baz: "" },
56
+ });
57
+ (0, tsd_1.expectAssignable)({
58
+ headers: { baz: "" },
59
+ });
60
+ // @ts-expect-error Not assignable
61
+ (0, tsd_1.expectAssignable)({});
62
+ (0, tsd_1.expectAssignable)({
63
+ headers: {
64
+ // @ts-expect-error Not assignable
65
+ baz: 42,
66
+ },
67
+ });
68
+ (0, tsd_1.expectAssignable)({
69
+ // @ts-expect-error Not assignable
70
+ headers: {},
71
+ });
72
+ (0, tsd_1.expectAssignable)({
73
+ // @ts-expect-error Not assignable
74
+ data: {},
75
+ headers: {
76
+ baz: "",
77
+ },
78
+ });
79
+ (0, tsd_1.expectAssignable)({
80
+ // @ts-expect-error Not assignable
81
+ pathParameters: {},
82
+ headers: {
83
+ baz: "",
84
+ },
85
+ });
86
+ }
87
+ function ignoredTestAdditionalHeadersCanAlwaysBeSet() {
88
+ (0, tsd_1.expectAssignable)({
89
+ headers: { extra: true },
90
+ });
91
+ (0, tsd_1.expectAssignable)({
92
+ headers: { extra: true },
93
+ });
94
+ (0, tsd_1.expectAssignable)({
95
+ headers: { extra: true },
96
+ });
97
+ (0, tsd_1.expectAssignable)({
98
+ data: {
99
+ foo: "",
100
+ },
101
+ headers: { extra: true },
102
+ });
103
+ (0, tsd_1.expectAssignable)({
104
+ pathParameters: {
105
+ bar: "",
106
+ },
107
+ headers: { extra: true },
108
+ });
109
+ (0, tsd_1.expectAssignable)({
110
+ headers: { extra: true, baz: "" },
111
+ });
112
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function ignoredTestEmptyRequestTypes() {
4
+ const f = {};
5
+ void f();
6
+ void f({
7
+ headers: {},
8
+ });
9
+ void f({
10
+ headers: { extra: true },
11
+ });
12
+ }
@@ -1,14 +1,18 @@
1
1
  import { HttpHeaders, HttpPayload, PathParameters } from "./http.js";
2
- type RequestWithData<TData> = TData extends null ? object : {
2
+ type EmptyObject = Record<string, never>;
3
+ type EmptyRequestComponent = EmptyObject | null;
4
+ type RequestWithOptionalHeaders = {
5
+ headers?: HttpHeaders;
6
+ };
7
+ type RequestWithData<TData> = TData extends EmptyRequestComponent ? RequestWithOptionalHeaders : {
3
8
  data: TData;
4
9
  };
5
- type RequestWithPathParameters<TPathParameters> = TPathParameters extends null ? object : {
10
+ type RequestWithPathParameters<TPathParameters> = TPathParameters extends EmptyRequestComponent ? RequestWithOptionalHeaders : {
6
11
  pathParameters: TPathParameters;
7
12
  };
8
- type RequestWithHeaders<THeaders> = THeaders extends null ? object : {
9
- headers: THeaders;
13
+ type RequestWithHeaders<THeaders> = THeaders extends EmptyRequestComponent ? RequestWithOptionalHeaders : {
14
+ headers: THeaders & HttpHeaders;
10
15
  };
11
- type EmptyRequest = Record<string, never>;
12
- export type RequestType<TData extends HttpPayload = null, TPathParameters extends PathParameters | null = null, THeader extends HttpHeaders | null = null> = TData | TPathParameters | THeader extends null ? EmptyRequest : RequestWithData<TData> & RequestWithPathParameters<TPathParameters> & RequestWithHeaders<THeader>;
16
+ export type RequestType<TData extends HttpPayload = EmptyRequestComponent, TPathParameters extends PathParameters | EmptyRequestComponent = EmptyRequestComponent, THeader extends HttpHeaders | EmptyRequestComponent = EmptyRequestComponent> = TData | TPathParameters | THeader extends EmptyRequestComponent ? RequestWithOptionalHeaders : RequestWithData<TData> & RequestWithPathParameters<TPathParameters> & RequestWithHeaders<THeader>;
13
17
  export type AnyRequest = RequestType<any, any, any>;
14
18
  export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tsd_1 = require("tsd");
4
+ const additionalAxiosResponseData = {
5
+ statusText: "",
6
+ headers: {},
7
+ config: {},
8
+ mediaType: "application/json",
9
+ };
10
+ (0, tsd_1.expectAssignable)(Object.assign({ data: { a: "" }, status: 200 }, additionalAxiosResponseData));
11
+ (0, tsd_1.expectNotAssignable)(Object.assign({ data: { a: "", extra: "!" }, status: 200 }, additionalAxiosResponseData));
12
+ (0, tsd_1.expectAssignable)(Object.assign({ data: {
13
+ b: "",
14
+ }, status: 201 }, additionalAxiosResponseData));
15
+ (0, tsd_1.expectAssignable)(Object.assign({ data: null, status: 400 }, additionalAxiosResponseData));
16
+ (0, tsd_1.expectNotAssignable)(Object.assign({ data: null, status: 42 }, additionalAxiosResponseData));
17
+ (0, tsd_1.expectNotAssignable)(Object.assign({ data: null, status: 42, extra: "!" }, additionalAxiosResponseData));
18
+ (0, tsd_1.expectNotAssignable)(Object.assign({ data: { extraContent: "" }, status: 400 }, additionalAxiosResponseData));
19
+ function ignoredTestRequestTypesWithDataPathParameters() {
20
+ const someResponse = {};
21
+ (0, tsd_1.expectType)(someResponse.status);
22
+ if (someResponse.status === 200) {
23
+ // @ts-expect-error > a is not in data
24
+ someResponse.data.a;
25
+ // @ts-expect-error > b is not in data
26
+ someResponse.data.b;
27
+ if (someResponse.mediaType === "text/plain") {
28
+ // @ts-expect-error > a is not in data
29
+ someResponse.data.a;
30
+ (0, tsd_1.expectType)(someResponse.data.text);
31
+ }
32
+ else {
33
+ // @ts-expect-error > text is not in data
34
+ someResponse.data.text;
35
+ (0, tsd_1.expectType)(someResponse.data.a);
36
+ }
37
+ }
38
+ else if (someResponse.status === 201) {
39
+ (0, tsd_1.expectType)(someResponse.data.b);
40
+ // @ts-expect-error > a is not in data
41
+ someResponse.data.a;
42
+ }
43
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tsd_1 = require("tsd");
4
+ const assertStatus_js_1 = require("./assertStatus.js");
5
+ function ignoredTestAssertStatusAssertsAlsoTheCorrectResponseType() {
6
+ (0, assertStatus_js_1.default)(someResponse, 200);
7
+ (0, tsd_1.expectAssignable)(someResponse);
8
+ // @ts-expect-error Not assignable
9
+ (0, tsd_1.expectAssignable)(someResponse);
10
+ }
@@ -5,8 +5,8 @@ type SafeHttpMethod = "GET" | "HEAD" | "OPTIONS";
5
5
  type UnsafeHttpMethod = "PUT" | "DELETE" | "POST" | "PATCH";
6
6
  export type HttpMethod = SafeHttpMethod | UnsafeHttpMethod;
7
7
  type HeaderValue = string | number | boolean;
8
- export type HttpHeaders = Partial<{
8
+ export type HttpHeaders = {
9
9
  [TKey: string]: HeaderValue | HeaderValue[];
10
- }>;
10
+ };
11
11
  export type PathParameters = Record<string, string | number>;
12
12
  export {};
@@ -8,5 +8,6 @@ export declare class Request<TOp extends OpenAPIOperation> {
8
8
  constructor(axiosInstance: AxiosInstance, operationDescriptor: TOp, config?: RequestConfig<TOp>);
9
9
  execute(): ResponsePromise<TOp>;
10
10
  private buildAxiosConfig;
11
+ private makeAxiosHeaders;
11
12
  }
12
13
  export default Request;
@@ -24,10 +24,13 @@ export class Request {
24
24
  return {
25
25
  url: openApiPath.buildUrl(),
26
26
  method,
27
- headers,
27
+ headers: headers ? this.makeAxiosHeaders(headers) : undefined,
28
28
  data,
29
29
  validateStatus: () => true,
30
30
  };
31
31
  }
32
+ makeAxiosHeaders(headers) {
33
+ return Object.fromEntries(Object.entries(headers).map(([key, value]) => [key, value.toString()]));
34
+ }
32
35
  }
33
36
  export default Request;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,110 @@
1
+ import { expectAssignable } from "tsd";
2
+ function ignoredTestEmptyRequestTypes() {
3
+ expectAssignable({});
4
+ // @ts-expect-error Not assignable
5
+ expectAssignable({ extra: true });
6
+ // @ts-expect-error Not assignable
7
+ expectAssignable({ data: {} });
8
+ // @ts-expect-error Not assignable
9
+ expectAssignable({ data: null });
10
+ // @ts-expect-error Not assignable
11
+ expectAssignable({ pathParameters: {} });
12
+ }
13
+ function ignoredTestRequestTypesWithDataType() {
14
+ expectAssignable({ data: { foo: "" } });
15
+ // @ts-expect-error Not assignable
16
+ expectAssignable({});
17
+ expectAssignable({
18
+ // @ts-expect-error Not assignable
19
+ data: { foo: "", extra: "" },
20
+ });
21
+ // @ts-expect-error Not assignable
22
+ expectAssignable({ data: { noFoo: "" } });
23
+ }
24
+ function ignoredTestRequestTypesWithPathParameters() {
25
+ expectAssignable({
26
+ data: { foo: "" },
27
+ pathParameters: { bar: "" },
28
+ });
29
+ expectAssignable({
30
+ pathParameters: { bar: "" },
31
+ });
32
+ // @ts-expect-error Not assignable
33
+ expectAssignable({});
34
+ expectAssignable({
35
+ // @ts-expect-error Not assignable
36
+ pathParameters: {},
37
+ });
38
+ expectAssignable({
39
+ // @ts-expect-error Not assignable
40
+ pathParameters: { foo: "", extra: "" },
41
+ });
42
+ }
43
+ function ignoredTestRequestTypesWithHeader() {
44
+ expectAssignable({
45
+ data: {
46
+ foo: "",
47
+ },
48
+ pathParameters: { bar: "" },
49
+ headers: { baz: "" },
50
+ });
51
+ expectAssignable({
52
+ pathParameters: { bar: "" },
53
+ headers: { baz: "" },
54
+ });
55
+ expectAssignable({
56
+ headers: { baz: "" },
57
+ });
58
+ // @ts-expect-error Not assignable
59
+ expectAssignable({});
60
+ expectAssignable({
61
+ headers: {
62
+ // @ts-expect-error Not assignable
63
+ baz: 42,
64
+ },
65
+ });
66
+ expectAssignable({
67
+ // @ts-expect-error Not assignable
68
+ headers: {},
69
+ });
70
+ expectAssignable({
71
+ // @ts-expect-error Not assignable
72
+ data: {},
73
+ headers: {
74
+ baz: "",
75
+ },
76
+ });
77
+ expectAssignable({
78
+ // @ts-expect-error Not assignable
79
+ pathParameters: {},
80
+ headers: {
81
+ baz: "",
82
+ },
83
+ });
84
+ }
85
+ function ignoredTestAdditionalHeadersCanAlwaysBeSet() {
86
+ expectAssignable({
87
+ headers: { extra: true },
88
+ });
89
+ expectAssignable({
90
+ headers: { extra: true },
91
+ });
92
+ expectAssignable({
93
+ headers: { extra: true },
94
+ });
95
+ expectAssignable({
96
+ data: {
97
+ foo: "",
98
+ },
99
+ headers: { extra: true },
100
+ });
101
+ expectAssignable({
102
+ pathParameters: {
103
+ bar: "",
104
+ },
105
+ headers: { extra: true },
106
+ });
107
+ expectAssignable({
108
+ headers: { extra: true, baz: "" },
109
+ });
110
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ function ignoredTestEmptyRequestTypes() {
2
+ const f = {};
3
+ void f();
4
+ void f({
5
+ headers: {},
6
+ });
7
+ void f({
8
+ headers: { extra: true },
9
+ });
10
+ }
11
+ export {};
@@ -1,14 +1,18 @@
1
1
  import { HttpHeaders, HttpPayload, PathParameters } from "./http.js";
2
- type RequestWithData<TData> = TData extends null ? object : {
2
+ type EmptyObject = Record<string, never>;
3
+ type EmptyRequestComponent = EmptyObject | null;
4
+ type RequestWithOptionalHeaders = {
5
+ headers?: HttpHeaders;
6
+ };
7
+ type RequestWithData<TData> = TData extends EmptyRequestComponent ? RequestWithOptionalHeaders : {
3
8
  data: TData;
4
9
  };
5
- type RequestWithPathParameters<TPathParameters> = TPathParameters extends null ? object : {
10
+ type RequestWithPathParameters<TPathParameters> = TPathParameters extends EmptyRequestComponent ? RequestWithOptionalHeaders : {
6
11
  pathParameters: TPathParameters;
7
12
  };
8
- type RequestWithHeaders<THeaders> = THeaders extends null ? object : {
9
- headers: THeaders;
13
+ type RequestWithHeaders<THeaders> = THeaders extends EmptyRequestComponent ? RequestWithOptionalHeaders : {
14
+ headers: THeaders & HttpHeaders;
10
15
  };
11
- type EmptyRequest = Record<string, never>;
12
- export type RequestType<TData extends HttpPayload = null, TPathParameters extends PathParameters | null = null, THeader extends HttpHeaders | null = null> = TData | TPathParameters | THeader extends null ? EmptyRequest : RequestWithData<TData> & RequestWithPathParameters<TPathParameters> & RequestWithHeaders<THeader>;
16
+ export type RequestType<TData extends HttpPayload = EmptyRequestComponent, TPathParameters extends PathParameters | EmptyRequestComponent = EmptyRequestComponent, THeader extends HttpHeaders | EmptyRequestComponent = EmptyRequestComponent> = TData | TPathParameters | THeader extends EmptyRequestComponent ? RequestWithOptionalHeaders : RequestWithData<TData> & RequestWithPathParameters<TPathParameters> & RequestWithHeaders<THeader>;
13
17
  export type AnyRequest = RequestType<any, any, any>;
14
18
  export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ import { expectAssignable, expectNotAssignable, expectType } from "tsd";
2
+ const additionalAxiosResponseData = {
3
+ statusText: "",
4
+ headers: {},
5
+ config: {},
6
+ mediaType: "application/json",
7
+ };
8
+ expectAssignable({
9
+ data: { a: "" },
10
+ status: 200,
11
+ ...additionalAxiosResponseData,
12
+ });
13
+ expectNotAssignable({
14
+ data: { a: "", extra: "!" },
15
+ status: 200,
16
+ ...additionalAxiosResponseData,
17
+ });
18
+ expectAssignable({
19
+ data: {
20
+ b: "",
21
+ },
22
+ status: 201,
23
+ ...additionalAxiosResponseData,
24
+ });
25
+ expectAssignable({
26
+ data: null,
27
+ status: 400,
28
+ ...additionalAxiosResponseData,
29
+ });
30
+ expectNotAssignable({
31
+ data: null,
32
+ status: 42,
33
+ ...additionalAxiosResponseData,
34
+ });
35
+ expectNotAssignable({
36
+ data: null,
37
+ status: 42,
38
+ extra: "!",
39
+ ...additionalAxiosResponseData,
40
+ });
41
+ expectNotAssignable({
42
+ data: { extraContent: "" },
43
+ status: 400,
44
+ ...additionalAxiosResponseData,
45
+ });
46
+ function ignoredTestRequestTypesWithDataPathParameters() {
47
+ const someResponse = {};
48
+ expectType(someResponse.status);
49
+ if (someResponse.status === 200) {
50
+ // @ts-expect-error > a is not in data
51
+ someResponse.data.a;
52
+ // @ts-expect-error > b is not in data
53
+ someResponse.data.b;
54
+ if (someResponse.mediaType === "text/plain") {
55
+ // @ts-expect-error > a is not in data
56
+ someResponse.data.a;
57
+ expectType(someResponse.data.text);
58
+ }
59
+ else {
60
+ // @ts-expect-error > text is not in data
61
+ someResponse.data.text;
62
+ expectType(someResponse.data.a);
63
+ }
64
+ }
65
+ else if (someResponse.status === 201) {
66
+ expectType(someResponse.data.b);
67
+ // @ts-expect-error > a is not in data
68
+ someResponse.data.a;
69
+ }
70
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { expectAssignable } from "tsd";
2
+ import assertStatus from "./assertStatus.js";
3
+ function ignoredTestAssertStatusAssertsAlsoTheCorrectResponseType() {
4
+ assertStatus(someResponse, 200);
5
+ expectAssignable(someResponse);
6
+ // @ts-expect-error Not assignable
7
+ expectAssignable(someResponse);
8
+ }
@@ -5,8 +5,8 @@ type SafeHttpMethod = "GET" | "HEAD" | "OPTIONS";
5
5
  type UnsafeHttpMethod = "PUT" | "DELETE" | "POST" | "PATCH";
6
6
  export type HttpMethod = SafeHttpMethod | UnsafeHttpMethod;
7
7
  type HeaderValue = string | number | boolean;
8
- export type HttpHeaders = Partial<{
8
+ export type HttpHeaders = {
9
9
  [TKey: string]: HeaderValue | HeaderValue[];
10
- }>;
10
+ };
11
11
  export type PathParameters = Record<string, string | number>;
12
12
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mittwald/api-client-commons",
3
- "version": "3.0.0-alpha.1",
3
+ "version": "3.0.2",
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",
@@ -25,8 +25,7 @@
25
25
  }
26
26
  },
27
27
  "scripts": {
28
- "test": "yarn test:tsd",
29
- "test:tsd": "pnpify run tsd"
28
+ "test": "echo 'No tests available'"
30
29
  },
31
30
  "files": [
32
31
  "dist/**/*.{js,d.ts}"