@geekmidas/client 0.4.0 → 1.0.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/auth-fetcher.cjs +0 -1
  3. package/dist/auth-fetcher.cjs.map +1 -1
  4. package/dist/auth-fetcher.d.cts +1 -1
  5. package/dist/auth-fetcher.d.cts.map +1 -1
  6. package/dist/auth-fetcher.d.mts +1 -1
  7. package/dist/auth-fetcher.d.mts.map +1 -1
  8. package/dist/auth-fetcher.mjs +0 -1
  9. package/dist/auth-fetcher.mjs.map +1 -1
  10. package/dist/endpoint-hooks.cjs +10 -5
  11. package/dist/endpoint-hooks.cjs.map +1 -1
  12. package/dist/endpoint-hooks.d.cts +2 -2
  13. package/dist/endpoint-hooks.d.cts.map +1 -1
  14. package/dist/endpoint-hooks.d.mts +2 -2
  15. package/dist/endpoint-hooks.d.mts.map +1 -1
  16. package/dist/endpoint-hooks.mjs +10 -5
  17. package/dist/endpoint-hooks.mjs.map +1 -1
  18. package/dist/fetcher-5fnBE7Dk.mjs.map +1 -1
  19. package/dist/fetcher-CgLEaIAC.cjs.map +1 -1
  20. package/dist/fetcher.d.cts +1 -1
  21. package/dist/fetcher.d.cts.map +1 -1
  22. package/dist/fetcher.d.mts +1 -1
  23. package/dist/fetcher.d.mts.map +1 -1
  24. package/dist/infer.d.cts.map +1 -1
  25. package/dist/infer.d.mts.map +1 -1
  26. package/dist/openapi-hooks.cjs.map +1 -1
  27. package/dist/openapi-hooks.d.cts +2 -2
  28. package/dist/openapi-hooks.d.cts.map +1 -1
  29. package/dist/openapi-hooks.d.mts +5 -5
  30. package/dist/openapi-hooks.d.mts.map +1 -1
  31. package/dist/openapi-hooks.mjs.map +1 -1
  32. package/dist/openapi-types.d.cts.map +1 -1
  33. package/dist/openapi-types.d.mts.map +1 -1
  34. package/dist/openapi.cjs.map +1 -1
  35. package/dist/openapi.mjs.map +1 -1
  36. package/dist/react-query.cjs.map +1 -1
  37. package/dist/react-query.d.cts +1 -1
  38. package/dist/react-query.d.cts.map +1 -1
  39. package/dist/react-query.d.mts +8 -8
  40. package/dist/react-query.d.mts.map +1 -1
  41. package/dist/react-query.mjs.map +1 -1
  42. package/dist/{types-FxummKaL.d.mts → types-4K4N-Fl1.d.cts} +2 -2
  43. package/dist/types-4K4N-Fl1.d.cts.map +1 -0
  44. package/dist/{types-vutATyWv.d.cts → types-hhkZWjQn.d.mts} +2 -2
  45. package/dist/types-hhkZWjQn.d.mts.map +1 -0
  46. package/dist/types.d.cts +1 -1
  47. package/dist/types.d.mts +1 -1
  48. package/package.json +5 -5
  49. package/src/__tests__/auth-fetcher.spec.ts +476 -476
  50. package/src/__tests__/endpoint-hooks.spec.tsx +348 -348
  51. package/src/__tests__/fetcher.spec.ts +403 -403
  52. package/src/__tests__/infer.integration.spec.ts +171 -171
  53. package/src/__tests__/infer.spec.ts +182 -182
  54. package/src/__tests__/method-restrictions.spec.tsx +165 -165
  55. package/src/__tests__/openapi-hooks.spec.tsx +536 -536
  56. package/src/__tests__/react-query-infinite.spec.tsx +989 -989
  57. package/src/__tests__/react-query-invalidation.spec.tsx +223 -222
  58. package/src/__tests__/react-query.spec.tsx +567 -567
  59. package/src/__tests__/setup.ts +260 -260
  60. package/src/__tests__/types.spec.ts +127 -127
  61. package/src/__tests__/url-parsing.spec.ts +191 -191
  62. package/src/auth-fetcher.ts +160 -162
  63. package/src/endpoint-hooks.ts +151 -156
  64. package/src/fetcher.ts +163 -163
  65. package/src/infer.ts +64 -63
  66. package/src/openapi-hooks.ts +146 -146
  67. package/src/openapi-types.d.ts +428 -428
  68. package/src/openapi.json +593 -593
  69. package/src/react-query.ts +281 -281
  70. package/src/types.ts +121 -124
  71. package/dist/types-FxummKaL.d.mts.map +0 -1
  72. package/dist/types-vutATyWv.d.cts.map +0 -1
@@ -4,186 +4,186 @@ import { z } from 'zod';
4
4
  import type { InferOpenApi, InferOpenApiFromEndpoint } from '../infer';
5
5
 
6
6
  describe('InferOpenApi', () => {
7
- describe('single endpoint', () => {
8
- it('should infer OpenAPI structure for GET endpoint', () => {
9
- const endpoint = e
10
- .get('/users/{id}')
11
- .params(z.object({ id: z.string() }))
12
- .output(z.object({ id: z.string(), name: z.string() }))
13
- .handle(async ({ params }) => ({
14
- id: params.id,
15
- name: 'John',
16
- }));
17
-
18
- type API = InferOpenApiFromEndpoint<typeof endpoint>;
19
-
20
- expectTypeOf<API>().toMatchTypeOf<{
21
- paths: {
22
- '/users/{id}': {
23
- get: {
24
- responses: {
25
- '200': {
26
- description: string;
27
- };
28
- };
29
- };
30
- };
31
- };
32
- }>();
33
- });
34
-
35
- it('should infer OpenAPI structure for POST endpoint with body', () => {
36
- const endpoint = e
37
- .post('/users')
38
- .body(z.object({ name: z.string(), email: z.string() }))
39
- .output(z.object({ id: z.string(), name: z.string() }))
40
- .handle(async ({ body }) => ({
41
- id: '123',
42
- name: body.name,
43
- }));
44
-
45
- type API = InferOpenApiFromEndpoint<typeof endpoint>;
46
-
47
- expectTypeOf<API>().toMatchTypeOf<{
48
- paths: {
49
- '/users': {
50
- post: {
51
- responses: {
52
- '200': {
53
- description: string;
54
- };
55
- };
56
- };
57
- };
58
- };
59
- }>();
60
- });
61
- });
62
-
63
- describe('multiple endpoints', () => {
64
- it('should merge OpenAPI specs from multiple endpoints', () => {
65
- const getUserEndpoint = e
66
- .get('/users/{id}')
67
- .params(z.object({ id: z.string() }))
68
- .output(z.object({ id: z.string(), name: z.string() }))
69
- .handle(async ({ params }) => ({
70
- id: params.id,
71
- name: 'John',
72
- }));
73
-
74
- const createUserEndpoint = e
75
- .post('/users')
76
- .body(z.object({ name: z.string() }))
77
- .output(z.object({ id: z.string(), name: z.string() }))
78
- .handle(async ({ body }) => ({
79
- id: '123',
80
- name: body.name,
81
- }));
82
-
83
- const endpoints = [getUserEndpoint, createUserEndpoint] as const;
84
-
85
- type API = InferOpenApi<typeof endpoints>;
86
-
87
- // Should have both paths
88
- expectTypeOf<API>().toMatchTypeOf<{
89
- paths: {
90
- '/users/{id}': {
91
- get: unknown;
92
- };
93
- '/users': {
94
- post: unknown;
95
- };
96
- };
97
- }>();
98
- });
99
-
100
- it('should handle endpoints with different HTTP methods on same path', () => {
101
- const getUserEndpoint = e
102
- .get('/users')
103
- .output(z.object({ users: z.array(z.object({ id: z.string() })) }))
104
- .handle(async () => ({
105
- users: [],
106
- }));
107
-
108
- const createUserEndpoint = e
109
- .post('/users')
110
- .body(z.object({ name: z.string() }))
111
- .output(z.object({ id: z.string() }))
112
- .handle(async ({ body }) => ({
113
- id: '123',
114
- }));
115
-
116
- const endpoints = [getUserEndpoint, createUserEndpoint] as const;
117
-
118
- type API = InferOpenApi<typeof endpoints>;
119
-
120
- // Should have both methods on same path
121
- expectTypeOf<API>().toMatchTypeOf<{
122
- paths: {
123
- '/users': {
124
- get: unknown;
125
- post: unknown;
126
- };
127
- };
128
- }>();
129
- });
130
- });
131
-
132
- describe('complex schemas', () => {
133
- it('should handle endpoints with query parameters', () => {
134
- const endpoint = e
135
- .get('/users')
136
- .query(
137
- z.object({
138
- page: z.coerce.number().optional(),
139
- limit: z.coerce.number().optional(),
140
- }),
141
- )
142
- .output(z.object({ users: z.array(z.object({ id: z.string() })) }))
143
- .handle(async ({ query }) => ({
144
- users: [],
145
- }));
146
-
147
- type API = InferOpenApiFromEndpoint<typeof endpoint>;
148
-
149
- expectTypeOf<API>().toMatchTypeOf<{
150
- paths: {
151
- '/users': {
152
- get: {
153
- responses: {
154
- '200': unknown;
155
- };
156
- };
157
- };
158
- };
159
- }>();
160
- });
161
-
162
- it('should handle endpoints with body, params, and query', () => {
163
- const endpoint = e
164
- .put('/users/{id}')
165
- .params(z.object({ id: z.string() }))
166
- .query(z.object({ notify: z.coerce.boolean().optional() }))
167
- .body(z.object({ name: z.string() }))
168
- .output(z.object({ id: z.string(), name: z.string() }))
169
- .handle(async ({ params, body }) => ({
170
- id: params.id,
171
- name: body.name,
172
- }));
173
-
174
- type API = InferOpenApiFromEndpoint<typeof endpoint>;
175
-
176
- expectTypeOf<API>().toMatchTypeOf<{
177
- paths: {
178
- '/users/{id}': {
179
- put: {
180
- responses: {
181
- '200': unknown;
182
- };
183
- };
184
- };
185
- };
186
- }>();
187
- });
188
- });
7
+ describe('single endpoint', () => {
8
+ it('should infer OpenAPI structure for GET endpoint', () => {
9
+ const endpoint = e
10
+ .get('/users/{id}')
11
+ .params(z.object({ id: z.string() }))
12
+ .output(z.object({ id: z.string(), name: z.string() }))
13
+ .handle(async ({ params }) => ({
14
+ id: params.id,
15
+ name: 'John',
16
+ }));
17
+
18
+ type API = InferOpenApiFromEndpoint<typeof endpoint>;
19
+
20
+ expectTypeOf<API>().toMatchTypeOf<{
21
+ paths: {
22
+ '/users/{id}': {
23
+ get: {
24
+ responses: {
25
+ '200': {
26
+ description: string;
27
+ };
28
+ };
29
+ };
30
+ };
31
+ };
32
+ }>();
33
+ });
34
+
35
+ it('should infer OpenAPI structure for POST endpoint with body', () => {
36
+ const endpoint = e
37
+ .post('/users')
38
+ .body(z.object({ name: z.string(), email: z.string() }))
39
+ .output(z.object({ id: z.string(), name: z.string() }))
40
+ .handle(async ({ body }) => ({
41
+ id: '123',
42
+ name: body.name,
43
+ }));
44
+
45
+ type API = InferOpenApiFromEndpoint<typeof endpoint>;
46
+
47
+ expectTypeOf<API>().toMatchTypeOf<{
48
+ paths: {
49
+ '/users': {
50
+ post: {
51
+ responses: {
52
+ '200': {
53
+ description: string;
54
+ };
55
+ };
56
+ };
57
+ };
58
+ };
59
+ }>();
60
+ });
61
+ });
62
+
63
+ describe('multiple endpoints', () => {
64
+ it('should merge OpenAPI specs from multiple endpoints', () => {
65
+ const getUserEndpoint = e
66
+ .get('/users/{id}')
67
+ .params(z.object({ id: z.string() }))
68
+ .output(z.object({ id: z.string(), name: z.string() }))
69
+ .handle(async ({ params }) => ({
70
+ id: params.id,
71
+ name: 'John',
72
+ }));
73
+
74
+ const createUserEndpoint = e
75
+ .post('/users')
76
+ .body(z.object({ name: z.string() }))
77
+ .output(z.object({ id: z.string(), name: z.string() }))
78
+ .handle(async ({ body }) => ({
79
+ id: '123',
80
+ name: body.name,
81
+ }));
82
+
83
+ const endpoints = [getUserEndpoint, createUserEndpoint] as const;
84
+
85
+ type API = InferOpenApi<typeof endpoints>;
86
+
87
+ // Should have both paths
88
+ expectTypeOf<API>().toMatchTypeOf<{
89
+ paths: {
90
+ '/users/{id}': {
91
+ get: unknown;
92
+ };
93
+ '/users': {
94
+ post: unknown;
95
+ };
96
+ };
97
+ }>();
98
+ });
99
+
100
+ it('should handle endpoints with different HTTP methods on same path', () => {
101
+ const getUserEndpoint = e
102
+ .get('/users')
103
+ .output(z.object({ users: z.array(z.object({ id: z.string() })) }))
104
+ .handle(async () => ({
105
+ users: [],
106
+ }));
107
+
108
+ const createUserEndpoint = e
109
+ .post('/users')
110
+ .body(z.object({ name: z.string() }))
111
+ .output(z.object({ id: z.string() }))
112
+ .handle(async ({ body }) => ({
113
+ id: '123',
114
+ }));
115
+
116
+ const endpoints = [getUserEndpoint, createUserEndpoint] as const;
117
+
118
+ type API = InferOpenApi<typeof endpoints>;
119
+
120
+ // Should have both methods on same path
121
+ expectTypeOf<API>().toMatchTypeOf<{
122
+ paths: {
123
+ '/users': {
124
+ get: unknown;
125
+ post: unknown;
126
+ };
127
+ };
128
+ }>();
129
+ });
130
+ });
131
+
132
+ describe('complex schemas', () => {
133
+ it('should handle endpoints with query parameters', () => {
134
+ const endpoint = e
135
+ .get('/users')
136
+ .query(
137
+ z.object({
138
+ page: z.coerce.number().optional(),
139
+ limit: z.coerce.number().optional(),
140
+ }),
141
+ )
142
+ .output(z.object({ users: z.array(z.object({ id: z.string() })) }))
143
+ .handle(async ({ query }) => ({
144
+ users: [],
145
+ }));
146
+
147
+ type API = InferOpenApiFromEndpoint<typeof endpoint>;
148
+
149
+ expectTypeOf<API>().toMatchTypeOf<{
150
+ paths: {
151
+ '/users': {
152
+ get: {
153
+ responses: {
154
+ '200': unknown;
155
+ };
156
+ };
157
+ };
158
+ };
159
+ }>();
160
+ });
161
+
162
+ it('should handle endpoints with body, params, and query', () => {
163
+ const endpoint = e
164
+ .put('/users/{id}')
165
+ .params(z.object({ id: z.string() }))
166
+ .query(z.object({ notify: z.coerce.boolean().optional() }))
167
+ .body(z.object({ name: z.string() }))
168
+ .output(z.object({ id: z.string(), name: z.string() }))
169
+ .handle(async ({ params, body }) => ({
170
+ id: params.id,
171
+ name: body.name,
172
+ }));
173
+
174
+ type API = InferOpenApiFromEndpoint<typeof endpoint>;
175
+
176
+ expectTypeOf<API>().toMatchTypeOf<{
177
+ paths: {
178
+ '/users/{id}': {
179
+ put: {
180
+ responses: {
181
+ '200': unknown;
182
+ };
183
+ };
184
+ };
185
+ };
186
+ }>();
187
+ });
188
+ });
189
189
  });