@thymian/plugin-http-tester 0.1.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.
@@ -0,0 +1,4 @@
1
+ import { type Logger, ThymianEmitter, ThymianFormat } from '@thymian/core';
2
+ import { type HttpTestContextLocals } from '@thymian/core';
3
+ export declare function createContext<Locals extends HttpTestContextLocals>(format: ThymianFormat, logger: Logger, emitter: ThymianEmitter, origin?: string, locals?: Locals): import("@thymian/core").HttpTestContext<Locals>;
4
+ //# sourceMappingURL=create-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-context.d.ts","sourceRoot":"","sources":["../src/create-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACX,cAAc,EACd,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAEvB,wBAAgB,aAAa,CAAC,MAAM,SAAS,qBAAqB,EAChE,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,GAAE,MAAqB,mDAgC9B"}
@@ -0,0 +1,25 @@
1
+ import { ThymianEmitter, ThymianFormat, } from '@thymian/core';
2
+ import { createHttpTestContext, createHttpTestHookRunnerFromThymianEmitter, } from '@thymian/core';
3
+ export function createContext(format, logger, emitter, origin, locals = {}) {
4
+ return createHttpTestContext({
5
+ format,
6
+ logger,
7
+ locals,
8
+ sampleRequest: async function (transaction) {
9
+ return await emitter.emitAction('core.request.sample', { transaction }, { strategy: 'first' });
10
+ },
11
+ runRequest: async function (req) {
12
+ const finalOrigin = origin ?? req.origin;
13
+ return await emitter.emitAction('core.request.dispatch', {
14
+ request: {
15
+ ...req,
16
+ origin: finalOrigin,
17
+ },
18
+ }, {
19
+ strategy: 'first',
20
+ });
21
+ },
22
+ runHook: createHttpTestHookRunnerFromThymianEmitter(emitter),
23
+ });
24
+ }
25
+ //# sourceMappingURL=create-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-context.js","sourceRoot":"","sources":["../src/create-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,cAAc,EACd,aAAa,GAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,0CAA0C,GAE3C,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,MAAc,EACd,OAAuB,EACvB,MAAe,EACf,SAAiB,EAAY;IAE7B,OAAO,qBAAqB,CAAC;QAC3B,MAAM;QACN,MAAM;QACN,MAAM;QACN,aAAa,EAAE,KAAK,WAClB,WAAmC;YAEnC,OAAO,MAAM,OAAO,CAAC,UAAU,CAC7B,qBAAqB,EACrB,EAAE,WAAW,EAAE,EACf,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;QACJ,CAAC;QACD,UAAU,EAAE,KAAK,WAAW,GAAgB;YAC1C,MAAM,WAAW,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;YACzC,OAAO,MAAM,OAAO,CAAC,UAAU,CAC7B,uBAAuB,EACvB;gBACE,OAAO,EAAE;oBACP,GAAG,GAAG;oBACN,MAAM,EAAE,WAAW;iBACpB;aACF,EACD;gBACE,QAAQ,EAAE,OAAO;aAClB,CACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,0CAA0C,CAAC,OAAO,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type CommonHttpRequest, type CommonHttpResponse, type HttpFilterExpression, type HttpRequest, type HttpResponse, type ReportFn, type RuleFnResult, type RuleViolation, type RuleViolationLocation, type TestContext, ThymianFormat, type ValidationFn } from '@thymian/core';
2
+ import { type HttpTestContext, type HttpTestContextLocals, type HttpTestPipeline, type HttpTestResult } from '@thymian/core';
3
+ export declare class HttpTestApiContext<Locals extends HttpTestContextLocals = HttpTestContextLocals> implements TestContext {
4
+ private readonly name;
5
+ private readonly skippedOrigins;
6
+ private readonly pluginSource;
7
+ readonly format: ThymianFormat;
8
+ readonly report: ReportFn;
9
+ private readonly violations;
10
+ private readonly ctx;
11
+ constructor(name: string, ctx: HttpTestContext<Locals>, report?: ReportFn, skippedOrigins?: string[], pluginSource?: string);
12
+ reportViolation(violation: RuleViolation): void;
13
+ validateGroupedCommonHttpTransactions(filterExpr: HttpFilterExpression, groupByExpression: HttpFilterExpression, validationFn: ValidationFn<[
14
+ string,
15
+ [
16
+ CommonHttpRequest,
17
+ CommonHttpResponse,
18
+ RuleViolationLocation
19
+ ][]
20
+ ], RuleViolation | undefined>): Promise<RuleFnResult>;
21
+ validateCommonHttpTransactions(filterExpr: HttpFilterExpression, validate?: ValidationFn<[
22
+ CommonHttpRequest,
23
+ CommonHttpResponse,
24
+ RuleViolationLocation
25
+ ]> | HttpFilterExpression): Promise<RuleFnResult>;
26
+ private reportSkippedAndFailedTestCases;
27
+ httpTest(pipeline: HttpTestPipeline<Locals>): Promise<RuleFnResult>;
28
+ runHttpTest(pipeline: HttpTestPipeline<Locals>): Promise<HttpTestResult>;
29
+ validateHttpTransactions(filterExpr: HttpFilterExpression, validation?: ValidationFn<[
30
+ HttpRequest,
31
+ HttpResponse,
32
+ {
33
+ elementType: 'node' | 'edge';
34
+ elementId: string;
35
+ pointer?: string;
36
+ }
37
+ ]> | HttpFilterExpression): Promise<RuleFnResult>;
38
+ }
39
+ //# sourceMappingURL=http-test-api-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-test-api-context.d.ts","sourceRoot":"","sources":["../src/http-test-api-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAEvB,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAEhB,KAAK,YAAY,EAEjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAEhB,aAAa,EAIb,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAOL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAIpB,MAAM,eAAe,CAAC;AAevB,qBAAa,kBAAkB,CAC7B,MAAM,SAAS,qBAAqB,GAAG,qBAAqB,CAC5D,YAAW,WAAW;IAOpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAGrB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAV/B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0B;gBAG3B,IAAI,EAAE,MAAM,EAC7B,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,EAC5B,MAAM,GAAE,QAA0B,EACjB,cAAc,GAAE,MAAM,EAAO,EAC7B,YAAY,SAAgC;IAuB/D,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAIzC,qCAAqC,CACzC,UAAU,EAAE,oBAAoB,EAChC,iBAAiB,EAAE,oBAAoB,EACvC,YAAY,EAAE,YAAY,CACxB;QACE,MAAM;QACN;YAAC,iBAAiB;YAAE,kBAAkB;YAAE,qBAAqB;SAAC,EAAE;KACjE,EACD,aAAa,GAAG,SAAS,CAC1B,GACA,OAAO,CAAC,YAAY,CAAC;IA2DlB,8BAA8B,CAClC,UAAU,EAAE,oBAAoB,EAChC,QAAQ,GACJ,YAAY,CACV;QAAC,iBAAiB;QAAE,kBAAkB;QAAE,qBAAqB;KAAC,CAC/D,GACD,oBAAiC,GACpC,OAAO,CAAC,YAAY,CAAC;IA0ExB,OAAO,CAAC,+BAA+B;IAoGjC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAUnE,WAAW,CACf,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,cAAc,CAAC;IAMpB,wBAAwB,CAC5B,UAAU,EAAE,oBAAoB,EAChC,UAAU,GACN,YAAY,CACV;QACE,WAAW;QACX,YAAY;QACZ;YACE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;YAC7B,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB;KACF,CACF,GACD,oBAAiC,GACpC,OAAO,CAAC,YAAY,CAAC;CA8DzB"}
@@ -0,0 +1,257 @@
1
+ import { createRegExpFromOriginWildcard, httpRequestToCommonHttpRequest, httpResponseToCommonHttpResponse, ThymianBaseError, ThymianFormat, thymianRequestToOrigin, } from '@thymian/core';
2
+ import { generateRequests, httpTest, mapToGroupedTestCase, runRequests, singleTestCase, } from '@thymian/core';
3
+ import { filter, groupBy } from 'rxjs';
4
+ import { httpFilterExpressionToFilter } from './visitors/http-filter-expression-to-filter.js';
5
+ import { httpFilterToGroupByFn } from './visitors/http-filter-to-static-by-fn.js';
6
+ import { httpFilterToTransactionValidationFn } from './visitors/http-filter-to-transaction-validation-fn.js';
7
+ function hasSource(transaction) {
8
+ return 'source' in transaction;
9
+ }
10
+ export class HttpTestApiContext {
11
+ name;
12
+ skippedOrigins;
13
+ pluginSource;
14
+ format;
15
+ report;
16
+ violations = [];
17
+ ctx;
18
+ constructor(name, ctx, report = () => undefined, skippedOrigins = [], pluginSource = '@thymian/plugin-http-tester') {
19
+ this.name = name;
20
+ this.skippedOrigins = skippedOrigins;
21
+ this.pluginSource = pluginSource;
22
+ this.report = report;
23
+ if (skippedOrigins.length === 0) {
24
+ this.format = ctx.format;
25
+ }
26
+ else {
27
+ const regExps = skippedOrigins.map(createRegExpFromOriginWildcard);
28
+ this.format = ctx.format.filter(({ thymianReq }) => !regExps.some((regExp) => regExp.test(thymianRequestToOrigin(thymianReq))));
29
+ }
30
+ this.ctx = {
31
+ ...ctx,
32
+ format: this.format,
33
+ };
34
+ }
35
+ reportViolation(violation) {
36
+ this.violations.push(violation);
37
+ }
38
+ async validateGroupedCommonHttpTransactions(filterExpr, groupByExpression, validationFn) {
39
+ const filterFn = httpFilterExpressionToFilter(filterExpr);
40
+ const groupByFn = httpFilterToGroupByFn(groupByExpression);
41
+ const test = httpTest(this.name, (test) => test.pipe(filter(({ current, ctx }) => filterFn(current, ctx.format)), groupBy(({ current, ctx }) => groupByFn(current, ctx.format)), mapToGroupedTestCase(), generateRequests(), runRequests()));
42
+ const testResult = await test(this.ctx);
43
+ this.reportSkippedAndFailedTestCases(testResult);
44
+ return testResult.cases
45
+ .filter((testCase) => testCase.status === 'passed')
46
+ .reduce((violations, value) => {
47
+ const testCase = value;
48
+ const { source, transactions } = testCase.steps[0];
49
+ const transactionsToValidate = transactions
50
+ .filter(hasSource)
51
+ .map((transaction) => [
52
+ httpRequestToCommonHttpRequest(
53
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
54
+ transaction.request, transaction.source.thymianReqId),
55
+ httpResponseToCommonHttpResponse(
56
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
57
+ transaction.response, transaction.source.thymianResId),
58
+ {
59
+ elementId: transaction.source.transactionId,
60
+ elementType: 'edge',
61
+ },
62
+ ]);
63
+ const validationResult = validationFn(source.key, transactionsToValidate);
64
+ if (validationResult) {
65
+ violations.push(validationResult);
66
+ }
67
+ return violations;
68
+ }, [])
69
+ .concat(this.violations);
70
+ }
71
+ async validateCommonHttpTransactions(filterExpr, validate = filterExpr) {
72
+ const test = httpTest(this.name, singleTestCase().forTransactionsWith(filterExpr).run().done());
73
+ const testResult = await test(this.ctx);
74
+ this.reportSkippedAndFailedTestCases(testResult);
75
+ return testResult.cases
76
+ .filter((testCase) => testCase.status === 'passed')
77
+ .flatMap((testCase) => testCase.steps.flatMap((step) => {
78
+ const violations = [];
79
+ for (const transaction of step.transactions) {
80
+ const { request, response, source } = transaction;
81
+ if (!request || !response || !source) {
82
+ throw new Error('Invalid HTTP test case transaction.');
83
+ }
84
+ if (typeof validate === 'function') {
85
+ const validationResult = validate(httpRequestToCommonHttpRequest(request, source.thymianReqId), httpResponseToCommonHttpResponse(response, source.thymianResId), {
86
+ elementType: 'edge',
87
+ elementId: source.transactionId,
88
+ });
89
+ if (typeof validationResult === 'boolean' && validationResult) {
90
+ violations.push({
91
+ location: {
92
+ elementType: 'edge',
93
+ elementId: source.transactionId,
94
+ pointer: '',
95
+ },
96
+ });
97
+ }
98
+ if (validationResult && typeof validationResult === 'object') {
99
+ violations.push({
100
+ location: {
101
+ elementType: 'edge',
102
+ elementId: source.transactionId,
103
+ pointer: '',
104
+ },
105
+ ...validationResult,
106
+ });
107
+ }
108
+ }
109
+ else {
110
+ const validateFn = httpFilterToTransactionValidationFn(validate);
111
+ const validationResult = validateFn(request, response);
112
+ if (typeof validationResult === 'boolean' && validationResult) {
113
+ violations.push({
114
+ location: {
115
+ elementType: 'edge',
116
+ elementId: source.transactionId,
117
+ pointer: '',
118
+ },
119
+ });
120
+ }
121
+ }
122
+ }
123
+ return violations;
124
+ }))
125
+ .concat(this.violations);
126
+ }
127
+ reportSkippedAndFailedTestCases(testResult) {
128
+ const skippedItems = [];
129
+ const failedItems = [];
130
+ testResult.cases.forEach((testCase) => {
131
+ if (testCase.status === 'skipped') {
132
+ this.ctx.logger.debug(`HTTP test case "${testCase.name}" from test "${this.name}" is skipped.`);
133
+ skippedItems.push({
134
+ name: testCase.name,
135
+ reason: testCase.reason ??
136
+ testCase.results
137
+ .filter((tc) => tc.type !== 'info' && tc.type !== 'assertion-success')
138
+ .map((tc) => tc.message)
139
+ .join('\n'),
140
+ });
141
+ }
142
+ else if (testCase.status === 'failed') {
143
+ this.ctx.logger.debug(`HTTP test case "${testCase.name}" from test "${this.name}" failed.`);
144
+ const assertionFailure = testCase.results.find((r) => r.type === 'assertion-failure' && !!r.transaction);
145
+ if (assertionFailure && assertionFailure.transaction) {
146
+ this.reportViolation({
147
+ location: {
148
+ elementType: 'edge',
149
+ elementId: assertionFailure.transaction.transactionId,
150
+ },
151
+ });
152
+ }
153
+ else {
154
+ failedItems.push({
155
+ name: testCase.name,
156
+ reason: testCase.reason ??
157
+ testCase.results
158
+ .filter((tc) => tc.type !== 'info' && tc.type !== 'assertion-success')
159
+ .map((tc) => tc.message)
160
+ .join('\n'),
161
+ });
162
+ }
163
+ }
164
+ });
165
+ if (skippedItems.length === 0 && failedItems.length === 0) {
166
+ return;
167
+ }
168
+ const sections = [];
169
+ if (skippedItems.length > 0) {
170
+ sections.push({
171
+ heading: 'Skipped test cases',
172
+ items: skippedItems.map((item) => ({
173
+ severity: 'info',
174
+ message: item.name,
175
+ details: item.reason,
176
+ })),
177
+ });
178
+ }
179
+ if (failedItems.length > 0) {
180
+ sections.push({
181
+ heading: 'Failed test cases',
182
+ items: failedItems.map((item) => ({
183
+ severity: 'warn',
184
+ message: item.name,
185
+ details: item.reason,
186
+ })),
187
+ });
188
+ }
189
+ const parts = [];
190
+ if (skippedItems.length > 0) {
191
+ parts.push(`${skippedItems.length} test case${skippedItems.length === 1 ? '' : 's'} skipped`);
192
+ }
193
+ if (failedItems.length > 0) {
194
+ parts.push(`${failedItems.length} test case${failedItems.length === 1 ? '' : 's'} failed`);
195
+ }
196
+ this.report({
197
+ source: this.pluginSource,
198
+ message: `[${this.name}] ${parts.join(' and ')}`,
199
+ sections,
200
+ });
201
+ }
202
+ async httpTest(pipeline) {
203
+ const testFn = httpTest(this.name, pipeline);
204
+ const testResult = await testFn(this.ctx);
205
+ this.reportSkippedAndFailedTestCases(testResult);
206
+ return this.violations;
207
+ }
208
+ async runHttpTest(pipeline) {
209
+ const testFn = httpTest(this.name, pipeline);
210
+ return testFn(this.ctx);
211
+ }
212
+ async validateHttpTransactions(filterExpr, validation = filterExpr) {
213
+ const validationFn = typeof validation === 'function'
214
+ ? validation
215
+ : httpFilterToTransactionValidationFn(validation);
216
+ const test = httpTest(this.name, singleTestCase().forTransactionsWith(filterExpr).run().done());
217
+ const testResult = await test(this.ctx);
218
+ this.reportSkippedAndFailedTestCases(testResult);
219
+ return testResult.cases
220
+ .filter((testCase) => testCase.status === 'passed')
221
+ .flatMap((testCase) => testCase.steps.flatMap((step) => {
222
+ const violations = [];
223
+ for (const transaction of step.transactions) {
224
+ const { request, response, source } = transaction;
225
+ if (!request || !response || !source) {
226
+ throw new ThymianBaseError('Invalid HTTP test case transaction: missing request, response, or source.');
227
+ }
228
+ const validationResult = validationFn(request, response, {
229
+ elementType: 'edge',
230
+ elementId: source.transactionId,
231
+ });
232
+ if (typeof validationResult === 'boolean' && validationResult) {
233
+ violations.push({
234
+ location: {
235
+ elementType: 'edge',
236
+ elementId: source.transactionId,
237
+ pointer: '',
238
+ },
239
+ });
240
+ }
241
+ if (validationResult && typeof validationResult === 'object') {
242
+ violations.push({
243
+ location: {
244
+ elementType: 'edge',
245
+ elementId: source.transactionId,
246
+ pointer: '',
247
+ },
248
+ ...validationResult,
249
+ });
250
+ }
251
+ }
252
+ return violations;
253
+ }))
254
+ .concat(this.violations);
255
+ }
256
+ }
257
+ //# sourceMappingURL=http-test-api-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-test-api-context.js","sourceRoot":"","sources":["../src/http-test-api-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ThymianPlugin } from '@thymian/core';
2
+ export { createContext } from './create-context.js';
3
+ export { HttpTestApiContext } from './http-test-api-context.js';
4
+ export type HttpTesterPluginOptions = Record<string, never>;
5
+ export declare function createHttpTesterPlugin(pluginName?: string): ThymianPlugin<HttpTesterPluginOptions>;
6
+ export declare const httpTesterPlugin: ThymianPlugin<HttpTesterPluginOptions>;
7
+ export default httpTesterPlugin;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,aAAa,EAEnB,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE5D,wBAAgB,sBAAsB,CACpC,UAAU,SAAgC,GACzC,aAAa,CAAC,uBAAuB,CAAC,CA2ExC;AAED,eAAO,MAAM,gBAAgB,wCAA2B,CAAC;AAEzD,eAAe,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ import { runRules, ThymianBaseError, ThymianFormat, } from '@thymian/core';
2
+ import { createContext } from './create-context.js';
3
+ import { HttpTestApiContext } from './http-test-api-context.js';
4
+ export { createContext } from './create-context.js';
5
+ export { HttpTestApiContext } from './http-test-api-context.js';
6
+ export function createHttpTesterPlugin(pluginName = '@thymian/plugin-http-tester') {
7
+ return {
8
+ name: pluginName,
9
+ version: '0.x',
10
+ actions: {
11
+ listensOn: ['core.test'],
12
+ },
13
+ async plugin(emitter, logger) {
14
+ emitter.onAction('core.test', async ({ format, rules = [], rulesConfig = {}, targetUrl }, ctx) => {
15
+ const thymianFormat = ThymianFormat.import(format);
16
+ const reportFn = (report) => emitter.emit('core.report', report);
17
+ let normalizedOrigin;
18
+ if (targetUrl != null) {
19
+ try {
20
+ const url = new URL(targetUrl);
21
+ normalizedOrigin = url.origin;
22
+ }
23
+ catch (error) {
24
+ throw new ThymianBaseError(`Invalid value for --target-url / config key "targetUrl" ("${targetUrl}"): ${error.message}`, {
25
+ suggestions: [
26
+ 'Provide a valid URL including the protocol (e.g., "http://localhost:3000").',
27
+ ],
28
+ });
29
+ }
30
+ }
31
+ const context = createContext(thymianFormat, logger, emitter, normalizedOrigin);
32
+ const adapter = {
33
+ errorName: 'TestLinterError',
34
+ mode: 'test',
35
+ getRuleFn: (rule) => rule.testRule,
36
+ createContext: (rule, options) => new HttpTestApiContext(rule.meta.name, context, reportFn, (options ?? {}).skipOrigins, pluginName),
37
+ };
38
+ const { violations, statistics } = await runRules(logger, rules, thymianFormat, rulesConfig, adapter);
39
+ ctx.reply({
40
+ source: pluginName,
41
+ status: violations.length === 0 ? 'success' : 'failed',
42
+ violations,
43
+ statistics,
44
+ });
45
+ });
46
+ },
47
+ };
48
+ }
49
+ export const httpTesterPlugin = createHttpTesterPlugin();
50
+ export default httpTesterPlugin;
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EAER,gBAAgB,EAChB,aAAa,GAGd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAIhE,MAAM,UAAU,sBAAsB,CACpC,UAAU,GAAG,6BAA6B;IAE1C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,SAAS,EAAE,CAAC,WAAW,CAAC;SACzB;QACD,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM;YAC1B,OAAO,CAAC,QAAQ,CACd,WAAW,EACX,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE;gBACjE,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,CAAC,MAAqB,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBAEtC,IAAI,gBAAoC,CAAC;gBAEzC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;wBAC/B,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC;oBAChC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,IAAI,gBAAgB,CACxB,6DAA6D,SAAS,OAAQ,KAAe,CAAC,OAAO,EAAE,EACvG;4BACE,WAAW,EAAE;gCACX,6EAA6E;6BAC9E;yBACF,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,MAAM,OAAO,GAAG,aAAa,CAC3B,aAAa,EACb,MAAM,EACN,OAAO,EACP,gBAAgB,CACjB,CAAC;gBAEF,MAAM,OAAO,GAA0C;oBACrD,SAAS,EAAE,iBAAiB;oBAC5B,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ;oBACxC,aAAa,EAAE,CACb,IAAU,EACV,OAA4C,EAC5C,EAAE,CACF,IAAI,kBAAkB,CACpB,IAAI,CAAC,IAAI,CAAC,IAAI,EACd,OAAO,EACP,QAAQ,EACR,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAC3B,UAAU,CACX;iBACJ,CAAC;gBAEF,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAC/C,MAAM,EACN,KAAK,EACL,aAAa,EACb,WAAW,EACX,OAAO,CACR,CAAC;gBAEF,GAAG,CAAC,KAAK,CAAC;oBACR,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;oBACtD,UAAU;oBACV,UAAU;iBACX,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;AAEzD,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type HttpFilterExpression, type ThymianFormat, type ThymianHttpTransaction } from '@thymian/core';
2
+ export type StaticFilter = (thymianTransaction: ThymianHttpTransaction, format: ThymianFormat) => boolean;
3
+ export declare function httpFilterExpressionToFilter(expression: HttpFilterExpression): StaticFilter;
4
+ //# sourceMappingURL=http-filter-expression-to-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-expression-to-filter.d.ts","sourceRoot":"","sources":["../../src/visitors/http-filter-expression-to-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAG5B,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,YAAY,GAAG,CACzB,kBAAkB,EAAE,sBAAsB,EAC1C,MAAM,EAAE,aAAa,KAClB,OAAO,CAAC;AAqIb,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,oBAAoB,GAC/B,YAAY,CAEd"}
@@ -0,0 +1,105 @@
1
+ import { createFilterVisitor, createRegExpFromOriginWildcard, equalsIgnoreCase, thymianRequestToOrigin, visitHttpFilter, } from '@thymian/core';
2
+ const visitor = createFilterVisitor({
3
+ visitMethod({ method }) {
4
+ if (typeof method === 'undefined') {
5
+ return () => false;
6
+ }
7
+ return (transaction) => transaction.thymianReq.method.toLowerCase() === method.toLowerCase();
8
+ },
9
+ visitRequestHeader({ header }) {
10
+ if (typeof header === 'undefined') {
11
+ return () => false;
12
+ }
13
+ return (transaction) => {
14
+ return equalsIgnoreCase(header, ...Object.keys(transaction.thymianReq.headers));
15
+ };
16
+ },
17
+ visitQueryParam({ param }) {
18
+ if (typeof param === 'undefined') {
19
+ return () => false;
20
+ }
21
+ return (transaction) => {
22
+ return equalsIgnoreCase(param, ...Object.keys(transaction.thymianReq.queryParameters));
23
+ };
24
+ },
25
+ visitPath({ path }) {
26
+ if (typeof path === 'undefined') {
27
+ return () => false;
28
+ }
29
+ return (transaction) => transaction.thymianReq.path === path;
30
+ },
31
+ visitHasResponse({ filter }) {
32
+ const nestedFilter = httpFilterExpressionToFilter(filter);
33
+ return (transaction, format) => format
34
+ .getHttpResponsesOf(transaction.thymianReqId)
35
+ .some(([, , transactionId]) => {
36
+ const responseTransaction = format.getThymianHttpTransactionById(transactionId);
37
+ if (!responseTransaction) {
38
+ throw new Error('Cannot find transaction.');
39
+ }
40
+ return nestedFilter(responseTransaction, format);
41
+ });
42
+ },
43
+ visitIsAuthorized({ isAuthorized }) {
44
+ return (transaction, format) => format.requestIsSecured(transaction.thymianReqId) === isAuthorized;
45
+ },
46
+ visitOrigin({ origin }) {
47
+ return (transaction) => {
48
+ const req = transaction.thymianReq;
49
+ return `${req.protocol}://${req.host}:${req.port}` === origin;
50
+ };
51
+ },
52
+ visitHasBody({ hasBody }) {
53
+ return (transaction) => transaction.thymianReq.bodyRequired === hasBody;
54
+ },
55
+ visitPort({ port }) {
56
+ return (transaction) => transaction.thymianReq.port === port;
57
+ },
58
+ visitRequestMediaType({ mediaType }) {
59
+ return (transaction) => transaction.thymianReq.mediaType === mediaType;
60
+ },
61
+ visitUrl({ url }) {
62
+ return (transaction) => {
63
+ const req = transaction.thymianReq;
64
+ return (`${req.protocol}://${req.host}:${req.port}${req.path.startsWith('/') ? req.path : '/' + req.path}` === url);
65
+ };
66
+ },
67
+ visitProtocol({ protocol }) {
68
+ return (transaction) => transaction.thymianReq.protocol === protocol;
69
+ },
70
+ visitStatusCode({ code }) {
71
+ return (transaction) => transaction.thymianRes.statusCode === code;
72
+ },
73
+ visitHasResponseBody({ hasBody }) {
74
+ return (transaction) => !!transaction.thymianRes.schema === hasBody;
75
+ },
76
+ visitResponseHeader({ header }) {
77
+ if (typeof header === 'undefined') {
78
+ return () => false;
79
+ }
80
+ return (transaction) => equalsIgnoreCase(header, ...Object.keys(transaction.thymianRes.headers));
81
+ },
82
+ visitStatusCodeRange({ start, end }) {
83
+ return (transaction) => {
84
+ const statusCode = transaction.thymianRes.statusCode;
85
+ return (Number.isInteger(statusCode) && statusCode >= start && statusCode <= end);
86
+ };
87
+ },
88
+ visitResponseMediaType({ mediaType }) {
89
+ return (transaction) => transaction.thymianRes.mediaType === mediaType;
90
+ },
91
+ visitResponseTrailer() {
92
+ throw new Error('Response trailers are not currently supported.');
93
+ },
94
+ visitMatchesOrigin({ origin }) {
95
+ if (typeof origin !== 'string') {
96
+ return () => false;
97
+ }
98
+ const regExp = createRegExpFromOriginWildcard(origin);
99
+ return (transaction) => regExp.test(thymianRequestToOrigin(transaction.thymianReq));
100
+ },
101
+ });
102
+ export function httpFilterExpressionToFilter(expression) {
103
+ return visitHttpFilter(expression, visitor);
104
+ }
105
+ //# sourceMappingURL=http-filter-expression-to-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-expression-to-filter.js","sourceRoot":"","sources":["../../src/visitors/http-filter-expression-to-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type HttpFilterExpression, ThymianFormat, type ThymianHttpTransaction } from '@thymian/core';
2
+ export type GroupByFn = (transaction: ThymianHttpTransaction, format: ThymianFormat) => string;
3
+ export declare function httpFilterToGroupByFn(expression: HttpFilterExpression): GroupByFn;
4
+ //# sourceMappingURL=http-filter-to-static-by-fn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-static-by-fn.d.ts","sourceRoot":"","sources":["../../src/visitors/http-filter-to-static-by-fn.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAIzB,aAAa,EACb,KAAK,sBAAsB,EAE5B,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,SAAS,GAAG,CACtB,WAAW,EAAE,sBAAsB,EACnC,MAAM,EAAE,aAAa,KAClB,MAAM,CAAC;AAmIZ,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,oBAAoB,GAC/B,SAAS,CAEX"}
@@ -0,0 +1,113 @@
1
+ import { equalsIgnoreCase, ThymianBaseError, ThymianFormat, visitHttpFilter, } from '@thymian/core';
2
+ const visitor = {
3
+ visitOrigin() {
4
+ return (transaction) => {
5
+ const req = transaction.thymianReq;
6
+ return `${req.protocol}://${req.host}:${req.port}`;
7
+ };
8
+ },
9
+ visitUrl() {
10
+ return (transaction) => {
11
+ const req = transaction.thymianReq;
12
+ return `${req.protocol}://${req.host}:${req.port}${req.path.startsWith('/') ? req.path : '/' + req.path}`;
13
+ };
14
+ },
15
+ visitPort() {
16
+ return (transaction) => String(transaction.thymianReq.port);
17
+ },
18
+ visitRequestMediaType() {
19
+ return (transaction) => transaction.thymianReq.mediaType;
20
+ },
21
+ visitResponseMediaType() {
22
+ return (transaction) => transaction.thymianRes.mediaType;
23
+ },
24
+ visitQueryParam({ param }) {
25
+ return (transaction) => {
26
+ if (!param) {
27
+ return '';
28
+ }
29
+ const keys = Object.keys(transaction.thymianReq.queryParameters);
30
+ const found = keys.find((k) => equalsIgnoreCase(k, param));
31
+ return found ? String(transaction.thymianReq.queryParameters[found]) : '';
32
+ };
33
+ },
34
+ visitIsAuthorized() {
35
+ return (transaction, format) => String(format.requestIsSecured(transaction.thymianReqId));
36
+ },
37
+ visitMethod() {
38
+ return (transaction) => transaction.thymianReq.method.toUpperCase();
39
+ },
40
+ visitRequestHeader({ header }) {
41
+ return (transaction) => {
42
+ if (!header) {
43
+ return '';
44
+ }
45
+ const keys = Object.keys(transaction.thymianReq.headers);
46
+ const found = keys.find((k) => equalsIgnoreCase(k, header));
47
+ return found ? String(transaction.thymianReq.headers[found]) : '';
48
+ };
49
+ },
50
+ visitPath() {
51
+ return (transaction) => transaction.thymianReq.path;
52
+ },
53
+ visitStatusCode() {
54
+ return (transaction) => String(transaction.thymianRes.statusCode);
55
+ },
56
+ visitResponseHeader({ header }) {
57
+ return (transaction) => {
58
+ if (!header) {
59
+ return '';
60
+ }
61
+ const keys = Object.keys(transaction.thymianRes.headers);
62
+ const found = keys.find((k) => equalsIgnoreCase(k, header));
63
+ return found ? String(transaction.thymianRes.headers[found]) : '';
64
+ };
65
+ },
66
+ visitHasResponse() {
67
+ throw new ThymianBaseError(`Unsupported group by expression "hasResponse" for grouping common HTTP transactions.`, {
68
+ name: 'UnsupportedGroupByExpression',
69
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
70
+ suggestions: ['Use another expression type.'],
71
+ });
72
+ },
73
+ visitHasBody() {
74
+ throw new ThymianBaseError(`Unsupported group by expression "hasBody" for grouping common HTTP transactions.`, {
75
+ name: 'UnsupportedGroupByExpression',
76
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
77
+ suggestions: ['Use another expression type.'],
78
+ });
79
+ },
80
+ visitHasResponseBody() {
81
+ throw new ThymianBaseError(`Unsupported group by expression "hasResponseBody" for grouping common HTTP transactions.`, {
82
+ name: 'UnsupportedGroupByExpression',
83
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
84
+ suggestions: ['Use another expression type.'],
85
+ });
86
+ },
87
+ visitStatusCodeRange() {
88
+ throw new ThymianBaseError(`Unsupported group by expression "statusCodeRange" for grouping common HTTP transactions.`, {
89
+ name: 'UnsupportedGroupByExpression',
90
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
91
+ suggestions: ['Use another expression type.'],
92
+ });
93
+ },
94
+ visitProtocol() {
95
+ return (transaction) => transaction.thymianReq.protocol;
96
+ },
97
+ visitResponseTrailer() {
98
+ throw new ThymianBaseError(`Unsupported group by expression "responseTrailer" for grouping common HTTP transactions.`, {
99
+ name: 'UnsupportedGroupByExpression',
100
+ ref: 'https://thymian.dev/references/errors/unsupported-group-by-expression/',
101
+ suggestions: ['Use another expression type.'],
102
+ });
103
+ },
104
+ visitAnd(expr) {
105
+ return (transaction, format) => expr.filters
106
+ .map((filter) => httpFilterToGroupByFn(filter)(transaction, format))
107
+ .join(' ');
108
+ },
109
+ };
110
+ export function httpFilterToGroupByFn(expression) {
111
+ return visitHttpFilter(expression, visitor);
112
+ }
113
+ //# sourceMappingURL=http-filter-to-static-by-fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-static-by-fn.js","sourceRoot":"","sources":["../../src/visitors/http-filter-to-static-by-fn.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAIhB,gBAAgB,EAChB,aAAa,EAEb,eAAe,GAChB,MAAM,eAAe,CAAC;AAOvB,MAAM,OAAO,GAAiC;IAC5C,WAAW;QACT,OAAO,CAAC,WAAW,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC;YACnC,OAAO,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC,CAAC;IACJ,CAAC;IACD,QAAQ;QACN,OAAO,CAAC,WAAW,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC;YACnC,OAAO,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,GAC9C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,IAClD,EAAE,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;IACD,SAAS;QACP,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,qBAAqB;QACnB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;IAC3D,CAAC;IACD,sBAAsB;QACpB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;IAC3D,CAAC;IACD,eAAe,CAAC,EAAE,KAAK,EAAE;QACvB,OAAO,CAAC,WAAW,EAAE,EAAE;YACrB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,CAAC,CAAC;IACJ,CAAC;IACD,iBAAiB;QACf,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAC7B,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,WAAW;QACT,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IACD,kBAAkB,CAAC,EAAE,MAAM,EAAE;QAC3B,OAAO,CAAC,WAAW,EAAE,EAAE;YACrB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,CAAC,CAAC;IACJ,CAAC;IACD,SAAS;QACP,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;IACtD,CAAC;IACD,eAAe;QACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IACD,mBAAmB,CAAC,EAAE,MAAM,EAAE;QAC5B,OAAO,CAAC,WAAW,EAAE,EAAE;YACrB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,CAAC,CAAC;IACJ,CAAC;IACD,gBAAgB;QACd,MAAM,IAAI,gBAAgB,CACxB,sFAAsF,EACtF;YACE,IAAI,EAAE,8BAA8B;YACpC,GAAG,EAAE,wEAAwE;YAC7E,WAAW,EAAE,CAAC,8BAA8B,CAAC;SAC9C,CACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,MAAM,IAAI,gBAAgB,CACxB,kFAAkF,EAClF;YACE,IAAI,EAAE,8BAA8B;YACpC,GAAG,EAAE,wEAAwE;YAC7E,WAAW,EAAE,CAAC,8BAA8B,CAAC;SAC9C,CACF,CAAC;IACJ,CAAC;IACD,oBAAoB;QAClB,MAAM,IAAI,gBAAgB,CACxB,0FAA0F,EAC1F;YACE,IAAI,EAAE,8BAA8B;YACpC,GAAG,EAAE,wEAAwE;YAC7E,WAAW,EAAE,CAAC,8BAA8B,CAAC;SAC9C,CACF,CAAC;IACJ,CAAC;IACD,oBAAoB;QAClB,MAAM,IAAI,gBAAgB,CACxB,0FAA0F,EAC1F;YACE,IAAI,EAAE,8BAA8B;YACpC,GAAG,EAAE,wEAAwE;YAC7E,WAAW,EAAE,CAAC,8BAA8B,CAAC;SAC9C,CACF,CAAC;IACJ,CAAC;IACD,aAAa;QACX,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC1D,CAAC;IACD,oBAAoB;QAClB,MAAM,IAAI,gBAAgB,CACxB,0FAA0F,EAC1F;YACE,IAAI,EAAE,8BAA8B;YACpC,GAAG,EAAE,wEAAwE;YAC7E,WAAW,EAAE,CAAC,8BAA8B,CAAC;SAC9C,CACF,CAAC;IACJ,CAAC;IACD,QAAQ,CAAC,IAAiD;QACxD,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAC7B,IAAI,CAAC,OAAO;aACT,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;aACnE,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,UAAgC;IAEhC,OAAO,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ValidationFn } from '@thymian/core';
2
+ import { type HttpFilterExpression, type HttpRequest, type HttpResponse } from '@thymian/core';
3
+ export declare function httpFilterToTransactionValidationFn(filterExpression: HttpFilterExpression): ValidationFn<[HttpRequest, HttpResponse]>;
4
+ //# sourceMappingURL=http-filter-to-transaction-validation-fn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-transaction-validation-fn.d.ts","sourceRoot":"","sources":["../../src/visitors/http-filter-to-transaction-validation-fn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAKL,KAAK,oBAAoB,EAEzB,KAAK,WAAW,EAChB,KAAK,YAAY,EAIlB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,mCAAmC,CACjD,gBAAgB,EAAE,oBAAoB,GACrC,YAAY,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAK3C"}
@@ -0,0 +1,126 @@
1
+ import { createFilterVisitor, createRegExpFromOriginWildcard, equalsIgnoreCase, getContentType, queryParamsFromRequest, thymianRequestToOrigin, visitHttpFilter, } from '@thymian/core';
2
+ export function httpFilterToTransactionValidationFn(filterExpression) {
3
+ return visitHttpFilter(filterExpression, createTransactionValidationVisitor());
4
+ }
5
+ function createTransactionValidationVisitor() {
6
+ return createFilterVisitor({
7
+ visitMethod(expr) {
8
+ if (typeof expr.method === 'undefined') {
9
+ return () => false;
10
+ }
11
+ return (req) => req.method === expr.method;
12
+ },
13
+ visitRequestHeader(expr) {
14
+ return (req) => {
15
+ if (!req.headers || !expr.header) {
16
+ return false;
17
+ }
18
+ const headerValue = req.headers[expr.header];
19
+ if (typeof expr.value === 'undefined') {
20
+ return headerValue !== undefined;
21
+ }
22
+ return headerValue === expr.value;
23
+ };
24
+ },
25
+ visitQueryParam({ param, value }) {
26
+ if (typeof param === 'undefined') {
27
+ return () => false;
28
+ }
29
+ return (req) => {
30
+ const queryParams = queryParamsFromRequest(req);
31
+ const paramValue = queryParams[param];
32
+ if (typeof value === 'undefined') {
33
+ return paramValue !== undefined;
34
+ }
35
+ return paramValue === value;
36
+ };
37
+ },
38
+ visitPath(expr) {
39
+ return (req) => req.path === expr.path;
40
+ },
41
+ visitHasResponse(expr) {
42
+ return (req, res) => {
43
+ const fn = httpFilterToTransactionValidationFn(expr.filter);
44
+ return !!fn(req, res);
45
+ };
46
+ },
47
+ visitOrigin(expr) {
48
+ return (req) => {
49
+ return req.origin === expr.origin;
50
+ };
51
+ },
52
+ visitHasBody(expr) {
53
+ return (req) => {
54
+ const hasBody = req.body !== undefined && req.body !== null;
55
+ return hasBody === (expr.hasBody ?? true);
56
+ };
57
+ },
58
+ visitPort(expr) {
59
+ return (req) => new URL(req.path, req.origin).port === expr.port?.toString();
60
+ },
61
+ visitRequestMediaType(expr) {
62
+ return (req) => {
63
+ const contentType = getContentType(req.headers);
64
+ return equalsIgnoreCase(contentType, expr.mediaType ?? '');
65
+ };
66
+ },
67
+ visitUrl(expr) {
68
+ return (req) => {
69
+ const url = new URL(req.path, req.origin).toString();
70
+ return url === expr.url;
71
+ };
72
+ },
73
+ visitStatusCode(expr) {
74
+ return (_req, res) => res.statusCode === expr.code;
75
+ },
76
+ visitHasResponseBody(expr) {
77
+ return (_req, res) => {
78
+ const hasBody = res.body !== undefined && res.body !== null;
79
+ return hasBody === (expr.hasBody ?? true);
80
+ };
81
+ },
82
+ visitResponseHeader({ header, value }) {
83
+ if (typeof header === 'undefined') {
84
+ return () => false;
85
+ }
86
+ return (_req, res) => {
87
+ const headerValue = res.headers[header];
88
+ if (typeof value === 'undefined') {
89
+ return headerValue !== undefined;
90
+ }
91
+ return headerValue === value;
92
+ };
93
+ },
94
+ visitStatusCodeRange(expr) {
95
+ return (_req, res) => Number.isInteger(res.statusCode) &&
96
+ res.statusCode >= expr.start &&
97
+ res.statusCode <= expr.end;
98
+ },
99
+ visitResponseMediaType({ mediaType }) {
100
+ return (_req, res) => {
101
+ const contentType = res.headers['content-type'];
102
+ return contentType?.includes(mediaType ?? '') ?? false;
103
+ };
104
+ },
105
+ visitResponseTrailer({ trailer, value }) {
106
+ if (typeof trailer === 'undefined') {
107
+ return () => false;
108
+ }
109
+ return (_req, res) => {
110
+ const trailerValue = res.trailers?.[trailer];
111
+ if (typeof value === 'undefined') {
112
+ return trailerValue !== undefined;
113
+ }
114
+ return trailerValue === value;
115
+ };
116
+ },
117
+ visitMatchesOrigin({ origin }) {
118
+ if (typeof origin !== 'string') {
119
+ return () => false;
120
+ }
121
+ const regExp = createRegExpFromOriginWildcard(origin);
122
+ return (transaction) => regExp.test(thymianRequestToOrigin(transaction.thymianReq));
123
+ },
124
+ });
125
+ }
126
+ //# sourceMappingURL=http-filter-to-transaction-validation-fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-filter-to-transaction-validation-fn.js","sourceRoot":"","sources":["../../src/visitors/http-filter-to-transaction-validation-fn.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,gBAAgB,EAChB,cAAc,EAKd,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,mCAAmC,CACjD,gBAAsC;IAEtC,OAAO,eAAe,CACpB,gBAAgB,EAChB,kCAAkC,EAAE,CACQ,CAAC;AACjD,CAAC;AAED,SAAS,kCAAkC;IAGzC,OAAO,mBAAmB,CAAC;QACzB,WAAW,CAAC,IAAI;YACd,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,GAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;QAC1D,CAAC;QACD,kBAAkB,CAAC,IAAI;YACrB,OAAO,CAAC,GAAgB,EAAE,EAAE;gBAC1B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjC,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;oBACtC,OAAO,WAAW,KAAK,SAAS,CAAC;gBACnC,CAAC;gBACD,OAAO,WAAW,KAAK,IAAI,CAAC,KAAK,CAAC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;YAC9B,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;gBACjC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,GAAgB,EAAE,EAAE;gBAC1B,MAAM,WAAW,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAEhD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;oBACjC,OAAO,UAAU,KAAK,SAAS,CAAC;gBAClC,CAAC;gBACD,OAAO,UAAU,KAAK,KAAK,CAAC;YAC9B,CAAC,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,IAAI;YACZ,OAAO,CAAC,GAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;QACtD,CAAC;QACD,gBAAgB,CAAC,IAAI;YACnB,OAAO,CAAC,GAAgB,EAAE,GAAiB,EAAE,EAAE;gBAC7C,MAAM,EAAE,GAAG,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5D,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACxB,CAAC,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,IAAI;YACd,OAAO,CAAC,GAAgB,EAAE,EAAE;gBAC1B,OAAO,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;YACpC,CAAC,CAAC;QACJ,CAAC;QACD,YAAY,CAAC,IAAI;YACf,OAAO,CAAC,GAAgB,EAAE,EAAE;gBAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;gBAC5D,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;YAC5C,CAAC,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,IAAI;YACZ,OAAO,CAAC,GAAgB,EAAE,EAAE,CAC1B,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QACjE,CAAC;QACD,qBAAqB,CAAC,IAAI;YACxB,OAAO,CAAC,GAAgB,EAAE,EAAE;gBAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAChD,OAAO,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,IAAI;YACX,OAAO,CAAC,GAAgB,EAAE,EAAE;gBAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACrD,OAAO,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,IAAI;YAClB,OAAO,CAAC,IAAiB,EAAE,GAAiB,EAAE,EAAE,CAC9C,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC;QACjC,CAAC;QACD,oBAAoB,CAAC,IAAI;YACvB,OAAO,CAAC,IAAiB,EAAE,GAAiB,EAAE,EAAE;gBAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;gBAC5D,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;YAC5C,CAAC,CAAC;QACJ,CAAC;QACD,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE;YACnC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,IAAiB,EAAE,GAAiB,EAAE,EAAE;gBAC9C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxC,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;oBACjC,OAAO,WAAW,KAAK,SAAS,CAAC;gBACnC,CAAC;gBACD,OAAO,WAAW,KAAK,KAAK,CAAC;YAC/B,CAAC,CAAC;QACJ,CAAC;QACD,oBAAoB,CAAC,IAAI;YACvB,OAAO,CAAC,IAAiB,EAAE,GAAiB,EAAE,EAAE,CAC9C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;gBAChC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK;gBAC5B,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC;QAC/B,CAAC;QACD,sBAAsB,CAAC,EAAE,SAAS,EAAE;YAClC,OAAO,CAAC,IAAiB,EAAE,GAAiB,EAAE,EAAE;gBAC9C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAChD,OAAO,WAAW,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;YACzD,CAAC,CAAC;QACJ,CAAC;QACD,oBAAoB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;YACrC,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,IAAiB,EAAE,GAAiB,EAAE,EAAE;gBAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC7C,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;oBACjC,OAAO,YAAY,KAAK,SAAS,CAAC;gBACpC,CAAC;gBACD,OAAO,YAAY,KAAK,KAAK,CAAC;YAChC,CAAC,CAAC;QACJ,CAAC;QACD,kBAAkB,CAAC,EAAE,MAAM,EAAE;YAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;YACrB,CAAC;YAED,MAAM,MAAM,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC;YAEtD,OAAO,CAAC,WAAW,EAAE,EAAE,CACrB,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QAChE,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@thymian/plugin-http-tester",
3
+ "version": "0.1.0",
4
+ "license": "AGPL-3.0-only",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "type": "module",
12
+ "exports": {
13
+ "./package.json": "./package.json",
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "!**/*.tsbuildinfo"
23
+ ],
24
+ "dependencies": {
25
+ "@thymian/core": "0.1.0",
26
+ "rxjs": "^7.8.2",
27
+ "tslib": "^2.3.0"
28
+ },
29
+ "devDependencies": {
30
+ "@thymian/core-testing": "0.1.0"
31
+ }
32
+ }