@openapi-qraft/react 1.0.4 → 1.0.6

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,43 +0,0 @@
1
- import { composeMutationKey } from './composeMutationKey.js';
2
-
3
- describe('composeMutationKey', () => {
4
- it('should return mutation key with parameters', () => {
5
- const schema = {
6
- url: 'https://example.com',
7
- method: 'get',
8
- } as const;
9
-
10
- const parameters = {
11
- body: 'body',
12
- requestBody: 'requestBody',
13
- other: 'other',
14
- };
15
- const result = composeMutationKey(schema, parameters);
16
-
17
- expect(result).toEqual([
18
- {
19
- url: schema.url,
20
- method: schema.method,
21
- },
22
- {
23
- other: 'other',
24
- },
25
- ]);
26
- });
27
-
28
- it('should return mutation key without parameters', () => {
29
- const schema = {
30
- url: 'https://example.com',
31
- method: 'get',
32
- } as const;
33
-
34
- const result = composeMutationKey(schema, undefined);
35
-
36
- expect(result).toEqual([
37
- {
38
- url: schema.url,
39
- method: schema.method,
40
- },
41
- ]);
42
- });
43
- });
@@ -1,94 +0,0 @@
1
- import { shelfMerge } from './shelfMerge.js';
2
-
3
- describe('shelfMerge', () => {
4
- it('merges simple objects', async () => {
5
- expect(shelfMerge(1, { path: 1 }, { query: 2 }, { header: 3 })).toEqual({
6
- path: 1,
7
- query: 2,
8
- header: 3,
9
- });
10
- });
11
-
12
- it('merges simple objects with overlapping', async () => {
13
- expect(
14
- shelfMerge(2, { path: 1 }, { path: { id: 22 } }, { header: 3 })
15
- ).toEqual({
16
- path: { id: 22 },
17
- header: 3,
18
- });
19
- });
20
-
21
- it('merges objects with overlapping in child objects', async () => {
22
- expect(
23
- shelfMerge(
24
- 2,
25
- { query: { id: 11, page: 22 } },
26
- { query: { id: 44, limit: 33 } },
27
- { header: 3 }
28
- )
29
- ).toEqual({
30
- query: { id: 44, page: 22, limit: 33 },
31
- header: 3,
32
- });
33
- });
34
-
35
- it('merges objects with overlapping in child objects on specific depth (1)', async () => {
36
- expect(
37
- shelfMerge(
38
- 1,
39
- { query: { id: 11, page: 22 } },
40
- { query: { id: 44, limit: 33 } },
41
- { header: 3 }
42
- )
43
- ).toEqual({
44
- query: { id: 44, limit: 33 },
45
- header: 3,
46
- });
47
- });
48
-
49
- it('merges objects with overlapping in child objects on specific depth (2)', async () => {
50
- expect(
51
- shelfMerge(
52
- 2,
53
- { query: { id: 11, page: 22 } },
54
- { query: { id: 44, limit: 33 } },
55
- { header: 3 }
56
- )
57
- ).toEqual({
58
- query: { id: 44, limit: 33, page: 22 },
59
- header: 3,
60
- });
61
- });
62
-
63
- it('merges arrays without nesting', async () => {
64
- expect(
65
- shelfMerge(
66
- 2,
67
- { query: [{ id: 11, page: 22 }] },
68
- { query: [{ id: 44, limit: 33 }] },
69
- { header: 3 }
70
- )
71
- ).toEqual({
72
- query: [{ id: 44, limit: 33 }],
73
- header: 3,
74
- });
75
- });
76
-
77
- it('merges objects with overlapping in child objects and depth', async () => {
78
- expect(
79
- shelfMerge(
80
- 3,
81
- { query: { one: { id: 11, page: 22 }, two: { ids: [55] } } },
82
- { query: { one: { id: 44, limit: 33 }, three: { filter: 66 } } },
83
- { header: 3 }
84
- )
85
- ).toEqual({
86
- query: {
87
- one: { id: 44, page: 22, limit: 33 },
88
- two: { ids: [55] },
89
- three: { filter: 66 },
90
- },
91
- header: 3,
92
- });
93
- });
94
- });
@@ -1,252 +0,0 @@
1
- import { http, HttpResponse } from 'msw';
2
- import queryString from 'query-string';
3
-
4
- import { Services, services } from '../fixtures/api/index.js';
5
-
6
- export const handlers = [
7
- http.get<
8
- ServicePathParameters<
9
- Services['approvalPolicies']['getApprovalPoliciesId']
10
- >,
11
- undefined,
12
- ServiceResponseParameters<
13
- Services['approvalPolicies']['getApprovalPoliciesId']
14
- >
15
- >(
16
- openApiToMswPath(
17
- services.approvalPolicies.getApprovalPoliciesId.schema.url
18
- ),
19
- ({ params: { '0': _, ...path }, request }) => {
20
- const query = getQueryParameters<
21
- Services['approvalPolicies']['getApprovalPoliciesId']
22
- >(request.url);
23
-
24
- const header = getHeaders<
25
- Services['approvalPolicies']['getApprovalPoliciesId']
26
- >(request.headers, 'x-');
27
-
28
- return HttpResponse.json({
29
- path,
30
- query,
31
- header,
32
- });
33
- }
34
- ),
35
-
36
- http.post<
37
- ServicePathParameters<Services['entities']['postEntitiesIdDocuments']>,
38
- ServiceRequestBodyParameters<
39
- Services['entities']['postEntitiesIdDocuments']
40
- >,
41
- ServiceResponseParameters<Services['entities']['postEntitiesIdDocuments']>
42
- >(
43
- openApiToMswPath(services.entities.postEntitiesIdDocuments.schema.url),
44
- async ({ params: { '0': _, ...path }, request }) => {
45
- const query = getQueryParameters<
46
- Services['entities']['postEntitiesIdDocuments']
47
- >(request.url);
48
-
49
- const header = getHeaders<
50
- Services['entities']['postEntitiesIdDocuments']
51
- >(request.headers, 'x-');
52
-
53
- const body = await request.json();
54
-
55
- return HttpResponse.json({
56
- path,
57
- query,
58
- header,
59
- body,
60
- });
61
- }
62
- ),
63
-
64
- http.post<
65
- ServicePathParameters<Services['files']['postFiles']>,
66
- ServiceRequestBodyParameters<Services['files']['postFiles']>,
67
- ServiceResponseParameters<Services['files']['postFiles']>
68
- >(
69
- openApiToMswPath(services.files.postFiles.schema.url),
70
- async ({ request }) => {
71
- const formData = Object.fromEntries(await request.formData()) as Awaited<
72
- ReturnType<typeof request.json>
73
- >;
74
-
75
- const body: Record<string, any> = {};
76
-
77
- for (const [key, value] of Object.entries(formData)) {
78
- // some workaround to make it work, since value instanceof (File | Blob) is not working by some reason
79
- if (
80
- !value ||
81
- typeof value === 'string' ||
82
- value.type !== 'application/octet-stream'
83
- ) {
84
- body[key] = value;
85
- continue;
86
- }
87
- body[key] = (value as File).name;
88
- }
89
-
90
- return HttpResponse.json({ body });
91
- }
92
- ),
93
-
94
- http.get<
95
- ServicePathParameters<Services['files']['getFiles']>,
96
- undefined,
97
- ServiceResponseParameters<Services['files']['getFiles']>
98
- >(openApiToMswPath(services.files.getFiles.schema.url), ({ request }) => {
99
- const query = getQueryParameters<Services['files']['getFiles']>(
100
- request.url
101
- );
102
-
103
- const header = getHeaders<Services['files']['getFiles']>(
104
- request.headers,
105
- 'x-'
106
- );
107
-
108
- return HttpResponse.json({
109
- query,
110
- header,
111
- });
112
- }),
113
- ];
114
-
115
- function openApiToMswPath(url: string) {
116
- return `*${url.replace(
117
- /{(.*?)}/g,
118
- (substring: string, group: string) => `:${group}`
119
- )}`;
120
- }
121
-
122
- function getQueryParameters<
123
- T extends
124
- | {
125
- getQueryKey: (arg: never) => unknown;
126
- }
127
- | {
128
- getMutationKey: (arg: never) => unknown;
129
- },
130
- >(url: string): ServiceQueryParameters<T> {
131
- return queryString.parse(url.split('?')[1]) as ServiceQueryParameters<T>;
132
- }
133
-
134
- function getHeaders<
135
- T extends
136
- | {
137
- getQueryKey: (arg: never) => unknown;
138
- }
139
- | {
140
- getMutationKey: (arg: never) => unknown;
141
- },
142
- >(headers: Headers, prefix: string): ServiceHeaderParameters<T> {
143
- return Array.from(headers.entries()).reduce(
144
- (acc, [headerKey, headerValue]) => {
145
- if (!headerKey.toLowerCase().startsWith(prefix.toLowerCase())) return acc;
146
- if (typeof headerValue !== 'string') return acc;
147
- return {
148
- ...acc,
149
- [headerKey]: headerValue,
150
- };
151
- },
152
- {} as Record<string, string>
153
- ) as ServiceHeaderParameters<T>;
154
- }
155
-
156
- type ServiceHeaderParameters<
157
- T extends
158
- | {
159
- getQueryKey: (arg: never) => unknown;
160
- }
161
- | {
162
- getMutationKey: (arg: never) => unknown;
163
- },
164
- > = T extends {
165
- getQueryKey: (arg: infer QueryKey) => unknown;
166
- }
167
- ? QueryKey extends { header?: infer Parameters }
168
- ? Parameters
169
- : unknown
170
- : T extends {
171
- getMutationKey: (arg: infer MutationKey) => unknown;
172
- }
173
- ? MutationKey extends { header?: infer Parameters }
174
- ? Parameters
175
- : unknown
176
- : never;
177
-
178
- type ServicePathParameters<
179
- T extends
180
- | {
181
- getQueryKey: (arg: never) => unknown;
182
- }
183
- | {
184
- getMutationKey: (arg: never) => unknown;
185
- },
186
- > = T extends {
187
- getQueryKey: (arg: infer QueryKey) => unknown;
188
- }
189
- ? QueryKey extends { path?: infer Parameters }
190
- ? Parameters & { 0: string }
191
- : {}
192
- : T extends {
193
- getMutationKey: (arg: infer MutationKey) => unknown;
194
- }
195
- ? MutationKey extends { path?: infer Parameters }
196
- ? Parameters & { 0: string }
197
- : {}
198
- : never;
199
-
200
- type ServiceQueryParameters<
201
- T extends
202
- | {
203
- getQueryKey: (arg: never) => unknown;
204
- }
205
- | {
206
- getMutationKey: (arg: never) => unknown;
207
- },
208
- > = T extends {
209
- getQueryKey: (arg: infer QueryKey) => unknown;
210
- }
211
- ? QueryKey extends { query?: infer Parameters }
212
- ? Parameters
213
- : unknown
214
- : T extends {
215
- getMutationKey: (arg: infer MutationKey) => unknown;
216
- }
217
- ? MutationKey extends { query?: infer Parameters }
218
- ? Parameters
219
- : unknown
220
- : never;
221
-
222
- type ServiceRequestBodyParameters<
223
- T extends {
224
- mutationFn: (...args: never[]) => unknown;
225
- },
226
- > = T extends {
227
- mutationFn: (...args: never[]) => unknown;
228
- }
229
- ? Parameters<T['mutationFn']>[1] extends infer Options
230
- ? Options extends { body: infer Body }
231
- ? Body
232
- : never
233
- : never
234
- : never;
235
-
236
- type ServiceResponseParameters<
237
- T extends
238
- | {
239
- queryFn: (...args: never[]) => unknown;
240
- }
241
- | {
242
- mutationFn: (...args: never[]) => unknown;
243
- },
244
- > = T extends {
245
- queryFn: (...args: never[]) => unknown;
246
- }
247
- ? Awaited<ReturnType<T['queryFn']>>
248
- : T extends {
249
- mutationFn: (...args: never[]) => unknown;
250
- }
251
- ? Awaited<ReturnType<T['mutationFn']>>
252
- : never;
package/src/mocks/node.ts DELETED
@@ -1,5 +0,0 @@
1
- import { setupServer } from 'msw/node';
2
-
3
- import { handlers } from './handlers.js';
4
-
5
- export const server = setupServer(...handlers);