@thymian/plugin-openapi 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.
- package/README.md +11 -0
- package/dist/cli/commands/openapi/info.d.ts +10 -0
- package/dist/cli/commands/openapi/info.d.ts.map +1 -0
- package/dist/cli/commands/openapi/info.js +35 -0
- package/dist/cli/commands/openapi/info.js.map +1 -0
- package/dist/cli/commands/openapi/load.d.ts +10 -0
- package/dist/cli/commands/openapi/load.d.ts.map +1 -0
- package/dist/cli/commands/openapi/load.js +32 -0
- package/dist/cli/commands/openapi/load.js.map +1 -0
- package/dist/cli/commands/openapi/validate.d.ts +10 -0
- package/dist/cli/commands/openapi/validate.d.ts.map +1 -0
- package/dist/cli/commands/openapi/validate.js +28 -0
- package/dist/cli/commands/openapi/validate.js.map +1 -0
- package/dist/cli/init-hook.d.ts +5 -0
- package/dist/cli/init-hook.d.ts.map +1 -0
- package/dist/cli/init-hook.js +55 -0
- package/dist/cli/init-hook.js.map +1 -0
- package/dist/cli/spec-search-hook.d.ts +4 -0
- package/dist/cli/spec-search-hook.d.ts.map +1 -0
- package/dist/cli/spec-search-hook.js +11 -0
- package/dist/cli/spec-search-hook.js.map +1 -0
- package/dist/error.d.ts +4 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +4 -0
- package/dist/error.js.map +1 -0
- package/dist/http-filter-expression-to-operation-filter.d.ts +14 -0
- package/dist/http-filter-expression-to-operation-filter.d.ts.map +1 -0
- package/dist/http-filter-expression-to-operation-filter.js +221 -0
- package/dist/http-filter-expression-to-operation-filter.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/load-openapi.d.ts +27 -0
- package/dist/load-openapi.d.ts.map +1 -0
- package/dist/load-openapi.js +76 -0
- package/dist/load-openapi.js.map +1 -0
- package/dist/loc-mapper/json-loc-mapper.d.ts +15 -0
- package/dist/loc-mapper/json-loc-mapper.d.ts.map +1 -0
- package/dist/loc-mapper/json-loc-mapper.js +105 -0
- package/dist/loc-mapper/json-loc-mapper.js.map +1 -0
- package/dist/loc-mapper/loc-mapper-for-file.d.ts +4 -0
- package/dist/loc-mapper/loc-mapper-for-file.d.ts.map +1 -0
- package/dist/loc-mapper/loc-mapper-for-file.js +20 -0
- package/dist/loc-mapper/loc-mapper-for-file.js.map +1 -0
- package/dist/loc-mapper/loc-mapper.d.ts +9 -0
- package/dist/loc-mapper/loc-mapper.d.ts.map +1 -0
- package/dist/loc-mapper/loc-mapper.js +22 -0
- package/dist/loc-mapper/loc-mapper.js.map +1 -0
- package/dist/loc-mapper/noop-loc-mapper.d.ts +6 -0
- package/dist/loc-mapper/noop-loc-mapper.d.ts.map +1 -0
- package/dist/loc-mapper/noop-loc-mapper.js +10 -0
- package/dist/loc-mapper/noop-loc-mapper.js.map +1 -0
- package/dist/loc-mapper/yaml-loc-mapper.d.ts +13 -0
- package/dist/loc-mapper/yaml-loc-mapper.d.ts.map +1 -0
- package/dist/loc-mapper/yaml-loc-mapper.js +105 -0
- package/dist/loc-mapper/yaml-loc-mapper.js.map +1 -0
- package/dist/processors/extract-server-info.d.ts +10 -0
- package/dist/processors/extract-server-info.d.ts.map +1 -0
- package/dist/processors/extract-server-info.js +40 -0
- package/dist/processors/extract-server-info.js.map +1 -0
- package/dist/processors/headers-object.processor.d.ts +4 -0
- package/dist/processors/headers-object.processor.d.ts.map +1 -0
- package/dist/processors/headers-object.processor.js +20 -0
- package/dist/processors/headers-object.processor.js.map +1 -0
- package/dist/processors/json-schema.processor.d.ts +19 -0
- package/dist/processors/json-schema.processor.d.ts.map +1 -0
- package/dist/processors/json-schema.processor.js +40 -0
- package/dist/processors/json-schema.processor.js.map +1 -0
- package/dist/processors/link-object.processor.d.ts +5 -0
- package/dist/processors/link-object.processor.d.ts.map +1 -0
- package/dist/processors/link-object.processor.js +58 -0
- package/dist/processors/link-object.processor.js.map +1 -0
- package/dist/processors/media-type-object.processor.d.ts +9 -0
- package/dist/processors/media-type-object.processor.d.ts.map +1 -0
- package/dist/processors/media-type-object.processor.js +43 -0
- package/dist/processors/media-type-object.processor.js.map +1 -0
- package/dist/processors/openapi.processor.d.ts +27 -0
- package/dist/processors/openapi.processor.d.ts.map +1 -0
- package/dist/processors/openapi.processor.js +166 -0
- package/dist/processors/openapi.processor.js.map +1 -0
- package/dist/processors/parameter-object.processor.d.ts +6 -0
- package/dist/processors/parameter-object.processor.d.ts.map +1 -0
- package/dist/processors/parameter-object.processor.js +90 -0
- package/dist/processors/parameter-object.processor.js.map +1 -0
- package/dist/processors/request-body-object.processor.d.ts +14 -0
- package/dist/processors/request-body-object.processor.d.ts.map +1 -0
- package/dist/processors/request-body-object.processor.js +61 -0
- package/dist/processors/request-body-object.processor.js.map +1 -0
- package/dist/processors/response-object.processor.d.ts +12 -0
- package/dist/processors/response-object.processor.d.ts.map +1 -0
- package/dist/processors/response-object.processor.js +44 -0
- package/dist/processors/response-object.processor.js.map +1 -0
- package/dist/processors/responses-object.processor.d.ts +5 -0
- package/dist/processors/responses-object.processor.d.ts.map +1 -0
- package/dist/processors/responses-object.processor.js +27 -0
- package/dist/processors/responses-object.processor.js.map +1 -0
- package/dist/processors/runtime-expression.processor.d.ts +4 -0
- package/dist/processors/runtime-expression.processor.d.ts.map +1 -0
- package/dist/processors/runtime-expression.processor.js +24 -0
- package/dist/processors/runtime-expression.processor.js.map +1 -0
- package/dist/processors/security-scheme-object.processor.d.ts +4 -0
- package/dist/processors/security-scheme-object.processor.d.ts.map +1 -0
- package/dist/processors/security-scheme-object.processor.js +50 -0
- package/dist/processors/security-scheme-object.processor.js.map +1 -0
- package/dist/processors/utils.d.ts +9 -0
- package/dist/processors/utils.d.ts.map +1 -0
- package/dist/processors/utils.js +21 -0
- package/dist/processors/utils.js.map +1 -0
- package/dist/runtime-expression.d.ts +8 -0
- package/dist/runtime-expression.d.ts.map +1 -0
- package/dist/runtime-expression.js +2 -0
- package/dist/runtime-expression.js.map +1 -0
- package/dist/search-for-openapi-files.d.ts +8 -0
- package/dist/search-for-openapi-files.d.ts.map +1 -0
- package/dist/search-for-openapi-files.js +44 -0
- package/dist/search-for-openapi-files.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Thymian
|
|
2
|
+
|
|
3
|
+
Add resilience and HTTP conformance to your API development workflow. Thymian is a lightweight, language-agnostic library that helps you build robust APIs.
|
|
4
|
+
|
|
5
|
+
## @thymian/openapi
|
|
6
|
+
|
|
7
|
+
OpenAPI document parsing and validation utilities.
|
|
8
|
+
|
|
9
|
+
## Documentation
|
|
10
|
+
|
|
11
|
+
For comprehensive documentation, visit [Thymian Documentation](https://thymian.dev/).
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCliRunCommand } from '@thymian/common-cli';
|
|
2
|
+
export default class Info extends BaseCliRunCommand<typeof Info> {
|
|
3
|
+
static args: {
|
|
4
|
+
content: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/openapi/info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMxD,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,iBAAiB,CAAC,OAAO,IAAI,CAAC;IAC9D,OAAgB,IAAI;;MAMlB;IACF,OAAgB,WAAW,SAC8C;IACzE,OAAgB,QAAQ,WAEtB;IAEa,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBpC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { validate } from '@scalar/openapi-parser';
|
|
2
|
+
import { BaseCliRunCommand } from '@thymian/common-cli';
|
|
3
|
+
import { Args } from '@thymian/common-cli/oclif';
|
|
4
|
+
import { ThymianBaseError } from '@thymian/core';
|
|
5
|
+
import { loadOpenApi } from '../../../load-openapi.js';
|
|
6
|
+
export default class Info extends BaseCliRunCommand {
|
|
7
|
+
static args = {
|
|
8
|
+
content: Args.string({
|
|
9
|
+
description: 'file to read',
|
|
10
|
+
required: true,
|
|
11
|
+
ignoreStdin: false,
|
|
12
|
+
}),
|
|
13
|
+
};
|
|
14
|
+
static description = 'Load and parse the given Swagger/OpenAPI file to the Thymian format.';
|
|
15
|
+
static examples = [
|
|
16
|
+
'<%= config.bin %> <%= command.id %> openapi.yaml',
|
|
17
|
+
];
|
|
18
|
+
async run() {
|
|
19
|
+
const [document] = await loadOpenApi(this.args.content, this.flags.cwd);
|
|
20
|
+
const { valid, version, specification } = await validate(document);
|
|
21
|
+
if (!valid || !specification) {
|
|
22
|
+
throw new ThymianBaseError('Invalid OpenAPI document.', {
|
|
23
|
+
name: 'InvalidOpenAPIDocumentError',
|
|
24
|
+
ref: 'https://thymian.dev/references/errors/invalid-openapi-document-error/',
|
|
25
|
+
suggestions: [
|
|
26
|
+
'Use thymian openapi:validate to validate your OpenAPI document.',
|
|
27
|
+
],
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
this.log(`OpenAPI version: ${version}`);
|
|
31
|
+
this.log(`API Title: ${specification.info.title}`);
|
|
32
|
+
this.log(`API Version: ${specification.info.version}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../../src/cli/commands/openapi/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,iBAA8B;IAC9D,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,KAAK;SACnB,CAAC;KACH,CAAC;IACF,MAAM,CAAU,WAAW,GACzB,sEAAsE,CAAC;IACzE,MAAM,CAAU,QAAQ,GAAG;QACzB,kDAAkD;KACnD,CAAC;IAEO,KAAK,CAAC,GAAG;QAChB,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnE,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7B,MAAM,IAAI,gBAAgB,CAAC,2BAA2B,EAAE;gBACtD,IAAI,EAAE,6BAA6B;gBACnC,GAAG,EAAE,uEAAuE;gBAC5E,WAAW,EAAE;oBACX,iEAAiE;iBAClE;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,cAAc,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,CAAC,gBAAgB,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCliRunCommand } from '@thymian/common-cli';
|
|
2
|
+
export default class Load extends BaseCliRunCommand<typeof Load> {
|
|
3
|
+
static args: {
|
|
4
|
+
content: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/openapi/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMxD,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,iBAAiB,CAAC,OAAO,IAAI,CAAC;IAC9D,OAAgB,IAAI;;MAMlB;IACF,OAAgB,WAAW,SAC8C;IACzE,OAAgB,QAAQ,WAEtB;IAEa,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAepC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BaseCliRunCommand } from '@thymian/common-cli';
|
|
2
|
+
import { Args } from '@thymian/common-cli/oclif';
|
|
3
|
+
import { constant } from '@thymian/core';
|
|
4
|
+
import { loadAndTransform } from '../../../load-openapi.js';
|
|
5
|
+
export default class Load extends BaseCliRunCommand {
|
|
6
|
+
static args = {
|
|
7
|
+
content: Args.string({
|
|
8
|
+
description: 'file to read',
|
|
9
|
+
required: true,
|
|
10
|
+
ignoreStdin: false,
|
|
11
|
+
}),
|
|
12
|
+
};
|
|
13
|
+
static description = 'Load and parse the given Swagger/OpenAPI file to the Thymian format.';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> <%= command.id %> openapi.yaml',
|
|
16
|
+
];
|
|
17
|
+
async run() {
|
|
18
|
+
const [, format] = await loadAndTransform(this.args.content, {
|
|
19
|
+
filter: constant(true),
|
|
20
|
+
cwd: this.flags.cwd,
|
|
21
|
+
logger: this.logger,
|
|
22
|
+
serverInfo: {
|
|
23
|
+
port: 8080,
|
|
24
|
+
host: 'localhost',
|
|
25
|
+
protocol: 'http',
|
|
26
|
+
basePath: '',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
this.log(JSON.stringify(format.export()));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../../../src/cli/commands/openapi/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,iBAA8B;IAC9D,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,KAAK;SACnB,CAAC;KACH,CAAC;IACF,MAAM,CAAU,WAAW,GACzB,sEAAsE,CAAC;IACzE,MAAM,CAAU,QAAQ,GAAG;QACzB,kDAAkD;KACnD,CAAC;IAEO,KAAK,CAAC,GAAG;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAC3D,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC;YACtB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE;gBACV,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,MAAM;gBAChB,QAAQ,EAAE,EAAE;aACb;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCliRunCommand } from '@thymian/common-cli';
|
|
2
|
+
export default class Validate extends BaseCliRunCommand<typeof Validate> {
|
|
3
|
+
static args: {
|
|
4
|
+
file: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static examples: string[];
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/openapi/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,iBAAiB,CAAC,OAAO,QAAQ,CAAC;IACtE,OAAgB,IAAI;;MAElB;IACF,OAAgB,WAAW,SAC8C;IACzE,OAAgB,QAAQ,WAEtB;IAEa,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqBpC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { load, validate } from '@scalar/openapi-parser';
|
|
2
|
+
import { readFiles } from '@scalar/openapi-parser/plugins/read-files';
|
|
3
|
+
import { BaseCliRunCommand } from '@thymian/common-cli';
|
|
4
|
+
import { Args } from '@thymian/common-cli/oclif';
|
|
5
|
+
export default class Validate extends BaseCliRunCommand {
|
|
6
|
+
static args = {
|
|
7
|
+
file: Args.string({ description: 'file to read', required: true }),
|
|
8
|
+
};
|
|
9
|
+
static description = 'Load and parse the given Swagger/OpenAPI file to the Thymian format.';
|
|
10
|
+
static examples = [
|
|
11
|
+
'<%= config.bin %> <%= command.id %> openapi.yaml',
|
|
12
|
+
];
|
|
13
|
+
async run() {
|
|
14
|
+
const filesystem = (await load(this.args.file, { plugins: [readFiles()], throwOnError: true })).filesystem;
|
|
15
|
+
const result = await validate(filesystem);
|
|
16
|
+
if (!result.valid) {
|
|
17
|
+
if (result.errors) {
|
|
18
|
+
this.log('\u274C Invalid Swagger/OpenAPI file with errors:');
|
|
19
|
+
console.group();
|
|
20
|
+
result.errors.forEach((e) => this.log(`* ${e.message}${'path' in e ? ` (at "${e.path}")` : ''}`));
|
|
21
|
+
console.groupEnd();
|
|
22
|
+
}
|
|
23
|
+
this.exit(1);
|
|
24
|
+
}
|
|
25
|
+
this.log('\u2705 Valid Swagger/OpenAPI file.');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/cli/commands/openapi/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,iBAAkC;IACtE,MAAM,CAAU,IAAI,GAAG;QACrB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KACnE,CAAC;IACF,MAAM,CAAU,WAAW,GACzB,sEAAsE,CAAC;IACzE,MAAM,CAAU,QAAQ,GAAG;QACzB,kDAAkD;KACnD,CAAC;IAEO,KAAK,CAAC,GAAG;QAChB,MAAM,UAAU,GAAG,CACjB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAC3E,CAAC,UAAU,CAAC;QAEb,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,IAAI,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACpE,CAAC;gBACF,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-hook.d.ts","sourceRoot":"","sources":["../../src/cli/init-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGvE,QAAA,MAAM,IAAI,EAAE,qBAAqB,CAAC,oBAAoB,CA0DrD,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { checkbox, confirm, runPrompts } from '@thymian/common-cli/prompts';
|
|
2
|
+
import { openApiPlugin } from '../index.js';
|
|
3
|
+
import { searchForOpenApiFiles } from '../search-for-openapi-files.js';
|
|
4
|
+
const hook = async function (opts) {
|
|
5
|
+
if (opts.interactive) {
|
|
6
|
+
return runPrompts(async () => {
|
|
7
|
+
const options = {
|
|
8
|
+
descriptions: [],
|
|
9
|
+
};
|
|
10
|
+
const result = {
|
|
11
|
+
include: true,
|
|
12
|
+
configuration: {
|
|
13
|
+
options,
|
|
14
|
+
},
|
|
15
|
+
pluginName: openApiPlugin.name,
|
|
16
|
+
};
|
|
17
|
+
const shouldInclude = await confirm({
|
|
18
|
+
message: `Do you want to include plugin ${openApiPlugin.name}?`,
|
|
19
|
+
});
|
|
20
|
+
if (!shouldInclude) {
|
|
21
|
+
return {
|
|
22
|
+
pluginName: openApiPlugin.name,
|
|
23
|
+
configuration: {},
|
|
24
|
+
include: false,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const matches = await searchForOpenApiFiles(opts.cwd);
|
|
28
|
+
if (matches.length > 0) {
|
|
29
|
+
const choices = await checkbox({
|
|
30
|
+
message: 'Which Swagger/OpenAPI file should be processed?',
|
|
31
|
+
choices: matches.map((name) => ({ name, value: name })),
|
|
32
|
+
});
|
|
33
|
+
options.descriptions = choices.map((c) => ({ source: c }));
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const matches = await searchForOpenApiFiles(opts.cwd);
|
|
40
|
+
const descriptions = matches.map((match) => ({
|
|
41
|
+
source: match,
|
|
42
|
+
}));
|
|
43
|
+
return {
|
|
44
|
+
include: true,
|
|
45
|
+
pluginName: openApiPlugin.name,
|
|
46
|
+
configuration: {
|
|
47
|
+
options: {
|
|
48
|
+
descriptions,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export default hook;
|
|
55
|
+
//# sourceMappingURL=init-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-hook.js","sourceRoot":"","sources":["../../src/cli/init-hook.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE5E,OAAO,EAAE,aAAa,EAA6B,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,IAAI,GAAgD,KAAK,WAC7D,IAAI;IAEJ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,OAAO,GAAG;gBACd,YAAY,EAAE,EAA0B;aACV,CAAC;YAEjC,MAAM,MAAM,GAAkD;gBAC5D,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE;oBACb,OAAO;iBACR;gBACD,UAAU,EAAE,aAAa,CAAC,IAAI;aAC/B,CAAC;YAEF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;gBAClC,OAAO,EAAE,iCAAiC,aAAa,CAAC,IAAI,GAAG;aAChE,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;oBACL,UAAU,EAAE,aAAa,CAAC,IAAI;oBAC9B,aAAa,EAAE,EAAE;oBACjB,OAAO,EAAE,KAAK;iBACf,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;oBAC7B,OAAO,EAAE,iDAAiD;oBAC1D,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxD,CAAC,CAAC;gBAEH,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,EAAE,KAAK;SACd,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,aAAa,CAAC,IAAI;YAC9B,aAAa,EAAE;gBACb,OAAO,EAAE;oBACP,YAAY;iBACb;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-search-hook.d.ts","sourceRoot":"","sources":["../../src/cli/spec-search-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAKjE,QAAA,MAAM,IAAI,EAAE,qBAOX,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { openApiPlugin } from '../index.js';
|
|
2
|
+
import { searchForOpenApiFiles } from '../search-for-openapi-files.js';
|
|
3
|
+
const hook = async function (opts) {
|
|
4
|
+
const files = await searchForOpenApiFiles(opts.cwd);
|
|
5
|
+
return {
|
|
6
|
+
pluginName: openApiPlugin.name,
|
|
7
|
+
specifications: files.map((file) => ({ type: 'openapi', location: file })),
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export default hook;
|
|
11
|
+
//# sourceMappingURL=spec-search-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-search-hook.js","sourceRoot":"","sources":["../../src/cli/spec-search-hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,IAAI,GAA0B,KAAK,WAAW,IAAI;IACtD,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpD,OAAO;QACL,UAAU,EAAE,aAAa,CAAC,IAAI;QAC9B,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;KAC3E,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
package/dist/error.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,qBAAa,YAAa,SAAQ,gBAAgB;CAAG"}
|
package/dist/error.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,OAAO,YAAa,SAAQ,gBAAgB;CAAG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HttpFilterExpression } from '@thymian/core';
|
|
2
|
+
import type { OpenAPIV3_1 as OpenApiV31 } from 'openapi-types';
|
|
3
|
+
import type { ServerInfo } from './processors/extract-server-info.js';
|
|
4
|
+
import type { Parameters } from './processors/utils.js';
|
|
5
|
+
export type OperationObjectFilterFn = (args: {
|
|
6
|
+
operationObject: OpenApiV31.OperationObject;
|
|
7
|
+
params: Parameters;
|
|
8
|
+
method: string;
|
|
9
|
+
path: string;
|
|
10
|
+
serverInfo: ServerInfo;
|
|
11
|
+
document: OpenApiV31.Document;
|
|
12
|
+
}) => boolean;
|
|
13
|
+
export declare function httpFilterExpressionToOperationFilter(expression: HttpFilterExpression): OperationObjectFilterFn;
|
|
14
|
+
//# sourceMappingURL=http-filter-expression-to-operation-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-filter-expression-to-operation-filter.d.ts","sourceRoot":"","sources":["../src/http-filter-expression-to-operation-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAM1D,OAAO,KAAK,EAAE,WAAW,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE;IAC3C,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC;IAC5C,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;CAC/B,KAAK,OAAO,CAAC;AAyRd,wBAAgB,qCAAqC,CACnD,UAAU,EAAE,oBAAoB,GAC/B,uBAAuB,CAEzB"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { createFilterVisitor, equalsIgnoreCase, visitHttpFilter, } from '@thymian/core';
|
|
2
|
+
function joinUrls(baseUrl, path) {
|
|
3
|
+
return (baseUrl + path).replace(/\/\//g, '/');
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Helper to check if params contain a specific query parameter
|
|
7
|
+
*/
|
|
8
|
+
function hasQueryParam(params, param) {
|
|
9
|
+
return Object.keys(params.queryParameters).some((p) => equalsIgnoreCase(p, param));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Helper to check if params contain a specific request header
|
|
13
|
+
*/
|
|
14
|
+
function hasRequestHeader(params, header) {
|
|
15
|
+
return Object.keys(params.headers).some((h) => equalsIgnoreCase(h, header));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Helper to check if operation has response with specific status code
|
|
19
|
+
*/
|
|
20
|
+
function hasResponseWithStatusCode(operationObject, code) {
|
|
21
|
+
if (!operationObject.responses) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return Object.keys(operationObject.responses).some((statusCode) => {
|
|
25
|
+
// Handle 'default' or numeric status codes
|
|
26
|
+
if (statusCode === 'default') {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return parseInt(statusCode, 10) === code;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Helper to check if operation has response in status code range
|
|
34
|
+
*/
|
|
35
|
+
function hasResponseInStatusCodeRange(operationObject, start, end) {
|
|
36
|
+
if (!operationObject.responses) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return Object.keys(operationObject.responses).some((statusCode) => {
|
|
40
|
+
if (statusCode === 'default') {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const code = parseInt(statusCode, 10);
|
|
44
|
+
return Number.isInteger(code) && code >= start && code <= end;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Helper to check if operation has request body
|
|
49
|
+
*/
|
|
50
|
+
function hasRequestBody(operationObject) {
|
|
51
|
+
return !!operationObject.requestBody;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Helper to check if operation has request with specific media type
|
|
55
|
+
*/
|
|
56
|
+
function hasRequestMediaType(operationObject, mediaType) {
|
|
57
|
+
if (!operationObject.requestBody) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if ('$ref' in operationObject.requestBody) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const content = operationObject.requestBody.content;
|
|
64
|
+
if (!content) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return Object.keys(content).some((mt) => equalsIgnoreCase(mt, mediaType));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Helper to check if operation has response with specific media type
|
|
71
|
+
*/
|
|
72
|
+
function hasResponseMediaType(operationObject, mediaType) {
|
|
73
|
+
if (!operationObject.responses) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return Object.values(operationObject.responses).some((response) => {
|
|
77
|
+
if ('$ref' in response) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (!response.content) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return Object.keys(response.content).some((mt) => equalsIgnoreCase(mt, mediaType));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Helper to check if operation has response header
|
|
88
|
+
*/
|
|
89
|
+
function hasResponseHeader(operationObject, header) {
|
|
90
|
+
if (!operationObject.responses) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return Object.values(operationObject.responses).some((response) => {
|
|
94
|
+
if ('$ref' in response) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
if (!response.headers) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
return Object.keys(response.headers).some((h) => equalsIgnoreCase(h, header));
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Helper to check if operation has response body
|
|
105
|
+
*/
|
|
106
|
+
function hasResponseBody(operationObject) {
|
|
107
|
+
if (!operationObject.responses) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
return Object.values(operationObject.responses).some((response) => {
|
|
111
|
+
if ('$ref' in response) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
return !!response.content && Object.keys(response.content).length > 0;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Helper to check if operation is secured (has security requirement)
|
|
119
|
+
*/
|
|
120
|
+
function isOperationSecured(operationObject, document) {
|
|
121
|
+
// Check operation-level security
|
|
122
|
+
if (operationObject.security) {
|
|
123
|
+
return operationObject.security.length > 0;
|
|
124
|
+
}
|
|
125
|
+
// Check document-level security
|
|
126
|
+
if (document.security) {
|
|
127
|
+
return document.security.length > 0;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
const visitor = createFilterVisitor({
|
|
132
|
+
visitMethod({ method }) {
|
|
133
|
+
if (typeof method === 'undefined') {
|
|
134
|
+
return () => false;
|
|
135
|
+
}
|
|
136
|
+
return ({ method: m }) => equalsIgnoreCase(m, method);
|
|
137
|
+
},
|
|
138
|
+
visitRequestHeader({ header }) {
|
|
139
|
+
if (typeof header === 'undefined') {
|
|
140
|
+
return () => false;
|
|
141
|
+
}
|
|
142
|
+
return ({ params }) => hasRequestHeader(params, header);
|
|
143
|
+
},
|
|
144
|
+
visitQueryParam({ param }) {
|
|
145
|
+
if (typeof param === 'undefined') {
|
|
146
|
+
return () => false;
|
|
147
|
+
}
|
|
148
|
+
return ({ params }) => hasQueryParam(params, param);
|
|
149
|
+
},
|
|
150
|
+
visitPath({ path }) {
|
|
151
|
+
if (typeof path === 'undefined') {
|
|
152
|
+
return () => false;
|
|
153
|
+
}
|
|
154
|
+
return ({ path: p, serverInfo }) => joinUrls(serverInfo.basePath, p).endsWith(path);
|
|
155
|
+
},
|
|
156
|
+
visitHasResponse({ filter }) {
|
|
157
|
+
const nestedFilter = httpFilterExpressionToOperationFilter(filter);
|
|
158
|
+
return (args) => nestedFilter(args);
|
|
159
|
+
},
|
|
160
|
+
visitIsAuthorized({ isAuthorized }) {
|
|
161
|
+
return ({ operationObject, document }) => isOperationSecured(operationObject, document) === isAuthorized;
|
|
162
|
+
},
|
|
163
|
+
visitOrigin({ origin }) {
|
|
164
|
+
return ({ serverInfo }) => {
|
|
165
|
+
return (`${serverInfo.protocol}://${serverInfo.host}:${serverInfo.port}` ===
|
|
166
|
+
origin);
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
visitHasBody({ hasBody }) {
|
|
170
|
+
return ({ operationObject }) => hasRequestBody(operationObject) === hasBody;
|
|
171
|
+
},
|
|
172
|
+
visitPort({ port }) {
|
|
173
|
+
return ({ serverInfo }) => serverInfo.port === port;
|
|
174
|
+
},
|
|
175
|
+
visitRequestMediaType({ mediaType }) {
|
|
176
|
+
if (typeof mediaType === 'undefined') {
|
|
177
|
+
return () => false;
|
|
178
|
+
}
|
|
179
|
+
return ({ operationObject }) => hasRequestMediaType(operationObject, mediaType);
|
|
180
|
+
},
|
|
181
|
+
visitUrl({ url }) {
|
|
182
|
+
return ({ serverInfo, path }) => {
|
|
183
|
+
const fullUrl = `${serverInfo.protocol}://${serverInfo.host}:${serverInfo.port}${path.startsWith('/') ? path : '/' + path}`;
|
|
184
|
+
return fullUrl === url;
|
|
185
|
+
};
|
|
186
|
+
},
|
|
187
|
+
visitProtocol({ protocol }) {
|
|
188
|
+
return ({ serverInfo }) => serverInfo.protocol === protocol;
|
|
189
|
+
},
|
|
190
|
+
visitStatusCode({ code }) {
|
|
191
|
+
if (typeof code === 'undefined') {
|
|
192
|
+
return () => false;
|
|
193
|
+
}
|
|
194
|
+
return ({ operationObject }) => hasResponseWithStatusCode(operationObject, code);
|
|
195
|
+
},
|
|
196
|
+
visitHasResponseBody({ hasBody }) {
|
|
197
|
+
return ({ operationObject }) => hasResponseBody(operationObject) === hasBody;
|
|
198
|
+
},
|
|
199
|
+
visitResponseHeader({ header }) {
|
|
200
|
+
if (typeof header === 'undefined') {
|
|
201
|
+
return () => false;
|
|
202
|
+
}
|
|
203
|
+
return ({ operationObject }) => hasResponseHeader(operationObject, header);
|
|
204
|
+
},
|
|
205
|
+
visitStatusCodeRange({ start, end }) {
|
|
206
|
+
return ({ operationObject }) => hasResponseInStatusCodeRange(operationObject, start, end);
|
|
207
|
+
},
|
|
208
|
+
visitResponseMediaType({ mediaType }) {
|
|
209
|
+
if (typeof mediaType === 'undefined') {
|
|
210
|
+
return () => false;
|
|
211
|
+
}
|
|
212
|
+
return ({ operationObject }) => hasResponseMediaType(operationObject, mediaType);
|
|
213
|
+
},
|
|
214
|
+
visitResponseTrailer() {
|
|
215
|
+
throw new Error('Response trailers are not currently supported.');
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
export function httpFilterExpressionToOperationFilter(expression) {
|
|
219
|
+
return visitHttpFilter(expression, visitor);
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=http-filter-expression-to-operation-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-filter-expression-to-operation-filter.js","sourceRoot":"","sources":["../src/http-filter-expression-to-operation-filter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type HttpFilterExpression, type SerializedThymianFormat, type ThymianNode, type ThymianPlugin } from '@thymian/core';
|
|
2
|
+
import type { OpenAPI } from 'openapi-types';
|
|
3
|
+
import type { ServerInfo } from './processors/extract-server-info.js';
|
|
4
|
+
declare module '@thymian/core' {
|
|
5
|
+
interface ThymianHttpRequest {
|
|
6
|
+
extensions: {
|
|
7
|
+
openapi: {
|
|
8
|
+
operationId?: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
interface SecurityScheme {
|
|
13
|
+
extensions: {
|
|
14
|
+
openapi: {
|
|
15
|
+
schemeName: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
interface ThymianFormat {
|
|
20
|
+
getNodeByExtension(extensionName: 'openapi', values: {
|
|
21
|
+
operationId: string;
|
|
22
|
+
}): ThymianNode | undefined;
|
|
23
|
+
}
|
|
24
|
+
interface ThymianEvents {
|
|
25
|
+
'openapi.document': {
|
|
26
|
+
document: OpenAPI.Document;
|
|
27
|
+
filePath?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
interface ThymianActions {
|
|
31
|
+
'openapi.transform': {
|
|
32
|
+
event: {
|
|
33
|
+
filter?: HttpFilterExpression;
|
|
34
|
+
content: string;
|
|
35
|
+
};
|
|
36
|
+
response: SerializedThymianFormat;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export type OpenApiPluginOptions = {
|
|
41
|
+
descriptions?: {
|
|
42
|
+
serverInfo?: ServerInfo;
|
|
43
|
+
source: string;
|
|
44
|
+
sourceName?: string;
|
|
45
|
+
}[];
|
|
46
|
+
};
|
|
47
|
+
export declare const defaultServerInfo: ServerInfo;
|
|
48
|
+
export declare const openApiPlugin: ThymianPlugin<OpenApiPluginOptions>;
|
|
49
|
+
export default openApiPlugin;
|
|
50
|
+
export { searchForOpenApiFiles } from './search-for-openapi-files.js';
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAE5B,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEtE,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,kBAAkB;QAC1B,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,WAAW,CAAC,EAAE,MAAM,CAAC;aACtB,CAAC;SACH,CAAC;KACH;IAED,UAAU,cAAc;QACtB,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,UAAU,EAAE,MAAM,CAAC;aACpB,CAAC;SACH,CAAC;KACH;IAED,UAAU,aAAa;QACrB,kBAAkB,CAChB,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,GAC9B,WAAW,GAAG,SAAS,CAAC;KAC5B;IAED,UAAU,aAAa;QACrB,kBAAkB,EAAE;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;KACH;IAED,UAAU,cAAc;QACtB,mBAAmB,EAAE;YACnB,KAAK,EAAE;gBACL,MAAM,CAAC,EAAE,oBAAoB,CAAC;gBAC9B,OAAO,EAAE,MAAM,CAAC;aACjB,CAAC;YACF,QAAQ,EAAE,uBAAuB,CAAC;SACnC,CAAC;KACH;CACF;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE;QACb,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;CACL,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,UAK/B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,oBAAoB,CAoH7D,CAAC;AAEF,eAAe,aAAa,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC"}
|