@thymian/core-testing 0.0.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.
Files changed (38) hide show
  1. package/README.md +285 -0
  2. package/dist/factories/http-request.factory.d.ts +40 -0
  3. package/dist/factories/http-request.factory.d.ts.map +1 -0
  4. package/dist/factories/http-request.factory.js +84 -0
  5. package/dist/factories/http-request.factory.js.map +1 -0
  6. package/dist/factories/http-response.factory.d.ts +51 -0
  7. package/dist/factories/http-response.factory.d.ts.map +1 -0
  8. package/dist/factories/http-response.factory.js +109 -0
  9. package/dist/factories/http-response.factory.js.map +1 -0
  10. package/dist/factories/parameter.factory.d.ts +28 -0
  11. package/dist/factories/parameter.factory.d.ts.map +1 -0
  12. package/dist/factories/parameter.factory.js +48 -0
  13. package/dist/factories/parameter.factory.js.map +1 -0
  14. package/dist/factories/schema.factory.d.ts +45 -0
  15. package/dist/factories/schema.factory.d.ts.map +1 -0
  16. package/dist/factories/schema.factory.js +81 -0
  17. package/dist/factories/schema.factory.js.map +1 -0
  18. package/dist/factories/thymian-format.factory.d.ts +46 -0
  19. package/dist/factories/thymian-format.factory.d.ts.map +1 -0
  20. package/dist/factories/thymian-format.factory.js +65 -0
  21. package/dist/factories/thymian-format.factory.js.map +1 -0
  22. package/dist/index.d.ts +40 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +46 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mocks/emitter.mock.d.ts +71 -0
  27. package/dist/mocks/emitter.mock.d.ts.map +1 -0
  28. package/dist/mocks/emitter.mock.js +101 -0
  29. package/dist/mocks/emitter.mock.js.map +1 -0
  30. package/dist/mocks/logger.mock.d.ts +36 -0
  31. package/dist/mocks/logger.mock.d.ts.map +1 -0
  32. package/dist/mocks/logger.mock.js +74 -0
  33. package/dist/mocks/logger.mock.js.map +1 -0
  34. package/dist/mocks/plugin.mock.d.ts +85 -0
  35. package/dist/mocks/plugin.mock.d.ts.map +1 -0
  36. package/dist/mocks/plugin.mock.js +102 -0
  37. package/dist/mocks/plugin.mock.js.map +1 -0
  38. package/package.json +36 -0
package/README.md ADDED
@@ -0,0 +1,285 @@
1
+ # @thymian/core-testing
2
+
3
+ Testing utilities, factories, and mocks for the Thymian plugin ecosystem.
4
+
5
+ ## Overview
6
+
7
+ `@thymian/core-testing` provides reusable testing utilities that make it easy to write tests for Thymian plugins and components. It includes:
8
+
9
+ - **Factories** for creating test data with sensible defaults
10
+ - **Mocks** for all major Thymian interfaces
11
+ - **Type-safe** utilities that match the `@thymian/core` types exactly
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install --save-dev @thymian/core-testing
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ```typescript
22
+ import { createHttpRequest, createHttpResponse, createMockLogger, createMockEmitter, createMockPlugin } from '@thymian/core-testing';
23
+
24
+ // Create test data with sensible defaults
25
+ const request = createGetRequest({ path: '/users' });
26
+ const response = createOkResponse();
27
+
28
+ // Create test doubles
29
+ const logger = createMockLogger();
30
+ const emitter = createMockEmitter();
31
+
32
+ // Test your plugin
33
+ await myPlugin(emitter, logger, { cwd: '/test' });
34
+
35
+ // Assert on calls
36
+ expect(logger.info).toHaveBeenCalled();
37
+ expect(emitter.emit).toHaveBeenCalledWith('core.register', expect.any(Object));
38
+ ```
39
+
40
+ ## API Reference
41
+
42
+ ### Factories
43
+
44
+ #### Schema Factories
45
+
46
+ Create ThymianSchema objects with sensible defaults:
47
+
48
+ ```typescript
49
+ import { createThymianSchema, createStringSchema, createNumberSchema, createIntegerSchema, createBooleanSchema, createObjectSchema, createArraySchema } from '@thymian/core-testing';
50
+
51
+ // Basic schemas
52
+ const stringSchema = createStringSchema({ minLength: 5, maxLength: 50 });
53
+ const numberSchema = createNumberSchema({ minimum: 0, maximum: 100 });
54
+ const integerSchema = createIntegerSchema();
55
+ const booleanSchema = createBooleanSchema();
56
+
57
+ // Complex schemas
58
+ const objectSchema = createObjectSchema({
59
+ name: createStringSchema(),
60
+ age: createIntegerSchema(),
61
+ });
62
+
63
+ const arraySchema = createArraySchema(createStringSchema());
64
+ ```
65
+
66
+ #### Parameter Factories
67
+
68
+ Create Parameter objects:
69
+
70
+ ```typescript
71
+ import { createParameter, createRequiredParameter, createOptionalParameter } from '@thymian/core-testing';
72
+
73
+ const param = createParameter({
74
+ description: 'User ID',
75
+ schema: createIntegerSchema(),
76
+ });
77
+
78
+ const requiredParam = createRequiredParameter({
79
+ schema: createStringSchema(),
80
+ });
81
+ ```
82
+
83
+ #### HTTP Request Factories
84
+
85
+ Create ThymianHttpRequest objects:
86
+
87
+ ```typescript
88
+ import { createHttpRequest, createGetRequest, createPostRequest, createPutRequest, createPatchRequest, createDeleteRequest } from '@thymian/core-testing';
89
+
90
+ const getRequest = createGetRequest({
91
+ path: '/api/users',
92
+ queryParameters: {
93
+ page: createParameter({ schema: createIntegerSchema() }),
94
+ },
95
+ });
96
+
97
+ const postRequest = createPostRequest({
98
+ path: '/api/users',
99
+ body: createObjectSchema({
100
+ name: createStringSchema(),
101
+ email: createStringSchema(),
102
+ }),
103
+ });
104
+ ```
105
+
106
+ #### HTTP Response Factories
107
+
108
+ Create ThymianHttpResponse objects:
109
+
110
+ ```typescript
111
+ import { createHttpResponse, createOkResponse, createCreatedResponse, createNoContentResponse, createBadRequestResponse, createUnauthorizedResponse, createForbiddenResponse, createNotFoundResponse, createInternalServerErrorResponse } from '@thymian/core-testing';
112
+
113
+ const okResponse = createOkResponse({
114
+ schema: createObjectSchema({
115
+ id: createIntegerSchema(),
116
+ name: createStringSchema(),
117
+ }),
118
+ });
119
+
120
+ const errorResponse = createNotFoundResponse({
121
+ description: 'User not found',
122
+ });
123
+ ```
124
+
125
+ #### ThymianFormat Factories
126
+
127
+ Create ThymianFormat instances:
128
+
129
+ ```typescript
130
+ import { createThymianFormat, createThymianFormatWithTransaction, createThymianFormatWithTransactions } from '@thymian/core-testing';
131
+
132
+ // Empty format
133
+ const format = createThymianFormat();
134
+
135
+ // Format with one transaction
136
+ const formatWithOne = createThymianFormatWithTransaction(createGetRequest({ path: '/users' }), createOkResponse());
137
+
138
+ // Format with multiple transactions
139
+ const formatWithMany = createThymianFormatWithTransactions([
140
+ [createGetRequest({ path: '/users' }), createOkResponse()],
141
+ [createPostRequest({ path: '/users' }), createCreatedResponse()],
142
+ ]);
143
+
144
+ // Format with 10 transactions
145
+ const formatWithSpecificNumber = createThymianFormatWithTransactions(10);
146
+ ```
147
+
148
+ ### Mocks
149
+
150
+ #### Logger Mock
151
+
152
+ Create mock Logger instances:
153
+
154
+ ```typescript
155
+ import { createMockLogger, createVerboseMockLogger, createSilentMockLogger } from '@thymian/core-testing';
156
+
157
+ // Standard mock (with vi.fn() spies)
158
+ const logger = createMockLogger({ namespace: 'test-plugin' });
159
+ logger.info('Starting plugin');
160
+ expect(logger.info).toHaveBeenCalledWith('Starting plugin');
161
+
162
+ // Verbose logger
163
+ const verboseLogger = createVerboseMockLogger();
164
+ expect(verboseLogger.verbose).toBe(true);
165
+
166
+ // Silent logger (no spies, just no-ops)
167
+ const silentLogger = createSilentMockLogger();
168
+ ```
169
+
170
+ #### Emitter Mock
171
+
172
+ Create mock ThymianEmitter instances:
173
+
174
+ ```typescript
175
+ import { createMockEmitter, createEmitterWithHandlers, createEmitterWithActionHandlers, captureEmittedEvents } from '@thymian/core-testing';
176
+
177
+ // Standard mock with spies
178
+ const emitter = createMockEmitter();
179
+ await emitter.emit('core.register', { plugin: myPlugin });
180
+ expect(emitter.emit).toHaveBeenCalledWith('core.register', expect.any(Object));
181
+
182
+ // Emitter with pre-configured handlers
183
+ const emitterWithHandlers = createEmitterWithHandlers({
184
+ 'core.error': vi.fn(),
185
+ 'core.register': vi.fn(),
186
+ });
187
+
188
+ // Capture all emitted events
189
+ const events = captureEmittedEvents(emitter);
190
+ await emitter.emit('core.register', { plugin: myPlugin });
191
+ expect(events).toHaveLength(1);
192
+ expect(events[0][0]).toBe('core.register');
193
+ ```
194
+
195
+ #### Plugin Mock
196
+
197
+ Create mock ThymianPlugin instances:
198
+
199
+ ```typescript
200
+ import { createMockPlugin, createSpyPluginFn, createPluginThatEmits, createPluginWithMetadata } from '@thymian/core-testing';
201
+
202
+ // Basic mock plugin
203
+ const plugin = createMockPlugin({
204
+ name: 'test-plugin',
205
+ version: '1.0.0',
206
+ });
207
+
208
+ // Plugin with spy function
209
+ const pluginFn = createSpyPluginFn(async (emitter, logger, options) => {
210
+ logger.info('Plugin started');
211
+ });
212
+ const pluginWithSpy = createMockPlugin({ plugin: pluginFn });
213
+
214
+ // Plugin that emits events
215
+ const emittingPlugin = createPluginThatEmits('core.register', {
216
+ plugin: myPlugin,
217
+ });
218
+
219
+ // Plugin with metadata
220
+ const pluginWithMeta = createPluginWithMetadata({
221
+ name: 'my-plugin',
222
+ version: '1.0.0',
223
+ events: {
224
+ emits: ['core.register'],
225
+ listensOn: ['core.ready'],
226
+ },
227
+ });
228
+ ```
229
+
230
+ ## Examples
231
+
232
+ ### Testing a Plugin
233
+
234
+ ```typescript
235
+ import { describe, it, expect } from 'vitest';
236
+ import { createMockEmitter, createMockLogger } from '@thymian/core-testing';
237
+ import { myPlugin } from './my-plugin.js';
238
+
239
+ describe('myPlugin', () => {
240
+ it('should register itself', async () => {
241
+ const emitter = createMockEmitter();
242
+ const logger = createMockLogger();
243
+
244
+ await myPlugin(emitter, logger, { cwd: '/test' });
245
+
246
+ expect(emitter.emit).toHaveBeenCalledWith(
247
+ 'core.register',
248
+ expect.objectContaining({
249
+ plugin: expect.any(Object),
250
+ }),
251
+ );
252
+ });
253
+
254
+ it('should log startup message', async () => {
255
+ const emitter = createMockEmitter();
256
+ const logger = createMockLogger();
257
+
258
+ await myPlugin(emitter, logger, { cwd: '/test' });
259
+
260
+ expect(logger.info).toHaveBeenCalledWith('Plugin started');
261
+ });
262
+ });
263
+ ```
264
+
265
+ ### Testing Format Transformations
266
+
267
+ ```typescript
268
+ import { describe, it, expect } from 'vitest';
269
+ import { createThymianFormat, createGetRequest, createOkResponse } from '@thymian/core-testing';
270
+ import { transformFormat } from './transform.js';
271
+
272
+ describe('transformFormat', () => {
273
+ it('should transform HTTP transactions', () => {
274
+ const format = createThymianFormat();
275
+ const request = createGetRequest({ path: '/users' });
276
+ const response = createOkResponse();
277
+
278
+ format.addHttpTransaction(request, response);
279
+
280
+ const result = transformFormat(format);
281
+
282
+ expect(result.getHttpTransactions()).toHaveLength(1);
283
+ });
284
+ });
285
+ ```
@@ -0,0 +1,40 @@
1
+ import type { ThymianHttpRequest } from '@thymian/core';
2
+ /**
3
+ * Creates a ThymianHttpRequest with sensible defaults.
4
+ * All properties can be overridden.
5
+ *
6
+ * @param overrides - Partial request to override defaults
7
+ * @returns A complete ThymianHttpRequest object
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const getRequest = createHttpRequest({ method: 'GET', path: '/users' });
12
+ * const postRequest = createHttpRequest({
13
+ * method: 'POST',
14
+ * path: '/users',
15
+ * body: createObjectSchema()
16
+ * });
17
+ * ```
18
+ */
19
+ export declare function createHttpRequest(overrides?: Partial<ThymianHttpRequest>): ThymianHttpRequest;
20
+ /**
21
+ * Creates a GET request
22
+ */
23
+ export declare function createGetRequest(overrides?: Partial<ThymianHttpRequest>): ThymianHttpRequest;
24
+ /**
25
+ * Creates a POST request
26
+ */
27
+ export declare function createPostRequest(overrides?: Partial<ThymianHttpRequest>): ThymianHttpRequest;
28
+ /**
29
+ * Creates a PUT request
30
+ */
31
+ export declare function createPutRequest(overrides?: Partial<ThymianHttpRequest>): ThymianHttpRequest;
32
+ /**
33
+ * Creates a PATCH request
34
+ */
35
+ export declare function createPatchRequest(overrides?: Partial<ThymianHttpRequest>): ThymianHttpRequest;
36
+ /**
37
+ * Creates a DELETE request
38
+ */
39
+ export declare function createDeleteRequest(overrides?: Partial<ThymianHttpRequest>): ThymianHttpRequest;
40
+ //# sourceMappingURL=http-request.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-request.factory.d.ts","sourceRoot":"","sources":["../../src/factories/http-request.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CAkBpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CAKpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CAMpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CAMpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CAMpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CAKpB"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Creates a ThymianHttpRequest with sensible defaults.
3
+ * All properties can be overridden.
4
+ *
5
+ * @param overrides - Partial request to override defaults
6
+ * @returns A complete ThymianHttpRequest object
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const getRequest = createHttpRequest({ method: 'GET', path: '/users' });
11
+ * const postRequest = createHttpRequest({
12
+ * method: 'POST',
13
+ * path: '/users',
14
+ * body: createObjectSchema()
15
+ * });
16
+ * ```
17
+ */
18
+ export function createHttpRequest(overrides = {}) {
19
+ return {
20
+ type: 'http-request',
21
+ label: overrides.label ||
22
+ `${overrides.method || 'GET'} ${overrides.path || '/'}`,
23
+ host: 'localhost',
24
+ port: 443,
25
+ protocol: 'https',
26
+ path: '/',
27
+ method: 'GET',
28
+ headers: {},
29
+ queryParameters: {},
30
+ cookies: {},
31
+ pathParameters: {},
32
+ mediaType: '',
33
+ ...overrides,
34
+ };
35
+ }
36
+ /**
37
+ * Creates a GET request
38
+ */
39
+ export function createGetRequest(overrides = {}) {
40
+ return createHttpRequest({
41
+ method: 'GET',
42
+ ...overrides,
43
+ });
44
+ }
45
+ /**
46
+ * Creates a POST request
47
+ */
48
+ export function createPostRequest(overrides = {}) {
49
+ return createHttpRequest({
50
+ method: 'POST',
51
+ mediaType: 'application/json',
52
+ ...overrides,
53
+ });
54
+ }
55
+ /**
56
+ * Creates a PUT request
57
+ */
58
+ export function createPutRequest(overrides = {}) {
59
+ return createHttpRequest({
60
+ method: 'PUT',
61
+ mediaType: 'application/json',
62
+ ...overrides,
63
+ });
64
+ }
65
+ /**
66
+ * Creates a PATCH request
67
+ */
68
+ export function createPatchRequest(overrides = {}) {
69
+ return createHttpRequest({
70
+ method: 'PATCH',
71
+ mediaType: 'application/json',
72
+ ...overrides,
73
+ });
74
+ }
75
+ /**
76
+ * Creates a DELETE request
77
+ */
78
+ export function createDeleteRequest(overrides = {}) {
79
+ return createHttpRequest({
80
+ method: 'DELETE',
81
+ ...overrides,
82
+ });
83
+ }
84
+ //# sourceMappingURL=http-request.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-request.factory.js","sourceRoot":"","sources":["../../src/factories/http-request.factory.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAyC,EAAE;IAE3C,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,KAAK,EACH,SAAS,CAAC,KAAK;YACf,GAAG,SAAS,CAAC,MAAM,IAAI,KAAK,IAAI,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE;QACzD,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,GAAG;QACT,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,EAAE;QACnB,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE,EAAE;QACb,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAAyC,EAAE;IAE3C,OAAO,iBAAiB,CAAC;QACvB,MAAM,EAAE,KAAK;QACb,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAyC,EAAE;IAE3C,OAAO,iBAAiB,CAAC;QACvB,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,kBAAkB;QAC7B,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAAyC,EAAE;IAE3C,OAAO,iBAAiB,CAAC;QACvB,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,kBAAkB;QAC7B,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAyC,EAAE;IAE3C,OAAO,iBAAiB,CAAC;QACvB,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,kBAAkB;QAC7B,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAAyC,EAAE;IAE3C,OAAO,iBAAiB,CAAC;QACvB,MAAM,EAAE,QAAQ;QAChB,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { ThymianHttpResponse } from '@thymian/core';
2
+ /**
3
+ * Creates a ThymianHttpResponse with sensible defaults.
4
+ * All properties can be overridden.
5
+ *
6
+ * @param overrides - Partial response to override defaults
7
+ * @returns A complete ThymianHttpResponse object
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const okResponse = createHttpResponse({ statusCode: 200 });
12
+ * const errorResponse = createHttpResponse({
13
+ * statusCode: 404,
14
+ * description: 'Not Found'
15
+ * });
16
+ * ```
17
+ */
18
+ export declare function createHttpResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
19
+ /**
20
+ * Creates a 200 OK response
21
+ */
22
+ export declare function createOkResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
23
+ /**
24
+ * Creates a 201 Created response
25
+ */
26
+ export declare function createCreatedResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
27
+ /**
28
+ * Creates a 204 No Content response
29
+ */
30
+ export declare function createNoContentResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
31
+ /**
32
+ * Creates a 400 Bad Request response
33
+ */
34
+ export declare function createBadRequestResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
35
+ /**
36
+ * Creates a 401 Unauthorized response
37
+ */
38
+ export declare function createUnauthorizedResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
39
+ /**
40
+ * Creates a 403 Forbidden response
41
+ */
42
+ export declare function createForbiddenResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
43
+ /**
44
+ * Creates a 404 Not Found response
45
+ */
46
+ export declare function createNotFoundResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
47
+ /**
48
+ * Creates a 500 Internal Server Error response
49
+ */
50
+ export declare function createInternalServerErrorResponse(overrides?: Partial<ThymianHttpResponse>): ThymianHttpResponse;
51
+ //# sourceMappingURL=http-response.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-response.factory.d.ts","sourceRoot":"","sources":["../../src/factories/http-response.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAUrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAMrB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAMrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAOrB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAMrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAMrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAMrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAMrB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CAMrB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Creates a ThymianHttpResponse with sensible defaults.
3
+ * All properties can be overridden.
4
+ *
5
+ * @param overrides - Partial response to override defaults
6
+ * @returns A complete ThymianHttpResponse object
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * const okResponse = createHttpResponse({ statusCode: 200 });
11
+ * const errorResponse = createHttpResponse({
12
+ * statusCode: 404,
13
+ * description: 'Not Found'
14
+ * });
15
+ * ```
16
+ */
17
+ export function createHttpResponse(overrides = {}) {
18
+ const statusCode = overrides.statusCode || 200;
19
+ return {
20
+ type: 'http-response',
21
+ label: overrides.label || `Response ${statusCode}`,
22
+ statusCode,
23
+ headers: {},
24
+ mediaType: 'application/json',
25
+ ...overrides,
26
+ };
27
+ }
28
+ /**
29
+ * Creates a 200 OK response
30
+ */
31
+ export function createOkResponse(overrides = {}) {
32
+ return createHttpResponse({
33
+ statusCode: 200,
34
+ description: 'OK',
35
+ ...overrides,
36
+ });
37
+ }
38
+ /**
39
+ * Creates a 201 Created response
40
+ */
41
+ export function createCreatedResponse(overrides = {}) {
42
+ return createHttpResponse({
43
+ statusCode: 201,
44
+ description: 'Created',
45
+ ...overrides,
46
+ });
47
+ }
48
+ /**
49
+ * Creates a 204 No Content response
50
+ */
51
+ export function createNoContentResponse(overrides = {}) {
52
+ return createHttpResponse({
53
+ statusCode: 204,
54
+ description: 'No Content',
55
+ mediaType: '',
56
+ ...overrides,
57
+ });
58
+ }
59
+ /**
60
+ * Creates a 400 Bad Request response
61
+ */
62
+ export function createBadRequestResponse(overrides = {}) {
63
+ return createHttpResponse({
64
+ statusCode: 400,
65
+ description: 'Bad Request',
66
+ ...overrides,
67
+ });
68
+ }
69
+ /**
70
+ * Creates a 401 Unauthorized response
71
+ */
72
+ export function createUnauthorizedResponse(overrides = {}) {
73
+ return createHttpResponse({
74
+ statusCode: 401,
75
+ description: 'Unauthorized',
76
+ ...overrides,
77
+ });
78
+ }
79
+ /**
80
+ * Creates a 403 Forbidden response
81
+ */
82
+ export function createForbiddenResponse(overrides = {}) {
83
+ return createHttpResponse({
84
+ statusCode: 403,
85
+ description: 'Forbidden',
86
+ ...overrides,
87
+ });
88
+ }
89
+ /**
90
+ * Creates a 404 Not Found response
91
+ */
92
+ export function createNotFoundResponse(overrides = {}) {
93
+ return createHttpResponse({
94
+ statusCode: 404,
95
+ description: 'Not Found',
96
+ ...overrides,
97
+ });
98
+ }
99
+ /**
100
+ * Creates a 500 Internal Server Error response
101
+ */
102
+ export function createInternalServerErrorResponse(overrides = {}) {
103
+ return createHttpResponse({
104
+ statusCode: 500,
105
+ description: 'Internal Server Error',
106
+ ...overrides,
107
+ });
108
+ }
109
+ //# sourceMappingURL=http-response.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-response.factory.js","sourceRoot":"","sources":["../../src/factories/http-response.factory.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAA0C,EAAE;IAE5C,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,GAAG,CAAC;IAC/C,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,YAAY,UAAU,EAAE;QAClD,UAAU;QACV,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,kBAAkB;QAC7B,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,IAAI;QACjB,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,SAAS;QACtB,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,EAAE;QACb,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,aAAa;QAC1B,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,cAAc;QAC3B,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,WAAW;QACxB,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,WAAW;QACxB,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAC/C,YAA0C,EAAE;IAE5C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,uBAAuB;QACpC,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Parameter } from '@thymian/core';
2
+ /**
3
+ * Creates a Parameter with sensible defaults.
4
+ * All properties can be overridden.
5
+ *
6
+ * @param overrides - Partial parameter to override defaults
7
+ * @returns A complete Parameter object
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const requiredParam = createParameter({ required: true });
12
+ * const customParam = createParameter({
13
+ * description: 'User ID',
14
+ * required: true,
15
+ * schema: createIntegerSchema()
16
+ * });
17
+ * ```
18
+ */
19
+ export declare function createParameter(overrides?: Partial<Parameter>): Parameter;
20
+ /**
21
+ * Creates a required Parameter
22
+ */
23
+ export declare function createRequiredParameter(overrides?: Partial<Parameter>): Parameter;
24
+ /**
25
+ * Creates an optional Parameter
26
+ */
27
+ export declare function createOptionalParameter(overrides?: Partial<Parameter>): Parameter;
28
+ //# sourceMappingURL=parameter.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter.factory.d.ts","sourceRoot":"","sources":["../../src/factories/parameter.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,SAAS,CAU7E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM,GACjC,SAAS,CAKX;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM,GACjC,SAAS,CAKX"}
@@ -0,0 +1,48 @@
1
+ import { createStringSchema } from './schema.factory.js';
2
+ /**
3
+ * Creates a Parameter with sensible defaults.
4
+ * All properties can be overridden.
5
+ *
6
+ * @param overrides - Partial parameter to override defaults
7
+ * @returns A complete Parameter object
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const requiredParam = createParameter({ required: true });
12
+ * const customParam = createParameter({
13
+ * description: 'User ID',
14
+ * required: true,
15
+ * schema: createIntegerSchema()
16
+ * });
17
+ * ```
18
+ */
19
+ export function createParameter(overrides = {}) {
20
+ return {
21
+ required: false,
22
+ schema: createStringSchema(),
23
+ style: {
24
+ explode: false,
25
+ style: 'simple',
26
+ },
27
+ ...overrides,
28
+ };
29
+ }
30
+ /**
31
+ * Creates a required Parameter
32
+ */
33
+ export function createRequiredParameter(overrides = {}) {
34
+ return createParameter({
35
+ required: true,
36
+ ...overrides,
37
+ });
38
+ }
39
+ /**
40
+ * Creates an optional Parameter
41
+ */
42
+ export function createOptionalParameter(overrides = {}) {
43
+ return createParameter({
44
+ required: false,
45
+ ...overrides,
46
+ });
47
+ }
48
+ //# sourceMappingURL=parameter.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameter.factory.js","sourceRoot":"","sources":["../../src/factories/parameter.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,YAAgC,EAAE;IAChE,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,kBAAkB,EAAE;QAC5B,KAAK,EAAE;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,QAAQ;SAChB;QACD,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAgC,EAAE;IAElC,OAAO,eAAe,CAAC;QACrB,QAAQ,EAAE,IAAI;QACd,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAgC,EAAE;IAElC,OAAO,eAAe,CAAC;QACrB,QAAQ,EAAE,KAAK;QACf,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC"}